Elasticsearch: агрегирование по разным полям

#elasticsearch #kibana

#elasticsearch #kibana

Вопрос:

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

 {
  contact:  31644488857,
  name: "Jan",
  address: "street 3"
}
  

и

 {
   person: {
       phone:  31688844499,
       address: "street 5"
   }
   name: "Piet"
}
  

Сейчас я ищу способ создать таблицу в kibana, которая объединяет телефонные номера, но обрабатывает их как единое поле. Поэтому я не хочу создавать разные таблицы или несколько столбцов для нескольких полей. Я просто хочу создать единую таблицу, в которой отображаются все телефонные номера, независимо от того, из какого поля они взяты.

Есть ли способ добиться этого? Я хотел бы использовать скриптовое поле, но, похоже, я не могу агрегировать по скриптовым полям…

Ответ №1:

Вы, конечно, можете создать скриптовое поле в Kibana для ( keyword ) строк, которые позже можно агрегировать.

Просто перейдите в «Управление> Шаблоны индекса», выберите соответствующий шаблон индекса, создайте новое скриптовое поле типа string и используйте следующий скрипт:

 [doc['contact.keyword'].value, doc['person.phone.keyword'].value]
  

Это создаст новое скриптовое поле, содержащее массив, элементами которого будут поля вашего телефонного номера. Затем вы можете визуализировать это поле либо в режиме обнаружения, либо в режиме агрегирования терминов в режиме визуализации.

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

1. Спасибо! Раньше возникало много проблем, поэтому я решил, что тогда у меня это не сработало, наверное, я использовал поля без ключевого слова или что-то в этом роде. В любом случае, сейчас это работает, но я постоянно получаю тайм-аут при настройке одноузловой оперативной памяти объемом 20 ГБ с 2 миллионами документов… Есть какие-нибудь советы по ускорению работы?