Elasticsearch应用(十一)
1.什么是自动补全
现代的搜索引擎,一般都会提供Suggest as you type的功能
帮助用户在输入搜索的过程中,进行自动补全或者纠错。通过协助用户输入更加精准的关键词,提高后续搜索阶段文档的匹配程度
在goole上搜索,一开始会自动补全。当输入到一定长度,如因为单词拼写错误无法补全,就会开始提示相似的词或句子
2.ES自动补全介绍
Elasticsearch提供了Completion Suggester查询来实现自动补全功能。这个查询会匹配以用户输入内容开头的词条并返回
原理:将输入的文本分解为Token,然后在索引的字典查找相似的term并返回
一个请求可以指定多个suggest
3.四种类别的Suggesters
- Term与Phrase Suggester
- Completer与Context Suggester
4.建议模式(Suggestion Mode)
- Missing: 如果搜索字符串在索引中已经存在,就不提供建议
- Popular: 推荐出现频率更加高的词
- Always: 无论是否存在,都提供建议
5.Suggestion核心
- 每个建议都包含了一个算分
- 相似性是通过Levenshtein Edit Distance的算法实现的
- 核心思想就是一个词改动多少字符可以和另一个词一致。
- 提供了很多可选参数来控制相似性的模糊程度。例如“max_edits”
6.Completer补全
缺点
只能匹配前缀进行补全
字段要求
- 参与补全查询的字段必须是completion类型
- 字段的内容一般是用来补全的多个词条形成的数组
- 在Java中建议使用List<String>来对应补全类型,在构造方法中把部分字段内容添加到List中
补全查询语法
拼音补全注实战
自动补全字段可以通过自定义分词器来更好的使用,使用keyword是因为自动补全字段插入到ES的时候不需要分词,使用自定义拼音分词器是因为要完成基于拼音的补全
7.Term补全
请求格式
POST /<index>/_search
{
"suggest":{
"<suggest>":{
"text":"搜索字符串",
"term":{
"suggest_mode":"<suggest_mode>",
"field":"<field>",
"prefix_length":"前缀的匹配数,默认为1"
}
}
}
}
请求参数
- prefix_length: 前缀的匹配数,默认为1
7.Phrase Suggester
介绍
- 在Term Suggester上增加了一些额外逻辑
- 例如参数:Max Errors,Confidence
请求格式
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>"
}
}
}
}
}
请求参数
- Max Errors: 最多可以拼错的Term数