假设我有一个带有大量用户评论的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
聚合已经选择了最新的匹配,而不是之前。
谢谢。
答案 0 :(得分:1)
我有确切的问题。经过大量搜索后的结果是:
如果您要根据数字指标过滤匹配结果最高的结果,则可以使用管道聚合,例如存储桶选择器。这种方式可以在Elasticsearch中实现SQL HAVING。对于这种情况,非常有用的答案可以找到implementing HAVING in elasticsearch
但是,如果您要过滤的指标不是数字,则没有办法(至少到v 6.2.4之前)在Elasticsearch方面执行此操作。
在这种情况下,如@ismail所说,您需要在客户端使用软件来完成此操作。