赞成弹性搜索中nGram的完全匹配

时间:2014-09-30 21:48:48

标签: elasticsearch n-gram

我正在尝试将字段映射为nGram和'exact'匹配,并使完全匹配首先显示在搜索结果中。这是一个answer to a similar question,但我很难让它发挥作用。

无论我为'exact'字段指定了什么增值,我每次都会获得相同的结果顺序。这是我的字段映射的外观:

"name" : {
    "type" : "multi_field",
    "fields" : {
      "name" : {
        "type" : "string",
        "boost" : 2.0,
        "analyzer" : "ngram"
      },
      "exact" : {
        "type" : "string",
        "boost" : 4.0,
        "analyzer" : "simple",
        "include_in_all" : false
      }
    }
  }

这就是查询的样子:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "fields":["name","name.exact"],
                    "query":"Woods"
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

低估计算得分的方式

Elasticsearch可以选择为每个搜索结果生成解释。通过将explain参数设置为true

POST  <Index>/<Type>/_search?explain&format=yaml
{
"query" : " ....."
}

它会为每次击中产生大量输出,这可能会让人不知所措,但值得花一些时间来理解它的含义

eplian的输出可能更难以在json中读取,因此添加format = yaml使其更易于阅读

了解文档匹配的原因

您可以将查询传递给下面的特定文档,以了解如何进行匹配。

GET <Index>/<type>/<id>/_explain
{
"query": "....."
}

答案 1 :(得分:2)

多字段映射是正确的,但搜索查询需要像这样更改:

{
    "query": {
        "filtered": {
            "query": {
                "multi_match": { # changed from "query_string"
                    "fields": ["name","name.exact"],
                    "query": "Woods",
                    # added this so the engine does a "sum of" instead of a "max of"
                    # this is deprecated in the latest versions but works with 0.x
                    "use_dis_max": false
                }
            }
        }
    }
}

现在结果考虑了'确切'匹配并加起来得分。