Elasticsearch: я хочу посчитать, сколько раз конкретное значение появилось в определенном поле - PullRequest
1 голос
/ 11 марта 2020

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

Допустим, у меня есть product.name, и я хочу знать, сколько раз появилось точное слово "Шампунь". внутри него.

Я знаю, что есть агрегация terms, которая предоставляет все уникальные значения вместе с числом их вхождений. Но, учитывая, что у меня есть миллиарды записей, это не хорошо для меня. Я не хочу дополнительный шаг, чтобы найти желаемое значение среди keys.

1 Ответ

2 голосов
/ 11 марта 2020

Агрегация фильтра

Определяет один пакет всех документов в контексте текущего набора документов, которые соответствуют указанному фильтру. Часто это используется для сужения текущего контекста агрегации до указанного c набора документов.

Агрегирование, подобное value_count , может применяться к корзине, возвращаемой в фильтре агрегация для получения общего количества документов.

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

Отображение

{
  "index92" : {
    "mappings" : {
      "properties" : {
        "product" : {
          "properties" : {
            "name" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }
      }
    }
  }
}

Запрос:

{
  "size": 0, 
  "aggs": {
    "shampoo": {
      "filter": {
        "term": {
          "product.name.keyword": "shampoo"
        }
      },"aggs": {
        "count": {
          "value_count": {
            "field": "product.name.keyword"
          }
        }
      }
    }
  }
}

Результат:

 "aggregations" : {
    "shampoo" : {
      "doc_count" : 2,
      "count" : {
        "value" : 2
      }
    }
  }
...