引言
在日常搜索中,用户经常会因为拼写错误或输入笔误导致搜索结果不准确。然而,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"
}
}
}
}
工作原理
- 分词与索引阶段:ElasticSearch 将文档内容分词,并为每个分词建立倒排索引。
- 查询阶段:当用户输入搜索词时,ElasticSearch 根据
fuzziness
参数,生成多个可能的变体。 - 匹配与评分:ElasticSearch 通过计算编辑距离和相关性评分,返回最接近的匹配结果。
3. ElasticSearch中的纠错提示功能
纠错提示功能是什么
纠错是指在用户提交了错误的词项时给出正确词项的提示,而输入提示则是在用户输入关键字时给出智能提示,甚至可以将用户未输入完的内容自动补全
ES中的实现
ElasticSearch 提供了建议器(Suggester) 功能,用于给出搜索纠错提示,帮助用户在拼写错误时获得正确的搜索建议。
下面就是使用纠错提示,我们输入龙源居住区,整体给出如下的提示选项
GET logstash-village-2022.08.22/_search
{
"suggest": {
"name-suggestion": {
"text": "龙源居住区",
"term": {
"field": "name"
}
}
}
}