弹性搜索中精确,语音和模糊匹配的自定义分数

时间:2018-03-25 05:31:58

标签: elasticsearch

我有一个要求,需要在名称上进行自定义评分。为了简单起见,我可以说,如果我搜索史密斯'对于索引中的名称,逻辑应该是:

if input = exact 'Smith' then score = 100%
else
 if input = phonetic match then
   score = <depending upon fuzziness match of input with name>% 
 end if
end if;

我能够搜索模糊度为1的文档,但我不知道如何根据它的模糊程度给出自定义分数。谢谢!

更新: 我经历了一个与我的要求相同的帖子,并提到该人通过使用本机脚本解决了它。我的问题仍然存在,如何根据相似距离实际得到分数,以便可以在原生脚本中使用:

该职位: https://discuss.elastic.co/t/fuzzy-query-scoring-based-on-levenshtein-distance/11116

帖子中要查找的文字: &#34;对于未来的读者,我通过创建自定义分数查询解决了这个问题 编写(本机)脚本来处理评分。&#34;

1 个答案:

答案 0 :(得分:0)

您可以使用rescore函数查询(docs here)来实现此搜索逻辑。

这里有一个可能的例子:

    {
    "query": {
        "function_score": {
          "query": { "match": {
            "input": "Smith"
          } },
          "boost": "5", 
          "functions": [
              {
                  "filter": { "match": { "input.keyword": "Smith" } },
                  "random_score": {}, 
                  "weight": 23
              }
          ]
        }
      }
   }

在这个例子中,我们有一个映射,输入字段索引为text和keyword(input.keyword用于完全匹配)。我们重新评分完全匹配术语的文件&#34; Smith&#34;与第一个查询匹配的所有文档相比得分更高(在示例中是匹配,但在您的情况下将是具有模糊性的查询)。

您可以控制调整权重参数的重新评分效果。