Suggester
本文是简单介绍并没有操作,参考文档: https://elasticsearch.cn/article/142
suggester是提供合适的建议。例如我们在搜索引擎中,输入我们需要查询的内容,搜索引擎根据用户输入搜索的过程中,进行自动补全或者纠错,通过协助用户输入更精准的关键词,提高后续全文搜索阶段文档匹配的程度。
Suggesters基本的运作原理是将输入的文本分解为token,然后在索引的字典里查找相似的term并返回。 根据使用场景的不同,Elasticsearch里设计了4种类别的Suggester,分别是:
- Term Suggester
- Phrase Suggester
- Completion Suggester
- Context Suggester
Term Suggester
根据用户输入的文本进行分词成各个token,基于索引给出每个token的建议。
下面是一个例子:
POST /blogs/_search
{
"suggest": {
"my-suggestion": {
"text": "lucne rock",
"term": {
"suggest_mode": "missing",
"field": "body"
}
}
}
}
其中suggest
表示在使用建议功能,my-suggestion
自定义建议的名字,text
:放入用户输入文本,term
:表示在使用 Term Suggester
,suggest_mode
使用term建议模式 ,field
使用该字段中的词给出建议。
例如上面将返回:
"suggest": {
"my-suggestion": [
{
"text": "lucne",
"offset": 0,
"length": 5,
"options": [
{
"text": "lucene",
"score": 0.8,
"freq": 2
}
]
},
{
"text": "rock",
"offset": 6,
"length": 4,
"options": []
}
]
}
给出用户输入的lucne rock
的两个建议(被分为两个token),其中lucne
给的建议是lucene
,rock
并没有给出建议。
因为使用的suggest_mode
决定的,他有三个可选择的值
- missing:仅仅提供索引中没有对应词项的建议
- popular:给出一个词频更高的建议(如果索引中没有存在,也是不给出的)
- always:每个token都必须给出建议。
其实这里面有很多的算法,该算法可以很好的推广到推荐系统中,算法是一切。
Phrase Suggester
term suggester是给出每个token建议,而phrase是基于用户的文本给出短语建议,利用各个term的逻辑性,给出完整的短语。
例子
POST /blogs/_search
{
"suggest": {
"my-suggestion": {
"text": "lucne and elasticsear rock",
"phrase": {
"field": "body"
}
}
}
}
当然复杂度要高于term建议,都是学习算法的好帮手。
Completion Suggester
它主要针对的应用场景就是"Auto Completion"自动补全。 此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。因此实现上它和前面两个Suggester采用了不同的数据结构,索引并非通过倒排来完成,而是将analyze过的数据编码成FST和索引一起存放。对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。但是FST只能用于前缀查找,这也是Completion Suggester的局限所在。
其中completion还支持正则、模糊建议等。