首页 > 解决方案 > 按值过滤聚合

问题描述

我正在尝试创建一个通配符搜索(是的代替 ngram,但它的数量会非常低),它将解析来自特定字段的值,按它们的频率排序。

如果我有一个具有属性的文档列表color,其值为“blue”、“bluish”、“red”、“redish”等,我想搜索类似于"*blu*".

我可以先通过该通配符过滤文档,然后使用术语 agg 来获取值及其用法。

{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "color": {
              "value": "*blu*"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "profile_hits": {
      "terms": {
        "field": "color.keyword"
      }
    }
  }
}

此查询将返回结果:"blue", "bluish"。这正是我想要的。

但是,如果颜色字段包含多个值,则会出现问题。假设有一个颜色值为 的文档["blue", "red"]。现在,当我搜索时,"*blu*"我将匹配该文档,这意味着我的搜索"*blu*"将返回"blue", "red"

我明白为什么会这样。我想知道是否有一种方法可以通过相同的通配符进一步过滤 aggs,因此它不会对不匹配的值进行 aggs "*blu*"。或者这是我需要在应用程序中做的事情?

标签: elasticsearch

解决方案


includes正则表达式过滤器在这里对您有用吗?还有免费的excludes

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_regular_expressions_2

"aggs": {
    "profile_hits": {
      "terms": {
        "field": "color.keyword",
        "includes": "*blu*"
      }
    }
  }

推荐阅读