Подтвердить что ты не робот

Ограничить агрегацию до результатов фильтрации

Учитывая набор документов, которые имеют заданное значение в одном поле, я хочу знать, сколько документов есть, которые имеют каждое значение для второго поля.

Я попытался сделать это с помощью агрегации терминов со следующим запросом:

{
    "size": 0,
    "filter": {
        "term": {
            "field1": "value"
        }
    },
    "aggregations": {
        "field2" : {
            "terms" : { "field" : "field2" }
        }
    }
}

но возвращаемые подсчеты показывают количество документов с каждым значением для второго поля во всем индексе и не ограничиваются этими документами с заданным значением для первого поля.

Что я делаю неправильно?

4b9b3361

Ответ 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 в ссылке. Чтобы фильтровать, затем вычислить совокупность, вам нужно использовать запрос.

Если вас беспокоит поражение производительности из-за вычисления баллов в запросах, вы можете посмотреть на запросы с постоянным счетом, которые в основном представляют собой запрос обертки фильтра.