Ограничить агрегацию до результатов фильтрации
Учитывая набор документов, которые имеют заданное значение в одном поле, я хочу знать, сколько документов есть, которые имеют каждое значение для второго поля.
Я попытался сделать это с помощью агрегации терминов со следующим запросом:
{
"size": 0,
"filter": {
"term": {
"field1": "value"
}
},
"aggregations": {
"field2" : {
"terms" : { "field" : "field2" }
}
}
}
но возвращаемые подсчеты показывают количество документов с каждым значением для второго поля во всем индексе и не ограничиваются этими документами с заданным значением для первого поля.
Что я делаю неправильно?
Ответы
Ответ 1
Вы пытались использовать отфильтрованный запрос?
{
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"term": {
"field1": "value"
}
}
}
},
"aggregations": {
"field2": {
"terms": { "field": "field2" }
}
}
}
Ответ 2
Здесь есть сравнение:
https://www.elastic.co/guide/en/elasticsearch/guide/current/_post_filter.html
Короче говоря, ваш фильтр верхнего уровня действует как post_filter в ссылке. Чтобы фильтровать, затем вычислить совокупность, вам нужно использовать запрос.
Если вас беспокоит поражение производительности из-за вычисления баллов в запросах, вы можете посмотреть на запросы с постоянным счетом, которые в основном представляют собой запрос обертки фильтра.