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匹配的所有文档.
(给你上面显示的维恩的左外边缘,但只是为了计数)