在elasticsearch中获取缺失值

yruzcnhs  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(1)|浏览(330)

我正在寻找一个查询,它将返回给定值列表中文档中缺少的值。例如,文档中有一个country字段,其值为usa、dubai、singapore、japan。现在我想告诉ElasticSearch,我给你的国家名单(美国,迪拜,俄罗斯),你给我的输出告诉我,俄罗斯不是任何文件的一部分。这可能吗?

xoefb8l8

xoefb8l81#

你需要做一个像下面这样的查询,只会选择美国,迪拜和俄罗斯的文件,然后汇总 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 数组存在,并且只输出不存在的国家。

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"
      ]
    }
  }

相关问题