【问题标题】:elasticsearch ngram analyzer return unexpected resultelasticsearch ngram 分析器返回意外结果
【发布时间】:2015-11-29 01:04:52
【问题描述】:

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

目前我已经索引了 multiphone 和 iphone。

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

我应该如何构建查询以获得更高的 iphone 分数?

我执行的查询是

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

我需要的是iphone得分高于multiphone。

性能怎么样?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我已经回答了类似的问题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 将通过此查询获得更高的分数

    希望这会有所帮助。

    【讨论】:

    • 我的意思是按原样索引字符串而不是分析它,对此感到抱歉。
    • 您能否举个具体的例子
    • 我已经更新了答案,如果您遇到任何问题,请告诉我
    • 对于原始版本使用标准索引分析器怎么样?
    猜你喜欢
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多