ElasticSearch中的模糊搜索:为什么输入错误还能搜索出来?

时间:2024-12-17 21:15:11

引言

在日常搜索中,用户经常会因为拼写错误或输入笔误导致搜索结果不准确。然而,ElasticSearch 提供了一种非常智能的模糊搜索(Fuzzy Search)功能,使得即使关键词输入错误,依然能够返回准确或接近的结果。这篇文章将深入探讨 ElasticSearch 是如何做到这一点的,并介绍如何实现搜索结果的纠错提示。


1. 什么是模糊搜索?

模糊搜索是一种搜索技术,允许用户即使在输入时存在拼写错误或笔误,也能够找到与之相近的匹配结果。

常见的应用场景

  • 用户输入拼写错误,例如搜索“tesing”而不是“testing”。
  • 用户不确定正确的拼写,例如搜索“analyse”而不是“analyze”。
  • 搜索时存在同音字或者形近字问题。

2. ElasticSearch如何实现模糊搜索?

编辑距离算法

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 ,你可以对一个单词进行如下三种操作

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

以下是一个编辑距离算法的举例

输入: word1 = "horse", word2 = "ros"
输出: 3
解释: 
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

将 “horse” 转换为 “ros”,需要 3 次替换操作,因此它们的编辑距离为 3

基于相似度的查询

在 ElasticSearch 中,可以通过fuzzy进行相似度查询,fuzzy是基于编辑距离的

下面我们就是用fuzzy进行相似度查询

GET  logstash-village-2022.08.22/_search
{
  "query": {
    "fuzzy": {
      "name":"龙源居住区"
    }
  }
}

同时可以指定fuzziness参数,来确定每次查询允许的最大编辑距离,只要在这个距离范围之内的文档,都能被检索到

GET /my_index/_search
{
  "query": {
    "match": {
      "name": {
        "query": "cot",
        "fuzziness": "AUTO"
      }
    }
  }
}

工作原理

  1. 分词与索引阶段:ElasticSearch 将文档内容分词,并为每个分词建立倒排索引。
  2. 查询阶段:当用户输入搜索词时,ElasticSearch 根据 fuzziness 参数,生成多个可能的变体。
  3. 匹配与评分:ElasticSearch 通过计算编辑距离和相关性评分,返回最接近的匹配结果。

3. ElasticSearch中的纠错提示功能

纠错提示功能是什么

纠错是指在用户提交了错误的词项时给出正确词项的提示,而输入提示则是在用户输入关键字时给出智能提示,甚至可以将用户未输入完的内容自动补全

ES中的实现

ElasticSearch 提供了建议器(Suggester) 功能,用于给出搜索纠错提示,帮助用户在拼写错误时获得正确的搜索建议。

下面就是使用纠错提示,我们输入龙源居住区,整体给出如下的提示选项

GET logstash-village-2022.08.22/_search
{
  "suggest": {
    "name-suggestion": {
      "text": "龙源居住区",
      "term": {
        "field": "name"
      }
    }
  }
}