【发布时间】:2017-08-26 10:13:50
【问题描述】:
我的索引包含很多文档,每个文档都有几个版本,例如:
{"doc_id": 13,
"version": 1,
"text": "bar"}
{"doc_id": 13,
"version": 2,
"text": "bar"}
{"doc_id": 13,
"version": 3,
"text": "bar"}
{"doc_id": 14,
"version": 1,
"text": "foo"}
{"doc_id": 14,
"version": 2,
"text": "bar"}
我想获取每个文档的最新版本,并使用 terms 聚合来聚合它们(最新版本)。
我尝试使用top hits 来检索最新版本:
{"size" :0,
"aggs" : {
"doc_id_groups" : {
"terms" : {
"field" : "doc_id",
"size" : "0"
},
"aggs" : {
"docs" : {
"top_hits" : {
"size" : 1,
"sort" : {
"version" : {
"order" : "desc"
}
}
}
}
}
}
}
}
但我不能进行聚合,因为top hits 不支持子聚合。
我想检索 id 然后聚合它们对于客户端来说是非常繁重的操作。
也许脚本可以帮助?
更新:我忘了提一件事:在聚合文档之前按时间范围过滤,所以我们不知道索引时哪个版本是最新的,只有在搜索时才知道 p>
【问题讨论】:
-
鉴于上述示例文档,您期望得到什么结果?
-
@jay 我已经编辑了一些例子。我期待这样的事情:
"buckets": [ { "key": "bar", "doc_count": 2 }] -
您需要一次性完成,还是可以创建二级索引来执行您需要的操作?
-
您是否真的需要保留文档的旧版本,或者是否可以在新版本出现时将它们移动到另一个索引? (正如您的other question 中所述,索引时间并不重要)
-
@Val 感谢您的关注。可以创建二级索引。也可以将旧版本移动到另一个索引。有一件事我忘了提:在聚合文档之前是按时间范围过滤的,所以我们不知道索引时哪个版本是最新的,只有在搜索时。
标签: elasticsearch nosql