elasticsearch 获取Elasticsearch中缺少的值,elasticsearch,kibana,querydsl,elasticsearch-opendistro,elasticsearch,Kibana,Querydsl,Elasticsearch Opendistro" /> elasticsearch 获取Elasticsearch中缺少的值,elasticsearch,kibana,querydsl,elasticsearch-opendistro,elasticsearch,Kibana,Querydsl,Elasticsearch Opendistro" />

elasticsearch 获取Elasticsearch中缺少的值

elasticsearch 获取Elasticsearch中缺少的值,elasticsearch,kibana,querydsl,elasticsearch-opendistro,elasticsearch,Kibana,Querydsl,Elasticsearch Opendistro,我正在寻找一个查询,该查询将返回给定值列表中文档中缺少的值。 例如,文档中有一个国家字段,其值为USA、迪拜、新加坡、日本。现在我想告诉elastic search,我给你的是国家列表(美国、迪拜、俄罗斯),你给我的输出告诉我俄罗斯不是任何文件的一部分。 这可能吗?您需要执行以下类似的查询,该查询只会选择美国、迪拜和俄罗斯的文档,然后聚合国家值 { "size": 0, "query": { "terms": {

我正在寻找一个查询,该查询将返回给定值列表中文档中缺少的值。 例如,文档中有一个国家字段,其值为USA、迪拜、新加坡、日本。现在我想告诉elastic search,我给你的是国家列表(美国、迪拜、俄罗斯),你给我的输出告诉我俄罗斯不是任何文件的一部分。
这可能吗?

您需要执行以下类似的查询,该查询只会选择美国、迪拜和俄罗斯的文档,然后聚合
国家

{
  "size": 0,
  "query": {
    "terms": {
      "country": [
        "USA",
        "Dubai",
        "Russia"
      ]
    }
  },
  "aggs": {
    "countries": {
      "terms": {
        "field": "country"
      }
    }
  }
}
在结果中,您将得到所有在场国家(即美国和迪拜)的桶,而俄罗斯没有桶

然后,您可以通过使用从聚合结果中获得的输入数组减去输入数组来执行一个简单的集合算术,您将找到所需的内容,即:

[USA, Dubai, Russia] - [USA, Dubai] = [Russia]
更新:如果您想在一个国家/地区完成上述所有工作,您可以利用

map\u脚本将为碎片上的每个文档运行,并将所有当前国家/地区存储在临时变量
state.countries

reduce\u脚本将在协调节点上运行,并接收所有碎片的结果。该脚本只是比较
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"
      ]
    }
  }

我怎样做集合运算?我只有kibana查询仪表板。因此,我只需使用一个查询即可实现所有功能。抱歉,我对Elasticsearch完全陌生。它在“map_脚本”处出现语法错误:“.”表示预期的“,”而不是“,”,您在哪里运行此操作?在Kibana开发工具中?如果没有,则需要将
替换为
,并将脚本内联在双引号之间的单行上。只有Kibana“理解”三重引号
我在Kibana警报中使用提取查询编辑器。甚至没有“帮助”。让我试试更多的方法。