我有一个elasticsearch(v2.3)后端,在多个索引中存储ip地址。 ip的文档类型如下所示:
{
"ip" : {
"properties" : {
"ip": { "type" : "string", "index" : "not_analyzed" },
"categories": { "type" : "string", "index" : "not_analyzed" }
}
}
}
我的目标是通过唯一的ip字段对所有ip文档进行分组,以对所有记录的类别(以及所有其他字段)应用操作。
有一种简单的方法:使用下面的聚合聚合所有唯一的ip文档,并在我的脚本中迭代每个结果,进行其他搜索查询。
{
'size': 0,
'aggs': {
'uniq': {
'terms': { 'fields': 'ip', 'size': 0 }
}
}
}
但效率不高。有没有办法在一个搜索查询中执行此操作?
我在这里找到了一个解决方法Elasticsearch filter document group by field,其中有一个top_hits聚合:
{
"size": 0,
"aggs":{
"uniq":{
"terms": {
"field": "ip",
"size": 0
},
"aggs": {
"tops": {
"top_hits": {
"size": 10
}
}
}
}
}
}
但是,我不能将top_hits的大小设置为0,这就是我想要的,因为我希望它能够在N个不同的索引中处理具有相同ip的情况。
我已经看过管道聚合,但它似乎能够执行原始搜索。
感谢您的帮助!