Аггрегация в ElasticSearch с фильтром
Есть запрос, который возвращает количество документов каждого значения при установленном фильтре (фасет)
GET product/_search
{
"track_total_hits": true,
"sort": [],
"aggs": {
"PROPERTY_1": {
"terms": {
"field": "PROPERTY_1"
}
},
"PROPERTY_2": {
"terms": {
"field": "PROPERTY_2"
}
},
"PROPERTY_3": {
"terms": {
"field": "PROPERTY_3"
}
},
"PROPERTY_4": {
"terms": {
"field": "PROPERTY_4"
}
}
},
"size": 0,
"runtime_mappings": {},
"_source": false,
"query": {
"bool": {
"must": [
{
"bool": {
"should": [
{
"bool": {
"should": [
{
"match_phrase": {
"PROPERTY_1": "RUSSIA"
}
}
],
"minimum_should_match": 0
}
},
{
"bool": {
"should": [
{
"match_phrase": {
"PROPERTY_1": "ITALY"
}
}
],
"minimum_should_match": 0
}
}
],
"minimum_should_match": 0
}
}
],
"filter": [],
"should": [],
"must_not": []
}
}
}
В итоге я получаю в PROPERTY_1 значения именно только те, что в фильтре
...
"PROPERTY_1": {
"doc_count_error_upper_bound": 0,
"sum_other_doc_count": 0,
"buckets": [
{
"key": "ITALY",
"doc_count": 19254
},
{
"key": "RUSSIA",
"doc_count": 9302
}
]
},
...
А надо чтобы возвращал по этому полю все результаты, игнорируя фильтр, а по остальным - с фильтром. Как правильно составить запрос?
Ответы (1 шт):
Агрегация выдает данные по результатам поискового запроса, соответственно если вам нужна чтобы часть соответствовала запросу, а часть нет то тут видимо вам нужно перенести из query часть с условием по которому вы хотите получить документы, но которая не должна влиять на агрегацию в post_filter. Таким образом вы получите при поиске те же документы, но агрегация будет по всем вариантам без учета этого условия, так как эта фильтрация выполняется после поиска. Подробнее о фильтрации результатов можно почитать в официальной документации https://www.elastic.co/guide/en/elasticsearch/reference/current/filter-search-results.html