ElasticSearch:当一个字段相同但另一个字段不同时过滤文档

cld4siwp  于 2023-11-17  发布在  ElasticSearch
关注(0)|答案(1)|浏览(162)

假设我有以下文件:

{"id": "a", "stage": 1}, 
{"id": "a", "stage": 2},

{"id": "b", "stage": 1},

字符串
如何过滤掉(不返回)id = a,因为有两个文档具有不同的stage值。换句话说,我只想检索具有单个stage条目的文档。如果有帮助,查询可以包含stage = 1

w9apscun

w9apscun1#

每个文档都是相互隔离的,因此您不能说“我只想检索具有单个stage条目的文档”,因为每个文档都具有单个stage条目。
为了实现您所期望的功能,您首先需要将文档“聚合”到一个新的文档集中,该文档集的枢轴是id字段。
如果您运行以下聚合查询,将您的文档聚合到id字段,您将获得每个id的存储桶列表以及它们包含多少个文档或阶段,具有单个阶段的文档排在第一位。

GET index/_search
{
  "size": 0,
  "aggs": {
    "ids": {
      "terms": {
        "field": "id",
        "size": 100,
        "order": {
          "_count": "asc"
        }
      }
    }
  }
}

字符串
如果你有少于10000个不同的id有一个stage,你可以将size参数增加到10000,然后一眼就能找出所有doc_count = 1的bucket。但是,如果你有更多的id,那么你需要使用composite聚合,这样你就可以通过你的bucket分页,直到你有了所有你需要的id。
总而言之,对于术语或复合聚合,您不能只返回具有doc_count: 1的术语,您只能按文档计数的数量升序排序,并在桶上进行排序,直到遇到doc_count = 2的桶。
另一种方法是使用一个Transform,它将基于这个composite/terms聚合创建一个新索引,然后您将能够仅查询doc_count = 1的ID的聚合索引。

相关问题