热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Elasticsearch搜索引擎第十一篇Suggest查询建议

文章目录查询建议是什么ES查询建议APISuggester介绍termsuggesterphrasesuggestercompletionsuggester自动补全查询建议是什么查

文章目录

  • 查询建议是什么
  • ES查询建议API
  • Suggester介绍
    • term suggester
    • phrase suggester
    • completion suggester 自动补全
查询建议是什么

查询建议,能够为用户提供良好的使用体验。主要包括:

  • 拼写检查
  • 自动建议查询词(自动补全)

如百度、谷歌搜索:
《Elasticsearch搜索引擎第十一篇-Suggest查询建议》
《Elasticsearch搜索引擎第十一篇-Suggest查询建议》

ES查询建议API

查询建议也是使用_search端点地址,在DSL中suggest节点来定义需要的建议查询。

POST twitter/_search
{
"query" : {
"match": {
"message": "tring out Elasticsearch"
}
},
"suggest" : {
"my-suggestion" : { #一个查询建议名称
"text" : "tring out Elasticsearch", #查询文本
"term" : {
"field" : "message" #指定在哪个字段上获取建议词
}
}
}
}
#多个建议查询可以使用全局的查询文本
POST _search
{
"suggest": {
"text" : "tring out Elasticsearch",
"my-suggest-1" : {
"term" : {
"field" : "message"
}
},
"my-suggest-2" : {
"term" : {
"field" : "user"
}
}
}
}
Suggester介绍

term suggester

term 词项建议器,对给入的文本进行分词,为每个词进行模糊查询提供词项建议。对于在索引中存在词默认不提供建议词,不存在的词则根据模糊查询结果进行排序后取一定数量的建议词。
常用的建议选项:
《Elasticsearch搜索引擎第十一篇-Suggest查询建议》

phrase suggester

phrase 短语建议,在term的基础上,会考量多个term之间的关系,比如是否同时出现在索引的原文里,相邻程度,以及词频等

POST /ftq/_search
{
"query": {
"match_all": { }
},
"suggest" : {
"myss":{
"text": "java sprin boot",
"phrase": {
"field": "title"
}
}
}
}

completion suggester 自动补全

针对自动补全场景而设计的建议器。此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。因此实现上它和前面两个Suggester采用了不同的数据结构,索引并非通过倒排来完成,而是将analyze过的数据编码成FST和索引一起存放。对于一个open状态的索引,FST会被ES整个装载到内存里的,进行前缀查找速度极快。但是FST只能用于前缀查找,这也是Completion Suggester的局限所在。

参考官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html

为了使用自动补全,索引中用来提供补全建议的字段需特殊设计,字段类型为 completion。

定义一个索引:

PUT music
{
"mappings": {
"_doc" : {
"properties" : {
"suggest" : {
"type" : "completion" #定义该字段是自动补全的字段
},
"title" : {
"type": "keyword"
}
}
}
}
}

存入文档1和文档2,两个文档内容一样:

PUT music/_doc/1?refresh
{
"suggest" : {
"input": [ "Nevermind", "Nirvana" ], #指定输入值
"weight" : 34 #指定排序值(可选)
}
}
PUT music/_doc/2?refresh
{
"suggest" : {
"input": [ "Nevermind", "Nirvana" ],
"weight" : 20
}
}

查询看看:

POST music/_search?pretty
{
"suggest": {
"song-suggest" : {
"prefix" : "nir",
"completion" : {
"field" : "suggest"
}
}
}
}
POST music/_search?pretty
{
"suggest": {
"song-suggest" : {
"prefix" : "nir",
"completion" : {
"field" : "suggest",
"skip_duplicates": true #去重
}
}
}
}

接着存入文档3和文档4,存的是短语:

PUT music/_doc/3?refresh
{
"suggest" : {
"input": [ "lucene solr", "lucene so cool","lucene elasticsearch" ],
"weight" : 20
}
}
PUT music/_doc/4?refresh
{
"suggest" : {
"input": ["lucene solr cool","lucene elasticsearch" ],
"weight" : 10
}
}

再查询看看:

POST music/_search?pretty
{
"suggest": {
"song-suggest" : {
"prefix" : "lucene s",
"completion" : {
"field" : "suggest" ,
"skip_duplicates": true
}
}
}
}

推荐阅读
author-avatar
AdrianFree覀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有