Elasticsearch聚合计数基于过滤器

时间:2016-04-18 16:42:04

标签: elasticsearch lucene faceted-search

我过去曾与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"
                        }
                    }
                }
            }
        }
    }
}

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

您可以通过以下方式获得预期结果:

  1. 保持查询的位置,
  2. 但是将filter部分(实际上相当于post_filter并且仅在聚合运行后的结果上应用)移动到filter聚合
  3. 基本上这应该有效:

    {
      "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
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }