假设我有以下文件:
{"id": "a", "stage": 1}, {"id": "a", "stage": 2}, {"id": "b", "stage": 1},
字符串如何过滤掉(不返回)id = a,因为有两个文档具有不同的stage值。换句话说,我只想检索具有单个stage条目的文档。如果有帮助,查询可以包含stage = 1。
id = a
stage
stage = 1
w9apscun1#
每个文档都是相互隔离的,因此您不能说“我只想检索具有单个stage条目的文档”,因为每个文档都具有单个stage条目。为了实现您所期望的功能,您首先需要将文档“聚合”到一个新的文档集中,该文档集的枢轴是id字段。如果您运行以下聚合查询,将您的文档聚合到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的聚合索引。
size
composite
doc_count: 1
composite/terms
1条答案
按热度按时间w9apscun1#
每个文档都是相互隔离的,因此您不能说“我只想检索具有单个stage条目的文档”,因为每个文档都具有单个stage条目。
为了实现您所期望的功能,您首先需要将文档“聚合”到一个新的文档集中,该文档集的枢轴是
id
字段。如果您运行以下聚合查询,将您的文档聚合到
id
字段,您将获得每个id的存储桶列表以及它们包含多少个文档或阶段,具有单个阶段的文档排在第一位。字符串
如果你有少于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的聚合索引。