Как мы можем получить количество каждой группы при группировке по определенному полю в elasticsearch?

Вот как выглядит мой документ.

{
    "Summary": "The One Way You're Putting Pressure on Your Partner Without Realizing It=20",
    "Industry" : "Lifestyle and Fitness",
    "Name": "Kali Coleman",
    "Email" : "[email protected]",
    "Media Outlet": "Best Life Online"
},
{
    "Summary": "The One Way You're Putting Pressure on",
    "Industry" : "High Tech",
    "Name": "John Smith",
    "Email" : "[email protected]",
    "Media Outlet": "Anonymous"
}

Я хочу подсчитать документы для каждого типа поля «Отрасль». Вот что я хочу в качестве вывода.

{
    "key": "Lifestyle and Fitness",
    "count": 1200
},
{
    "key": "High Tech",
    "count": 590
}

Я нашел аналогичный пост здесь ElasticSearch считает несколько полей, сгруппированных по, за исключением того, что я не надо фильтровать. И я попробовал это на своей консоли Kibana, получил следующую ошибку.

"root_cause" : [
      {
          "type" : "illegal_argument_exception",
          "reason" : "Text fields are not optimised for operations that require per-document field data like aggregations and sorting, so these operations are disabled by default. Please use a keyword field instead. Alternatively, set fielddata=true on [Industry] in order to load field data by uninverting the inverted index. Note that this can use significant memory."
      }
]

Пожалуйста, дайте мне знать, если кто-нибудь знает решение для этого.

Спасибо




Ответы (1)


Вы можете использовать агрегацию terms точно так же, как в примере и вы можете сделать это без фильтра. После того, как вы настроили отображение поля Industry на типа keyword, вы можете запустить

GET index_name/_search
{
  "size": 0,
  "aggs": {
    "by_industry": {
      "terms": {
        "field": "Industry.keyword"
      }
    }
  }
}
person Joe Sorocin    schedule 01.12.2020
comment
Благодарю вас! Код работал, как и ожидалось. Не могли бы вы объяснить, в чем разница внутри коробки, изменив ключевое слово Industry на Industry.keyword? Хотел узнать, как это работает в elasticsearch. Спасибо - person Chowon; 02.12.2020
comment
Рад, что это сработало. Об этом написано много статей, но если говорить совсем прямо, то text для частичного поиска, а keyword для точного совпадения. Теперь, чтобы ES мог это сделать, этот текст должен быть проанализирован, что, следовательно, увеличивает дисковое пространство и т. д. Кроме того, агрегирование (точные термины) по таким текстовым полям тоже очень дорого. Вместо этого мы включаем тип поля keyword, который принимает значения такими, какие они есть, т. е. точные термины с заглавными буквами, пробелами и т. д. — все сохранено. - person Joe Sorocin; 02.12.2020
comment
Бессовестный плагин: я пишу руководство по Elasticsearch. О чем еще вы хотели бы узнать? - person Joe Sorocin; 02.12.2020