什么是搜索建议
- 现代的搜索引擎,一般都会提供 Suggest as you type 的功能
- 帮助用户在输入搜索的过程中,进行自动补全或者纠错。通过协助用户输入更加精准的关键词,提高后续搜索阶段文档匹配的程度
- 在 google 上搜索,一开始会自动补全。当输入到一定长度,如因为单词拼写错误无法补全,就会开始提示相似的词或者句子、
Elasticsearch Suggester API
- 搜索引擎中类似的功能,在 ES 中通过 Sugester API 实现的
- 原理:将输入的文档分解为 Token,然后在索引的字段里查找相似的 Term 并返回
- 根据不同的使用场景,ES 设计了 4 种类别的 Suggesters
- Term & Phrase Suggester
- Complete & Context Suggester
Term Suggester
- Suggester 就是一种特殊类型的搜索。“text” 里是调用时候提供的文本,通常来自用户界面上用户输入的内容
- 用户输入的 “lucen” 是一个错误的拼写
会到 指定的字段 “body” 上搜索,当无法搜索到结果时(missing),返回建议的词
//插入数据
POST article/_bulk
{"index":{}}
{"body":"lucene is very cool"}
{"index":{}}
{"body":"Elasticsearch builds on top of lucene"}
{"index":{}}
{"body":"Elasticsearch rocks"}
{"index":{}}
{"body":"elastic is the company behind ELK stack"}
{"index":{}}
{"body":"Elk stack rocks"}
{"index":{}}
{"body":"elasticsearch is rock solid"}
//suggest
POST article/_search
{
"size": 1,
"query": {"match": { "body": "lucen rock" }
},
"suggest": {"term-suggestion": { "text": "lucen rock", "term": { "suggest_mode": "missing", // popular always "field": "body" } }
}
}
//返回结果
"suggest" : {"term-suggestion" : [ { "text" : "lucen", "offset" : 0, "length" : 5, "options" : [ { "text" : "lucene",//推荐了 "score" : 0.8, "freq" : 2 } ] }, { "text" : "rock",//没有推荐 "offset" : 6, "length" : 4, "options" : [ ] } ]
}
搜索 “lucen rock”:
- 每个建议都包含了一个算分,相似性是通过 Levenshtein Edit Distance 的算法实现的。核心思想就是一个词改动多少字段就可以和另外一个词一致。提供了很多可选参数来控制相似性的模糊程度。
几种 Suggestion Mode
- Missing - 如索引中已存在,就不提供建议
- Popular - 推荐出现频率更加高的词
- Always - 无论是否存在,都提供建议
POST article/_search
{
"suggest": {"term-suggestion": { "text": "lucen rock", "term": { "suggest_mode": "popular", "field": "body" } }
}
}
//返回
"suggest" : {"term-suggestion" : [ { "text" : "lucen", "offset" : 0, "length" : 5, "options" : [ { "text" : "lucene", "score" : 0.8, "freq" : 2 } ] }, { "text" : "rock", "offset" : 6, "length" : 4, "options" : [ { "text" : "rocks", "score" : 0.75, "freq" : 2 } ] } ]
}
Phrase Suggester
- Phrase Suggesetr 上增加了一些额外的逻辑
一些参数
- Suggeset Mode : missing,popular ,always
- Max Errors: 最多可以拼错的 Terms 数
- Condfidence : 限制返回结果数,默认为 1
POST /articles/_search
{
"suggest": {"my-suggestion": { "text": "lucne and elasticsear rock hello world ", "phrase": { "field": "body", "max_errors":2, "confidence":0, "direct_generator":[{ "field":"body", "suggest_mode":"always" }], "highlight": { "pre_tag": "<em>", "post_tag": "</em>" } } }
}
}
一些测试数据
- 默认使用 standard 分词器
- 大写转小写
- rocks 和 rock 是两个词
© 著作权归作者所有
发表评论