【发布时间】:2020-06-24 07:26:45
【问题描述】:
有一个对话列表,每个对话都有一个消息列表。每条消息都有不同的字段和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.1 > A > A.1 > A.1.1 而不是A > A > 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可以在结果上使用scripts,并且可以创建我需要的操作列表,但是aggr正在对所有消息进行操作,不仅在我崩溃的分组消息上。是否可以在折叠或类似解决方案中使用aggr? - 我需要对所有折叠的结果值 (
A > A.1 > A > A.1 > A.1.1) 进行分组,添加计数并生成Map<actionsGroup, count>。
或者:
- 使用
aggr按conversationId字段对对话消息进行分组(我不知道该怎么做) - 使用脚本迭代所有值并为每个对话创建
actions group。 (不确定这是否可能) - 对所有值使用另一个
aggr并对重复项进行分组,返回Map<actionsGroup, count>。
更新 2: 我设法获得了部分结果,但仍然存在一个问题。请检查here 我还需要修复什么。
更新 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 新手,所以我非常欢迎每个提示。
【问题讨论】:
-
您可以使用术语聚合对键进行分组。如果可以添加映射、示例文档和预期结果,将更容易理解问题
-
@jaspreetchahal 我添加了一些额外的细节。
-
您是否需要 convs1->2、convs2->1 的会话 ID 数?行动组在这里的作用是什么?
-
没有。我需要会话计数
actions group。就像每个对话都有一个动作列表A -> A.1 -> A.1.1,这是actions group;我需要知道actions group的数量。 -
我建议你放弃聚合并自己编写一个完整的脚本。 elastic.co/guide/en/elasticsearch/reference/master/…
标签: elasticsearch collapse elasticsearch-aggregation elasticsearch-query