我已经花了整整一个星期的时间没有解决它的希望.我正在关注关于电子商务搜索和分面过滤等的这篇(相当古老的)文章,它到目前为止工作得很好(搜索结果很棒,当在查询中应用过滤器时,聚合效果很好.我正在使用ElasticSearch 6.1.1.
但是因为我想让我的用户在facet上执行多项选择,所以我已经将过滤器移到了post_filter部分.这仍然有效,它正确地过滤结果并准确显示整个文档集的聚合计数.
在StackOverflow上阅读这个问题之后,我意识到我必须使用"过滤"聚合和"特殊"聚合来执行一些疯狂的杂技,以相互修剪聚合以显示正确的计数并允许同时使用多个过滤器.我已经要求对这个问题做一些澄清,但还没有回复(这是一个老问题).
我一直在努力解决的问题是在嵌套字段上获取一组过滤聚合,其中所有方面都使用所有过滤器进行过滤.
我的计划是使用常规聚合(未过滤)并保持选定的构面聚合未经过滤(以便我可以选择多个条目),但过滤所有其他聚合与当前选定的构面,以便我只能显示我仍然可以使用的过滤器应用.
但是,如果我在文档上使用相同的过滤器(工作正常),并将过滤器放在过滤的聚合中,则它们无法按预期工作.这些都是错的.我知道在过滤器之前计算聚合,这就是我在我想要的聚合上复制过滤器的原因.
这是我的查询:
"query": {
"bool": {
"must": [
{
"multi_match": {
"fields": [
"search_data.full_text_boosted^7",
"search_data.full_text^2"
],
"type": "cross_fields",
"analyzer": "full_text_search_analyzer",
"query": "some book"
}
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
这里没什么特别的,它效果很好并且返回相关结果.
这是我的过滤器(在post_filter中):
"post_filter" : {
"bool" : {
"must" : [
{
"nested": {
"path": "string_facets",
"query": {
"bool" : {
"filter" :
[
{ "term" : { "string_facets.facet_name" : "Cover colour" } }, …Run Code Online (Sandbox Code Playgroud)