Существует список бесед, и у каждой беседы есть список сообщений. Каждое сообщение имеет разные поля и поле action
. Нужно учитывать, что в первых сообщениях беседы используется действие A
, через несколько сообщений используется действие A.1
, через некоторое время A.1.1
и так далее (есть список намерений чатбота).
Группировка действий сообщений в беседе будет выглядеть примерно так: A > A > A > A.1 > A > A.1 > A.1.1 ...
Проблема:
Мне нужно создать отчет с помощью ElasticSearch, который будет возвращать actions group
каждого разговора; затем мне нужно сгруппировать похожие actions groups
, добавив количество; в итоге получится Map<actionsGroup, count>
как 'A > A.1 > A > A.1 > A.1.1', 3
.
При построении actions group
мне нужно исключить все группы дубликатов; Вместо A > A > A > A.1 > A > A.1 > A.1.1
мне нужно иметь A > A.1 > A > A.1 > A.1.1
.
Шаги, которые я начал делать:
{
"collapse":{
"field":"context.conversationId",
"inner_hits":{
"name":"logs",
"size": 10000,
"sort":[
{
"@timestamp":"asc"
}
]
}
},
"aggs":{
},
}
Что мне нужно дальше:
- Мне нужно сопоставить результат коллапса с одним результатом, например
A > A.1 > A > A.1 > A.1.1
. Я видел, что в случаеaggr
можно использовать скрипты над результатом и есть возможность создать список действий, как мне нужно, ноaggr
выполняет операции над всеми сообщениями, а не только над сгруппированными сообщениями что у меня в развале. Можно ли использоватьaggr
внутри коллапса или подобное решение? - Мне нужно сгруппировать полученные значения (
A > A.1 > A > A.1 > A.1.1
) из всех коллапсов, добавить счетчик и получитьMap<actionsGroup, count>
.
Или:
- Сгруппируйте сообщения разговоров по полю
conversationId
, используяaggr
(я не знаю, как это сделать) - Используйте скрипт для повторения всех значений и создания
actions group
для каждого диалога. (не уверен, что это возможно) - Используйте еще один
aggr
для всех значений и сгруппируйте дубликаты, возвращаяMap<actionsGroup, count>
.
Обновление 2: мне удалось получить частичный результат, но осталась одна проблема. Пожалуйста, проверьте здесь, что мне еще нужно исправить.
Обновление 1: добавлены некоторые дополнительные сведения.
Сопоставления:
"mappings":{
"properties":{
"@timestamp":{
"type":"date",
"format": "epoch_millis"
}
"context":{
"properties":{
"action":{
"type":"keyword"
},
"conversationId":{
"type":"keyword"
}
}
}
}
}
Образцы документов разговоров:
Conversation 1.
{
"@timestamp": 1579632745000,
"context": {
"action": "A",
"conversationId": "conv_id1",
}
},
{
"@timestamp": 1579632745001,
"context": {
"action": "A.1",
"conversationId": "conv_id1",
}
},
{
"@timestamp": 1579632745002,
"context": {
"action": "A.1.1",
"conversationId": "conv_id1",
}
}
Conversation 2.
{
"@timestamp": 1579632745000,
"context": {
"action": "A",
"conversationId": "conv_id2",
}
},
{
"@timestamp": 1579632745001,
"context": {
"action": "A.1",
"conversationId": "conv_id2",
}
},
{
"@timestamp": 1579632745002,
"context": {
"action": "A.1.1",
"conversationId": "conv_id2",
}
}
Conversation 3.
{
"@timestamp": 1579632745000,
"context": {
"action": "B",
"conversationId": "conv_id3",
}
},
{
"@timestamp": 1579632745001,
"context": {
"action": "B.1",
"conversationId": "conv_id3",
}
}
Ожидаемый результат:
{
"A -> A.1 -> A.1.1": 2,
"B -> B.1": 1
}
Something similar, having this or any other format.
Поскольку я новичок в elasticsearch, каждый совет приветствуется.
actions group
. Как и у каждого разговора есть список действийA -> A.1 -> A.1.1
, этоactions group
; Мне нужно знать количествоactions group
. - person Radu Linu   schedule 12.03.2020