写在前面
当我们在使用搜索引擎进行的查询到时候,如果是输入错误的话,搜索引擎会给出一些搜索建议,如下:
在es中也提供了类似的功能,叫做suggester API。
1:原理和种类
原理是将查询的信息分为很多个词项,然后按某些规则(比如只有一个字母不同这种)
找到类似的的词汇,提供了四种API,如下:
2:各种suggester API
2.1:term
- 准备测试数据
POST articles/_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" }
测试:
POST articles/_search
{
"suggest": {
"term-suggestion": {
"text": "lucen rock",
"term": {
"suggest_mode": "missing",
"field": "body"
}
}
}
}
这里我们设置了"suggest_mode": "missing"
,该参数的含义是当词项存在时则不返回提示项,所以上面的查询是不会返回rock的提示项的,如下:
suggest_mode的可配置值如下:
1.missing(默认): 搜索的词如果本身就存在词库中,则不进行推荐搜索
2.popular:推荐词的词频大于搜索的词的时候才会推荐出来
3.always:根据建议文本中的术语提出任何匹配的建议。
这里我们将其值修改为popular就可以获取到结果了:
通过edit distance算法实现,核心思想是修改多少个词可以匹配,其中修改多少个词可以通过max_edits
设置,默认为2。
2.2:phrase
phrase是在term的基础上进一步考虑了相隔的单词数等信息,进行推荐,可以认为phrase是对一句话进行推荐。
如下:
POST articles/_search
{
"suggest": {
"term-suggestion11": {
"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>"
}
}
}
}
}
写在后面
参考文章列表
[ElasticSearch]Suggest查询建议(自动补全&纠错) 。