按条件而不是整个领域进行汇总

时间:2018-06-27 08:45:39

标签: elasticsearch

我有一个产品索引(ES 6.3),其中一些产品名称看起来像这样TomatoTomatosoupTomatojuice等。我正在努力实现,例如,当我查询术语Toma时,是为了获得最匹配的术语的集合,而不是整个产品名称。

要实现这一点,我有以下映射:

{
  "name": {
    "type": "text",
    "analyzer": "custom-ngram" // Defined in the mapping
    "search-analyzer": "standard",
    "fields": {
      "suggestion": {
        "type": "text",
        "fielddata": true,
        "analyzer": "standard"
      }
    }
  }
}

我的查询如下:

{
  "query": {
    "bool": {
      "must":{
        "multi_match": {
          "query": "tom",
          "fields": ["name^3", "description"]
        }
      }
    }
  },
  "aggs": {
    "suggestions": {
      "terms": {
        "field": "name.suggestion",
        "include": "tom.*", 
        "size": 10
      }
    }
  },
  "size": 0
}

实际上这可以使我得到所需的东西,但我有两个担忧:

  1. 根据ES文档,不鼓励使用fielddata
  2. 使用includes指令来实际过滤聚合桶

这是继续解决此问题的正确方法,还是方法完全错误?有没有针对此问题的最佳实践?

0 个答案:

没有答案