Существует список разговоров, и у каждого разговора есть список сообщений. Каждое сообщение имеет разные поля и поле 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.
Поскольку я новичок вasticsearch, каждый совет более чем приветствуется.