Elasticsearch:找到一个字段与另一个字段的重叠
Elasticsearch: Finding the overlap of one field against another
我正在尝试想办法在 Elasticsearch 中执行此操作,而无需进行多次查询,或在必要时使用 _mget
。
我有很多这样结构的文档:
{
'location': 'Orlando',
'agent_id': 395205,
},
{
'location': 'Miami',
'agent_id': 391773,
},
{
'location': 'Miami',
'agent_id': 391773,
},
{
'location': 'Tampa',
'agent_id': 395205,
}
有固定数量的 location
个值,但有许多唯一的 agent_id
个值。
我的最终目标是,给定一个位置列表,找到所有位置中都存在的 agent_id
。所以在上面的例子中,给定 ['Orlando', 'Tampa']
,我们得到 [395205]
,因为它存在于两者中。一个位置可能有重复的 agent_id
s(这是预期的行为),所以我不能使用计数(例如,显示 agent_id
s 出现 n
次,其中 n = len(locations)
.
这里的另一个关键是,如果可能的话,我想实际 return 命中,而不是在聚合桶中。所以理想情况下 top_hits
可以嵌套在某个地方。
我认为这可以通过一些巧妙的过滤或一些严格的评分来实现,但我不确定如何处理这些问题。我已经使用多个查询完成了这项工作,但我发现这个过程太昂贵了,如果可能的话,我想简化它。我承认这实际上可能是不可能的。但很想听听其他人的意见。
代理下的唯一位置计数可用于查找常见代理
查询:
{
"query": { --> select docs with give location
"terms": {
"location.keyword": [
"Orlando",
"Tampa"
]
}
},
"aggs": {
"agents": {
"terms": {
"field": "agent_id", ---> List of agents
"size": 10
},
"aggs": {
"location": { ---> Unique locations under a agent
"terms": {
"field": "location.keyword",
"size": 10
}
},
"my_bucket": {
"bucket_selector": {
"buckets_path": {
"count": "location._bucket_count"
},
"script": "params.count==2" -->count of locations for agent, replace 2
--> with needed count(number of locations)
}
}
}
}
}
}
结果:
[
{
"_index" : "index30",
"_type" : "_doc",
"_id" : "LXuksHABg1vns4B5FWL5",
"_score" : 1.0,
"_source" : {
"location" : "Orlando",
"agent_id" : 395205
}
},
{
"_index" : "index30",
"_type" : "_doc",
"_id" : "MHuksHABg1vns4B5OmKC",
"_score" : 1.0,
"_source" : {
"location" : "Tampa",
"agent_id" : 395205
}
}
]
},
"aggregations" : {
"agents" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 395205,
"doc_count" : 2,
"location" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Orlando",
"doc_count" : 1
},
{
"key" : "Tampa",
"doc_count" : 1
}
]
}
}
]
}
}
我正在尝试想办法在 Elasticsearch 中执行此操作,而无需进行多次查询,或在必要时使用 _mget
。
我有很多这样结构的文档:
{
'location': 'Orlando',
'agent_id': 395205,
},
{
'location': 'Miami',
'agent_id': 391773,
},
{
'location': 'Miami',
'agent_id': 391773,
},
{
'location': 'Tampa',
'agent_id': 395205,
}
有固定数量的 location
个值,但有许多唯一的 agent_id
个值。
我的最终目标是,给定一个位置列表,找到所有位置中都存在的 agent_id
。所以在上面的例子中,给定 ['Orlando', 'Tampa']
,我们得到 [395205]
,因为它存在于两者中。一个位置可能有重复的 agent_id
s(这是预期的行为),所以我不能使用计数(例如,显示 agent_id
s 出现 n
次,其中 n = len(locations)
.
这里的另一个关键是,如果可能的话,我想实际 return 命中,而不是在聚合桶中。所以理想情况下 top_hits
可以嵌套在某个地方。
我认为这可以通过一些巧妙的过滤或一些严格的评分来实现,但我不确定如何处理这些问题。我已经使用多个查询完成了这项工作,但我发现这个过程太昂贵了,如果可能的话,我想简化它。我承认这实际上可能是不可能的。但很想听听其他人的意见。
代理下的唯一位置计数可用于查找常见代理
查询:
{
"query": { --> select docs with give location
"terms": {
"location.keyword": [
"Orlando",
"Tampa"
]
}
},
"aggs": {
"agents": {
"terms": {
"field": "agent_id", ---> List of agents
"size": 10
},
"aggs": {
"location": { ---> Unique locations under a agent
"terms": {
"field": "location.keyword",
"size": 10
}
},
"my_bucket": {
"bucket_selector": {
"buckets_path": {
"count": "location._bucket_count"
},
"script": "params.count==2" -->count of locations for agent, replace 2
--> with needed count(number of locations)
}
}
}
}
}
}
结果:
[
{
"_index" : "index30",
"_type" : "_doc",
"_id" : "LXuksHABg1vns4B5FWL5",
"_score" : 1.0,
"_source" : {
"location" : "Orlando",
"agent_id" : 395205
}
},
{
"_index" : "index30",
"_type" : "_doc",
"_id" : "MHuksHABg1vns4B5OmKC",
"_score" : 1.0,
"_source" : {
"location" : "Tampa",
"agent_id" : 395205
}
}
]
},
"aggregations" : {
"agents" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : 395205,
"doc_count" : 2,
"location" : {
"doc_count_error_upper_bound" : 0,
"sum_other_doc_count" : 0,
"buckets" : [
{
"key" : "Orlando",
"doc_count" : 1
},
{
"key" : "Tampa",
"doc_count" : 1
}
]
}
}
]
}
}