我使用弹性搜索创建了一个映射来索引我的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
作为子字符串。
不同的项目还应包含相应的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}
我尝试使用弹性搜索terms
聚合。
GET /rescu/rescu/_search?pretty=true&search_type=count
{
"aggs" : {
"distinct_locations" : {
"terms" : {
"script" : "doc['address_components.subLocality1'].value"
}
}
}
}
但terms
聚合仅适用于单个字段,符合以下link。
答案 0 :(得分:4)
以下是两个字段的示例:Country,City。它使用国家聚合和城市子聚合:
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country"
},
"aggregations": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
您可以使用多层子聚合。
答案 1 :(得分:2)
在通过弹性搜索api文档后,我自己找到了答案。 我们需要使用脚本从多个字段中检索术语。
GET / rescu / rescu / _search?pretty = true& search_type = count
{
"aggs": {
"distinct_locations": {
"terms": {
"script": "[doc['address_components.subLocality1'].value,doc['address_components.subLocality2'].value,doc['address_components.subLocality3'].value]",
"size": 5000
}
}
}
}
答案 2 :(得分:2)
如果您使用Fuad Efendi提供的查询:
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country"
},
"aggregations": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
请注意,第一个聚合的作用域是您添加的任何“查询”,但是“ city”上的第二个聚合作用域将不会,而是会作用于整个数据库。这可能不是您想要的。
我个人发现ritesh_NITW使用脚本提供的答案是最好的结果。
答案 3 :(得分:0)
我来自Google,来这里是如何在Kibana可视化中进行搜索的。
我想在两个字段上进行唯一计数的汇总:IPAddress
和Message
。
在Kibana可视化中,JSON Input
字段
帮助您修改发送到ElasticSearch的查询的聚合部分。
但是,您必须从Ritesh的答案中提取内容。这只是您需要的script
部分。
就我而言:
{
"script": "[doc['extra.IPAddress'].value,doc['extra.Message'].value]"
}
现在,documentation中真正缺少的是script
参数优先于field
参数。这就是在Kibana中发生的事情。 field
参数是从接口发送的,而script
参数是因为您将其添加到JSON input
文本框中而发送的。