Elasticsearch 查询排除另一个查询的结果

Elasticsearch query excluding the results from another query

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

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

我想要 return 一组文档,其中 tag=source1 不包括来自另一个查询 tag=source2

domain_name

在两个步骤中,这将是这样的:

设置排除

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

结果将被处理以生成一个包含 domain_name 个值的数组,每个 returned 文档都有一个。

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

查询负集排除

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

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

奖金问题,这可以直接在 Kibana 中定义吗?

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

为避免两次调用,请使用嵌套查询或(has_child 和 has_parent)查询。 参考 Elasticsearch Doc