Аггрегация в 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

→ Ссылка