如果在弹性搜索中选择阵列字段的另一个聚合选项,如何获取将添加
假设我们有四个带有标签字段的文档.它可以包含多个字符串,比如说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,docD).这就是我想要的. 但我还得到了另一个可能的聚合列表,其中包含更新的计数. buckets = [ {key: 'bar',doc_count: 1},// docC {key: 'baz',// docD ] 但这些计数与发生的事情并不完全一致.它们反映了与两个标签匹配的文档数量,我首先选择的标签(foo)和一个标签(bar或baz). 但是,如果我然后选择第二个标签 – 让我们说巴兹 – 我得到的文件已被foo或baz标记.那是因为我使用了术语过滤器. 所以我真正想要的是这个 buckets = [ {key: 'bar',//docB {key: 'baz',doc_count: 0},] 我怎样才能实现计数合适.如果我选择第二个标记,它们应该反映将添加的文档数.一个例子是here. 我已经尝试过使用post_filter,但这总是给我第一个结果.比aggs的min_doc_count-flag,但这只显示了导致count = 0的组合. 我有一个解决方案,但对我来说似乎很复杂.为此,我将不得不为每个聚合运行另一个请求,其中我反转过滤条件.因此,在上面的示例中,我必须对没有标记foo的所有文档进行查询,并匹配查询的其余部分.聚合结果正是我所需要的. 解决方法
听起来你正在尝试为facet / aggregations做一些非典型的事情.
(但是,它并不是无效的……通过应用滤波器来理解选择的大小将如何改变是很有意义的) 我认为你要求的是: >显示结果:QUERY AND FILTER 你提到你正在做关于计数的后续请求吗?您应该能够在主搜索请求中构建此聚合请求. 结构上它是: >匹配:(QUERY)或match_all > filter:{not:(FILTER)} >聚合:{terms:…} > post_filter :(过滤器) 在计算聚合后(但仍应用于搜索结果)执行post_filter,以便您的结果符合您的预期. 聚合仅在搜索查询的范围内工作. (后滤波器尚未应用.) 在条款聚合计算计数之前,filter aggregation会从搜索查询结果中排除与FILTER匹配的所有文档. (给你上面显示的维恩的左外边缘,但只是为了计数) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |