使用查询和过滤器确定弹性搜索聚合的范围

时间:2018-01-22 20:27:46

标签: elasticsearch

我试图根据查询和过滤器来确定范围。我能够做到以下几点:

  1. 将聚合作为全局范围限定,但之后我只能指定过滤器以进一步缩小聚合结果集。我无法指定查询(或multi_match)。
  2. 继承整个elasticsearch查询的范围(所以multi_match),但我无法删除整个请求中指定的过滤器。
  3. 以下是1的示例:

    {
      'colors' => {
        global: {},
        aggs: {
          results: {
            filter: {
              bool: {
                must: my_filters_without_this_filter(filter_to_ignore),
              },
            },
            aggs: {
              results: {
                terms: {
                  field: 'color',
                  size: 10,
                },
              },
            },
          },
        },
      },
    }
    

    问题是我无法使用上述内容指定聚合的搜索字符串。

    我的另一个选择就是继承整个查询,但我无法删除过滤器:

    {
        "aggs": {
            "colors": {
                "filter": {
                    "bool": {
                        "must": [, {
                            "terms": {
                                "colors": ["red", "white", "blue", "green"]
                            }
                        }]
                    }
                },
                "aggs": {
                    "results": {
                        "terms": {
                            "field": "colors",
                            "size": 10
                        }
                    }
                }
            },
        },
        "query": {
            "bool": {
                "must": {
                    "function_score": {
                        "boost_mode": "replace",
                        "functions": [{
                            "script_score": {
                                "script": "my_script"
                            }
                        }],
                        "query": {
                            "multi_match": {
                                "query": "",
                                "type": "cross_fields",
                                "fields": ["name^6", "description", "barcode^2"],
                                "operator": "and",
                                "zero_terms_query": "all"
                            }
                        }
                    }
                },
                "filter": {
                    "bool": {
                        "must": [{
                            "terms": {
                                "colors": ["red"]
                            }
                        }]
                    }
                }
            }
        }
    }
    

    在上面的查询中,我想忽略指定的过滤器(红色)以进行聚合。

    是否可以使用全局范围的聚合,还可以指定过滤器和查询?

    我更愿意不为每个请求制作2个弹性搜索查询,但看起来我可能需要这样做。

1 个答案:

答案 0 :(得分:0)

使用post_filter解决,以便在最终过滤器之前构建聚合。