按值过滤汇总

时间:2020-09-25 21:27:33

标签: elasticsearch

我正在尝试创建一个通配符搜索(是,代替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,因此它不会对与"*blu*"不匹配的值进行aggs处理。还是我需要在应用程序中做这件事?

1 个答案:

答案 0 :(得分:1)

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