gpt4 book ai didi

search - 如果在 Elasticsearch 中选择数组字段的另一个聚合选项,如何计算将添加的文档数

转载 作者:行者123 更新时间:2023-11-29 02:50:38 25 4
gpt4 key购买 nike

假设我们有四个带有 tags 字段的文档。它可以包含多个字符串,比如 foobarbaz

docA.tags = ['foo']
docB.tags = ['bar']
docC.tags = ['foo', 'bar']
docD.tags = ['foo', 'baz']

我使用聚合查询文档,因此我得到了四个文档和一个包含三个桶的列表,其中的计数与特定标签相匹配。

buckets = [
{key: 'bar', doc_count: 2}, // docB, docC
{key: 'foo', doc_count: 3}, // docA, docC, docD
{key: 'baz', doc_count: 1} // docD
]

如果我现在运行另一个查询并添加其中一个标签——比方说 foo——作为查询的术语过滤器,我只会得到文档 (docA , docC, docD) 有这个标签。这就是我想要的。

但我还得到了另一个可能的聚合列表,其中包含更新的计数。

buckets = [
{key: 'bar', doc_count: 1}, // docC
{key: 'baz', doc_count: 1}, // docD
]

但这些计数与正在发生的情况并不完全相符。它们反射(reflect)了匹配两个标签的文档数,我首先选择的标签 (foo) 和桶中的一个 (bar baz).

但是,如果我随后选择第二个标签——比方说 baz——我会得到用 foobaz 标记的文档。那是因为我使用了 terms 过滤器。

所以我真正想要的是这个

buckets = [
{key: 'bar', doc_count: 1}, //docB
{key: 'baz', doc_count: 0},
]

我怎样才能使计数合适。如果我选择第二个标签,它们应该反射(reflect)将添加的文档数。这方面的一个例子是 here .

我已经尝试使用 post_filter 但这总是给我第一个结果。比 aggs 的 min_doc_count 标志,但这只显示了导致 count=0 的组合。

我有一个解决方案,但对我来说似乎很复杂。为此,我将不得不为我反转过滤条件的每个聚合运行另一个请求。所以在上面的例子中,我必须查询所有没有标签 foo 的文档并匹配查询的其余部分。聚合结果正是我所需要的。

最佳答案

听起来您正在尝试对分面/聚合做一些不典型的事情。

(但是,它不是无效的......理解你的选择的大小将如何通过应用过滤器而改变是很有意义的)

我认为您要求的是:

  1. 显示以下结果:QUERY AND FILTER
  2. 显示术语聚合计数:QUERY NOT FILTER

enter image description here

您提到您正在执行后续计数请求?您应该能够在主搜索请求中构建此聚合请求。

结构上是:

  • 匹配:(QUERY) 或 match_all
  • 聚合:
    • filter : { 不是: (FILTER) }
      • 聚合:{ terms: ... }
  • post_filter : (过滤器)

post_filter 在计算聚合后执行(但仍应用于搜索结果),因此您的结果将符合您的预期。

聚合在单独搜索查询的范围内起作用。 (后置过滤器尚未应用。)

filter aggregation在 Terms Aggregation 计算计数之前,从搜索查询结果中排除所有匹配 FILTER 的文档。

(给你上面显示的维恩的左外边缘,但只是为了计数)

关于search - 如果在 Elasticsearch 中选择数组字段的另一个聚合选项,如何计算将添加的文档数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33901711/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com