elasticsearch ngram analyzer返回意外结果

时间:2015-11-28 14:47:40

标签: elasticsearch

我正在使用ngram分析器进行索引,使用标准分析器进行查询。

目前我已将多部电话和iphone编入索引。

当我搜索iphone时,得分和因特网的相关性高于iphone。

如何构建查询以获得更高的iPhone分数?

我执行的查询是

"query": {
   "filtered": {
     "query": {
       "multi_match": {
         "query": "iphone",
           "fields": [
               "englishName",
               "aliasName"
            ]
        }
     },

我需要的是iphone得分高于多部电话。

性能怎么样?

1 个答案:

答案 0 :(得分:0)

我已回答类似问题here

基本上,您需要将字段的原始版本添加到映射中。您可以将keyword analzyerlowercase filter一起使用,也可以将其设为"index" : "not_analyzed",甚至可以使用默认的标准分析器。

然后你进行bool查询并为exact match添加一个条款,它会得分更高。

编辑示例

您可以将您的englishName字段映射为

englishName: {
    type: 'string',
    index_analyzer: 'ngram_analyzer',
    search_analyzer: 'standard',
    "fields": {
        "raw": {
            "type": "string",
            "index" : "not_analyzed" <--- here
        }
    }
}

您可以使用aliasName执行相同操作 然后你的查询看起来像这样

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "iphone",
            "fields": [
              "englishName",
              "aliasName"
            ]
          }
        },
        {
          "multi_match": {
            "query": "iphone",
            "fields": [
              "englishName.raw",
              "aliasName.raw"
            ],
            "boost": 5
          }
        }
      ]
    }
  }
}
使用此查询

iphone 将获得更高分数

希望这会有所帮助。