首页 > 解决方案 > Elasticsearch 查询排除另一个查询的结果

问题描述

'articles' 的简化 Elasticsearch 索引包含带有 和 字段的文档domain_nametag以及一些其他内容。

tag仅限于少数关键字值,例如source1, source2,其中tag每个文档中只能有一个值。domain_name是每个文档中的单个值

我想返回一组文档,其中tag=source1不包括domain_name来自另一个查询的tag=source2

分两步,这将类似于:

设置为排除

{
  "query": {
    "term" : { "tag" : "source2" } 
  }
}

结果将被处理以产生一个domain_name值数组,每个返回的文档都有一个值。

然后第二个查询将获取它关心的所有项目,然后排除它不关心的术语(来自前一个查询的域名列表)。

查询减去设置为排除

{
  "query": {
    "bool": {
      "must": {
        "term" : { "tag" : "source1" } 
      },
      "must_not": {
        "terms": {
          "tag": [<array of domain_name values>]
        }
      }
    }
  }
}

这可能在单个查询中,还是使用聚合?索引和结果集不会很大,所以我不太担心性能而不是方便。

额外的问题,这可以直接在 Kibana 中定义吗?

标签: elasticsearchkibana

解决方案


对于我的情况,我使用编程语言(Java)执行第一个查询并通过第一个查询获取文档的结果数组,然后我将查询结果的 id 存储在数组中,并使用包含第一个查询的 id 的这个数组来执行第二个查询弹性不支持嵌套查询


推荐阅读