Как фильтровать агрегацию терминов

#elasticsearch

#elasticsearch

Вопрос:

В настоящее время у меня есть что-то вроде этого

 aggs: {
  categories: {
    terms: {
      field: 'category'
    }
  }
}
  

и это дает мне количество продуктов в каждой категории. Но у меня есть дополнительное условие. Мне нужно получить количество продуктов в каждой категории, которые еще не проданы, поэтому мне нужно terms как-то выполнить фильтрацию.

Есть ли какой-нибудь элегантный способ сделать это с помощью aggregation framework, или мне нужно написать отфильтрованный запрос?

Спасибо

Ответ №1:

Вы можете объединить агрегацию терминов и агрегацию фильтров, и вот как это должно выглядеть: (проверено)

     aggs: {
      categories: {            
        filter: {term: {sold: true}},
        aggs: {
          names: {
            terms: {field: 'category'}
          }
        }
      }
    }
  

Вы также можете добавить дополнительные условия к фильтру, надеюсь, это поможет.

Комментарии:

1. Вы случайно не знаете, как использовать два условия фильтра в одном и том же сегменте?

2. Я второй @g. вопрос лахлу. Как вы включаете несколько условий?

3. Мы можем использовать bool filter для всех терминов, например. «filter»: { «bool» : { «must» : [ {«term» : { «isActive» : «1» } }, {» термин» : { «isPrivate» : «0» } }, {«term» : { «isOwner» : «1» } } ] } }

4. Я обновляю свой вопрос, чтобы объяснить проблему

Ответ №2:

Просто чтобы добавить к другому ответу, вы также можете использовать вложенный запрос. Это похоже на то, что я должен был сделать. Я использую Elasticsearch 5.2.

Из документов, вот основной синтаксис:

 "aggregations" : {
    "<aggregation_name>" : {
        "<aggregation_type>" : {
            <aggregation_body>
        }
        [,"aggregations" : { [<sub_aggregation>]  } ]?
    }
    [,"<aggregation_name_2>" : { ... } ]*
}
  

Вот как я это реализовал:

 GET <path> core_data/_search
{
  "aggs": {
    "NAME": {
      "nested": {
        "path": "ATTRIBUTES"
      },
      "aggs": {
        "NAME": {
          "filter": {
            "term": {
              "ATTRIBUTES.ATTR_TYPE": "EDUCATION_DEGREE"
            }
          },
          "aggs": {
            "NAME": {
              "terms": {
                "field": "ATTRIBUTES.DESCRIPTION",
                "size": 100
              }
            }
          }
        }
      }
    }
  }
}
  

Это отфильтровало данные до одного сегмента, что мне и было нужно.