笔记二十七:Term & Phrase Suggester
什么是搜索建议
- 现代的搜索引擎,一般都会提供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是两个词
本作品采用《CC 协议》,转载必须注明作者和本文链接
为什么我在中文的文本上,Term & Phrase Suggester就都不生效了呢.