当前位置 : 主页 > 手机开发 > 其它 >

如果在弹性搜索中选择阵列字段的另一个聚合选项,如何获取将添加的文档的数

来源:互联网 收集:自由互联 发布时间:2021-06-22
假设我们有四个带有标签字段的文档.它可以包含多个字符串,比如说foo,bar和baz. docA.tags = ['foo']docB.tags = ['bar']docC.tags = ['foo', 'bar']docD.tags = ['foo', 'baz'] 我使用聚合查询文档,因此我获得了四
假设我们有四个带有标签字段的文档.它可以包含多个字符串,比如说foo,bar和baz.

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
]

但这些计数与发生的事情并不完全一致.它们反映了与两个标签匹配的文档数量,我首先选择的标签(foo)和一个标签(bar或baz).

但是,如果我然后选择第二个标签 – 让我们说巴兹 – 我得到的文件已被foo或baz标记.那是因为我使用了术语过滤器.

所以我真正想要的是这个

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

我怎样才能实现计数合适.如果我选择第二个标记,它们应该反映将添加的文档数.一个例子是here.

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

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

听起来你正在尝试为facet / aggregations做一些非典型的事情.

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

我认为你要求的是:

>显示结果:QUERY AND FILTER
>显示术语聚合计数:QUERY NOT FILTER

你提到你正在做关于计数的后续请求吗?您应该能够在主搜索请求中构建此聚合请求.

结构上它是:

>匹配:(QUERY)或match_all
>聚合:

> filter:{not:(FILTER)}

>聚合:{terms:…}

> post_filter :(过滤器)

在计算聚合后(但仍应用于搜索结果)执行post_filter,以便您的结果符合您的预期.

聚合仅在搜索查询的范围内工作. (后滤波器尚未应用.)

在条款聚合计算计数之前,filter aggregation会从搜索查询结果中排除与FILTER匹配的所有文档.

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

网友评论