我使用ElasticSearch创建了一个Map来索引我的mongoDb
集合。以下是mapping
属性:
"properties" : {
"address_components" : {
"properties" : {
"_id" : {
"type" : "string"
},
"subLocality1" : {
"type" : "string",
"index" : "not_analyzed"
},
"subLocality2" : {
"type" : "string",
"index" : "not_analyzed"
},
"subLocality3" : {
"type" : "string",
"index" : "not_analyzed"
},
"city" : {
"type" : "string",
"index" : "not_analyzed"
}
}
现在,我想从以下字段中检索全部唯一项:subLocality1
、subLocality2
、subLocality3
、city
。此外,每个distinct
值都应包含q
作为子字符串。DISTINCT项还应包含相应的city
值。
示例:
"address_components" : {
"subLocality1" : "s1"
"subLocality2" : "s1",
"subLocality3" : "s2",
"city":"a"
}
"address_components" : {
"subLocality1" : "s3"
"subLocality2" : "s1",
"subLocality3" : "s2",
"city":"a"
}
"address_components" : {
"subLocality1" : "s2"
"subLocality2" : "s1",
"subLocality3" : "s4",
"city":"a"
}
对于上述指标,预期结果为:
"address_components" : {
"subLocality1" : "s1"
"subLocality2" : "s1",
"subLocality3" : "s2",
"city":"ct1"
}
"address_components" : {
"subLocality1" : "s3"
"subLocality2" : "s1",
"subLocality3" : "s2",
"city":"ct1"
}
"address_components" : {
"subLocality1" : "s2"
"subLocality2" : "s1",
"subLocality3" : "s4",
"city":"ct1"
}
{s1, a}, {s2,a}, {s3,a}, {s4,a},{a,a}
我尝试使用ElasticSearchterms
聚合。
GET /rescu/rescu/_search?pretty=true&search_type=count
{
"aggs" : {
"distinct_locations" : {
"terms" : {
"script" : "doc['address_components.subLocality1'].value"
}
}
}
}
但terms
聚合只适用于以下链接的单个字段。
4条答案
按热度按时间chhqkbe11#
我自己找到了答案,是在阅读了Elastic Search API文档后找到的。我们需要使用脚本从多个字段中检索术语。
j0pj023g2#
下面是包含两个字段的示例:Country、City。它使用按国家/地区的聚集和按城市的子聚集:
您可以使用许多层的子聚合。
rdlzhqv93#
如果您使用Fuad Efendi提供的查询:
需要注意的是,**第一个聚合的作用域是您添加的任何“查询”,而“City”上的第二个聚合的作用域不是而且将是整个数据库。**这可能不是您想要的。
就我个人而言,我认为Ritesh_NITW使用脚本提供的答案具有最好的结果。
2skhul334#
我从谷歌来到这里,搜索如何在Kibana可视化中做到这一点。
看起来Ritesh的答案在这里也很有帮助。
我想对两个字段进行唯一计数聚合:
IPAddress
和Message
。在Kibana可视化中,
JSON Input
字段帮助您修改发送到ElasticSearch的查询的聚合部分。
然而,你必须从里特什的答案中提取一些东西。这只是你需要的
script
部分。在我的案例中:
现在,documentation中真正缺少的是
script
参数优先于field
参数。这就是Kibana发生的事情。field
参数是从接口发送的,而script
参数是因为您将其添加到JSON input
文本框中而发送的。