弹性搜索 - 来自多个字段的不同元素
Elastic Search- Distinct elements from multiple fields
我使用弹性搜索创建了一个映射来索引我的 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.
的单个字段
我通过弹性搜索 api 文档找到了自己的答案。
我们需要使用脚本从多个字段中检索术语。
GET /rescu/rescu/_search?pretty=true&search_type=计数
{
"aggs": {
"distinct_locations": {
"terms": {
"script": "[doc['address_components.subLocality1'].value,doc['address_components.subLocality2'].value,doc['address_components.subLocality3'].value]",
"size": 5000
}
}
}
}
这里有两个字段的示例:Country、City。它使用按国家/地区汇总和按城市分类的子汇总:
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country"
},
"aggregations": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
您可以使用多层子聚合。
如果您使用 Fuad Efendi 提供的查询:
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country"
},
"aggregations": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
请务必注意,第一个聚合的范围将限定为您添加的任何 "query",但 "city" 上的第二个聚合不会,而是限定为整个数据库。这可能不是你想要的。
就我个人而言,我发现 ritesh_NITW 使用脚本提供的答案可以获得最佳结果。
我从 Google 来到这里搜索如何在 Kibana 可视化中执行此操作。
看起来 Ritesh's 在那里也很有帮助。
我想对两个字段进行唯一计数聚合: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
文本框中添加的所以发送了。
我使用弹性搜索创建了一个映射来索引我的 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.
我通过弹性搜索 api 文档找到了自己的答案。 我们需要使用脚本从多个字段中检索术语。
GET /rescu/rescu/_search?pretty=true&search_type=计数
{
"aggs": {
"distinct_locations": {
"terms": {
"script": "[doc['address_components.subLocality1'].value,doc['address_components.subLocality2'].value,doc['address_components.subLocality3'].value]",
"size": 5000
}
}
}
}
这里有两个字段的示例:Country、City。它使用按国家/地区汇总和按城市分类的子汇总:
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country"
},
"aggregations": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
您可以使用多层子聚合。
如果您使用 Fuad Efendi 提供的查询:
{
"size": 0,
"aggs": {
"country": {
"terms": {
"field": "country"
},
"aggregations": {
"city": {
"terms": {
"field": "city"
}
}
}
}
}
}
请务必注意,第一个聚合的范围将限定为您添加的任何 "query",但 "city" 上的第二个聚合不会,而是限定为整个数据库。这可能不是你想要的。
就我个人而言,我发现 ritesh_NITW 使用脚本提供的答案可以获得最佳结果。
我从 Google 来到这里搜索如何在 Kibana 可视化中执行此操作。
看起来 Ritesh's
我想对两个字段进行唯一计数聚合: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
文本框中添加的所以发送了。