Фасетная постфильтрация в Solr (перевод с постфильтрации агрегации ElasticSearch)
Допустим, у меня есть такая структура:
{"account_number":171,"balance":7091,
"firstname":"Nelda","lastname":"Hopper",
"age":39,"gender":"M",
"address":"742 Prospect Place","employer":"Equicom",
"email":"neldahopper@equicom.com",
"city":"Finderne","state":"SC"}
(данные поступают отсюда).
Если я напишу следующий запрос в ElasticSearch:
POST /bank/_search?pretty
{
"query":
{ "bool":
{ "must":
[ { "range":
{ "balance": { "gte": 30000 } } } ] }
},
"fields":["gender", "balance", "age"],
"aggs":{
"age_filter":{
"filter":{
"match":{
"age":"30"
}
},
"aggs":{
"gender_stats":{
"terms":{"field":"gender"}
}
}
}
}
}
Я получу (1) 402 результата запроса для основного запроса и (2) агрегацию по 18 результатам, прошедшим фильтр "age:30".
Я пытался сделать аналогичный трюк в Solr 5.1, но я смог получить следующие результаты:
q=balance:[30000%20TO%20*]&facet=true&facet.field=gender&fq=age:30
с большой разницей, что фильтр теперь применяется к основным результатам запроса, поэтому я получаю только 18 результатов, а затем применяю соответствующую фасетку.
Есть ли способ написать запрос Solr, который полностью эквивалентен запросу ElasticSearch? Т.е. получить полные результаты, а затем применить фильтрацию только к агрегации / огранке?
NB: я пробовал исключение по тегу:
q={!ex=tagForAge}balance:[30000%20TO%20*]&facet=true&facet.field=gender&fq={!tag="tagForAge"}age:30
но это не относится к основному запросу.
1 ответ
Попробуйте добавить &facet.query=age:30
на ваш запрос.
Это в основном сгенерирует ваши аспекты из определенного поискового запроса, который в вашем случае age:30
,
Для получения дополнительной информации проверьте здесь.