我正在寻找一个查询,它将返回给定值列表中文档中缺少的值。例如,文档中有一个country字段,其值为usa、dubai、singapore、japan。现在我想告诉ElasticSearch,我给你的国家名单(美国,迪拜,俄罗斯),你给我的输出告诉我,俄罗斯不是任何文件的一部分。这可能吗?
xoefb8l81#
你需要做一个像下面这样的查询,只会选择美国,迪拜和俄罗斯的文件,然后汇总 country 价值观。
country
{ "size": 0, "query": { "terms": { "country": [ "USA", "Dubai", "Russia" ] } }, "aggs": { "countries": { "terms": { "field": "country" } } } }
在结果中,你将得到所有国家的桶,目前(即美国和迪拜)和没有桶俄罗斯。然后你可以做一个简单的算术集合,用你从聚合结果中得到的数组减去输入数组,你就会找到你需要的,即:
[USA, Dubai, Russia] - [USA, Dubai] = [Russia]
更新:如果你想在一个国家完成以上所有工作,你可以利用 scripted_metric 聚合。 map_script 将为shard上的每个文档运行,并将所有当前国家/地区存储在临时变量中 state.countries . reduce_script 将在协调节点上运行并接收所有碎片的结果。这个脚本只是比较世界上哪些国家 params.countries 数组存在,并且只输出不存在的国家。
scripted_metric
map_script
state.countries
reduce_script
params.countries
POST country/_search { "size": 0, "query": { "terms": { "country": [ "USA", "Dubai", "Russia" ] } }, "aggs": { "missing_countries": { "scripted_metric": { "init_script": "state.countries = [:]", "map_script": """ def country = doc['country.keyword'].value; if (!state.countries.containsKey(country)) { state.countries[country] = 0; } state.countries[country]++; """, "combine_script": """ return state.countries; """, "reduce_script": """ // gather all present countries def countries = new HashSet(); for (state in states) { countries.addAll(state.keySet()); } // figure out which country in params is not present in countries def missing = []; for (country in params.countries) { if (!countries.contains(country)) { missing.add(country); } } return missing; """, "params": { "countries": ["USA", "Dubai", "Russia"] } } } } }
在这种情况下,输出将是
"aggregations" : { "missing_countries" : { "value" : [ "Russia" ] } }
1条答案
按热度按时间xoefb8l81#
你需要做一个像下面这样的查询,只会选择美国,迪拜和俄罗斯的文件,然后汇总
country
价值观。在结果中,你将得到所有国家的桶,目前(即美国和迪拜)和没有桶俄罗斯。
然后你可以做一个简单的算术集合,用你从聚合结果中得到的数组减去输入数组,你就会找到你需要的,即:
更新:如果你想在一个国家完成以上所有工作,你可以利用
scripted_metric
聚合。map_script
将为shard上的每个文档运行,并将所有当前国家/地区存储在临时变量中state.countries
.reduce_script
将在协调节点上运行并接收所有碎片的结果。这个脚本只是比较世界上哪些国家params.countries
数组存在,并且只输出不存在的国家。在这种情况下,输出将是