В Elasticsearch не совсем тот тип операции SELECT ... DISTINCT
, который вы ищете, но мы можем приблизиться (с несколькими оговорками).
ПРИМЕЧАНИЕ. Все нижеперечисленное было протестировано на ES 6.8.1, но также должно работать еще до ES 2.x и выше до 7.x.
По сути, вы можете комбинировать две вещи:
- A агрегирует термины по всем вашим критериям уникальности (если поля
log
достаточно, чтобы утверждать уникальность, это будет легко. Если это какая-то комбинация полей, получится номинально хитрее со скриптами и значительно менее производительными)
- A агрегация верхних попаданий для возврата одного попадания из каждого сегмента агрегации терминов
В Elasticsearch ...
Предполагая, что:
- Ваши журналы имеют некоторый индекс (например, с именем
logs
- локально я проиндексировал ваши записи в индекс с именем logs-2019.07.01
и присвоил ему псевдоним logs
)
- Поле
log
проанализировано keyword
(позволяет его агрегировать)
POST /logs/_search
{
"size": 0,
"aggs": {
"unique_logs": {
"terms": {
"field": "log",
"size": 10
},
"aggs": {
"docs": {
"top_hits": {
"size": 1
}
}
}
}
}
}
Это вернет максимум 10 уникальных записей
{
"took" : 2,
...
"aggregations" : {
"unique_logs" : {
...
"buckets" : [
{
"key" : "0701125212",
"doc_count" : 3,
"docs" : {
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [
{
"_index" : "logs-2019.07.01",
"_type" : "_doc",
"_id" : "x-FB2GsBn6OwEwpDhYjX",
"_score" : 1.0,
"_source" : {
"log" : "0701125212",
"name" : "5018",
"date" : "2019/07/01 12:44:58:595"
}
}
]
}
}
},
{
"key" : "0701143900",
"doc_count" : 3,
"docs" : {
...
}
}
...
}
В Кибане ...
С теми же предположениями об индексе / данных выше:
- Используйте левую навигационную панель, чтобы перейти к
Visualize
строитель
- Создайте новую визуализацию таблицы данных, затем выберите шаблон индекса, содержащий ваши журналы
- Выберите
Top Hits
в качестве метрики (отобразите и отсортируйте все нужные поля) и Terms
агрегирование для группировки строк по полю doc
.

- Запуск визуализации должен создать таблицу с двумя столбцами с уникальными критериями в одном столбце и выбранными Top Hits
Field
в другом.
Вот и все! Теперь у вас должна быть таблица с одной строкой на «уникальную» запись в соответствии с определенными вами критериями уникальности.
Опции
Уникальность мультиполя
Если вы хотите использовать несколько полей в ваших критериях уникальности, без внесения изменений в ваше отображение / индексирование, единственный вариант, который у вас будет, - это использовать script
в агрегировании терминов вместо "field": "doc"
. В запросе Elasticsearch это просто:
POST /logs/_search
{
"size": 0,
"aggs": {
"unique_logs": {
"terms": {
// Remove the "field" from the agg...
// "field": "log",
// ...and add a "script" instead.
"script": {
"source": "String.format('%s.%s', new def[]{doc['log'].value, doc['name'].value})",
"lang": "painless"
},
"size": 10
},
...
}
}
}
В Кибане вы делаете то же самое, для этого требуется всего несколько кликов:
- Добавьте новое скриптовое поле , которое объединяет нужные поля "уникальности" (используйте скрипт из примера ES непосредственно выше в качестве шаблона).
- В конфигурации
Buckets
вашей визуализации выберите поле только что созданного сценария из выпадающего списка Field
.
Отображение нескольких полей в строке в Kibana
Несмотря на то, что агрегация верхних попаданий поддерживает возврат целых совпадений, к сожалению, визуализация таблицы данных Kibana поддерживает отображение только одного поля в строке. Если вы хотите отображать больше данных в строке, вам нужно создать поле со сценарием , которое содержит данные, которые вы хотите отобразить.
Как и в примере с уникальным ключом для нескольких полей, вы можете написать скрипт, который форматирует некоторую строку с некоторой комбинацией ваших полей:
String.format('[%s] %s - %s', new def[]{doc['log'].value, doc['date'].value, doc['name'].value})
Предостережения
- Чем больше ваше решение опирается на сценарии, тем больше вероятность того, что оно станет неэффективным. Попытайтесь ограничить сценарии везде, где это возможно (т. Е. Просто используйте одно поле для уникальности, если можете)
- Для визуализации вам может потребоваться создать сохраненный поиск вместо , просто создав его непосредственно в шаблоне индекса, чтобы ограничить количество документов, которые вы просматриваете и визуализируете, поскольку такая агрегация может дорого обойтись так как он запускает скрипты.