【发布时间】:2020-01-26 16:23:41
【问题描述】:
假设我有一个包含大量用户 cmets 的 Elasticsearch 索引:
{ "name": "chris", "date": "2016-01-01", "msg": "hi, foo"}
{ "name": "chris", "date": "2016-01-05", "msg": "bye, bar"}
{ "name": "aaron", "date": "2016-01-10", "msg": "who's bar"}
{ "name": "aaron", "date": "2016-01-15", "msg": "not foo"}
首先,我想找到每个用户的最新评论。我可以使用 top_hits 聚合来做到这一点:
"aggs": {
"name": {
"terms": { "field": "name" },
"aggs": {
"latest_comment": {
"top_hits": {
"sort": [ {"date": { "order": "desc" } } ],
"size": 1
}
}
}
}
}
}
这实际上给了我以下信息:
{ "name": "chris", "date": "2016-01-05", "msg": "bye, bar"}
{ "name": "aaron", "date": "2016-01-15", "msg": "not foo"}
但是我现在如何过滤这些结果呢?并且要非常清楚,我想在top_hits 聚合选择了最新点击后过滤,而不是之前。
谢谢。
【问题讨论】:
-
您想从获得的热门点击中过滤掉什么?请更详细地解释您的用例。
-
例如,我想说“为每个在 msg 中有 'foo' 的用户返回最新评论。”需要明确的是,如果我过滤了“foo”然后找到了最高点击量,那么用户
chris将是{ "name": "chris", "date": "2016-01-01", "msg": "hi, foo"},这不是他的最新评论。 -
@cjbottaro 与我在这里遇到的完全相同的问题:stackoverflow.com/questions/51360616/… 一位顾问在我的公司经过,说弹性搜索 6.2 或更低版本提供的功能是不可能的。您必须创建一个自定义脚本来过滤热门点击或在客户端过滤它或在获得结果后在服务器端过滤它。这不是最好的解决方案,而是一个解决方案。
标签: elasticsearch