有一个对话列表,每个对话都有一个消息列表。每个消息都有不同的字段和一个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":{
},
}
我接下来需要的:
1.我需要将折叠的结果Map到单个结果中,如A > A.1 > A > A.1 > A.1.1
。我已经看到,在或aggr
的情况下,可以对结果使用scripts,并且可以创建一个操作列表,如我需要的,但aggr
对所有消息执行操作,不仅仅是在collapse中的分组消息上。有没有可能在collapse中使用aggr
或类似的解决方案?
1.我需要对所有折叠的结果值(A > A.1 > A > A.1 > A.1.1
)进行分组,添加一个计数,得到Map<actionsGroup, count>
。
或者:
1.使用aggr
按conversationId
字段对对话消息进行分组(我不知道如何执行此操作)
1.使用脚本迭代所有值,并为每个对话创建actions group
。(不确定这是否可行)
1.对所有值使用另一个aggr
,并对重复项进行分组,返回Map<actionsGroup, count>
。
Map:
"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.
2条答案
按热度按时间7gcisfzg1#
我用弹性的
scripted_metric
解了它。而且,index
从初始状态改变了。脚本:
格式化脚本(为了更好的可读性-使用.ts):
的回答:
eni9jsuy2#
在术语聚合中使用脚本,我们可以在“context.action”的第一个字符上创建存储桶。使用类似的术语子聚合,我们可以在父存储桶下获得所有“context.action”,例如A-〉A.1-〉A.1.1...
查询:
由于在ElasticSearch中不可能连接不同的文档,因此您必须通过在聚合桶上迭代来获得客户端中的组合键。
结果: