我过去曾与Solr一起研究过几个基于facet和过滤器的搜索,但我很难与Elasticsearch实现平等。
据我所知,聚合是根据查询结果计算的,如果没有指定查询则全局计算。这很好,但我希望这些聚合的计数基于过滤器的结果。
在Solr中这很简单 - 只需指定查询和过滤器 - 但使用Elasticsearch过滤器对聚合没有影响,文档非常混乱。
以下查询的所需输出是suggestions
存储区作为查询的范围,但其中的结果计数范围限定为指定的filter
:
{
"size": 0,
"query": {
"range": {
"published": {
"gte": "now-1y",
"lt": "now"
}
}
},
"filter": {
{
"term": {
"tag.id": "123"
}
},
{
"term": {
"tag.id": "456"
}
},
},
"aggs": {
"tags": {
"nested": {
"path": "tag"
},
"aggs": {
"suggestions": {
"terms": {
"field": "name",
"size": 10,
"min_doc_count": 1
},
"aggs": {
"id": {
"terms": {
"field": "id",
"size": 1
}
}
}
}
}
}
}
}
并给出了示例映射:
{
"mappings":{
"content":{
"properties":{
"id":{
"type":"string",
"index":"not_analyzed"
},
"title":{
"type":"string"
},
"byline":{
"type":"string",
"index":"not_analyzed"
},
"body":{
"type":"string"
},
"publishedDate":{
"type":"date",
"format":"dateOptionalTime"
},
"tag":{
"type":"nested",
"include_in_parent":true,
"properties":{
"id":{
"type":"integer"
},
"name":{
"type":"string"
}
}
}
}
}
}
}
感谢任何帮助。
答案 0 :(得分:0)
您可以通过以下方式获得预期结果:
filter
部分(实际上相当于post_filter
并且仅在聚合运行后的结果上应用)移动到filter
聚合基本上这应该有效:
{
"size": 0,
"query": {
"range": {
"published": {
"gte": "now-1y",
"lt": "now"
}
}
},
"aggs": {
"tags": {
"nested": {
"path": "tag"
},
"aggs": {
"suggestions": {
"terms": {
"field": "tag.name",
"size": 10,
"min_doc_count": 1
},
"aggs": {
"filtered": {
"filter": {
"terms": {
"tag.id": [
"123",
"456"
]
}
},
"aggs": {
"id": {
"terms": {
"field": "tag.id",
"size": 1
}
}
}
}
}
}
}
}
}
}