一、查询建议介绍

1. 查询建议是什么?

查询建议,为用户提供良好的使用体验。主要包括: 拼写检查; 自动建议查询词(自动补全)

拼写检查如图:

自动建议查询词(自动补全):

2. ES中查询建议的API

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

示例1:定义单个建议查询词

POST twitter/_search
{"query" : {"match": {"message": "tring out Elasticsearch"}},"suggest" : { <!-- 定义建议查询 -->"my-suggestion" : { <!-- 一个建议查询名 -->"text" : "tring out Elasticsearch", <!-- 查询文本 -->"term" : { <!-- 使用词项建议器 -->"field" : "message" <!-- 指定在哪个字段上获取建议词 -->}}}
}

示例2:定义多个建议查询词

POST _search
{"suggest": {"my-suggest-1" : {"text" : "tring out Elasticsearch","term" : {"field" : "message"}},"my-suggest-2" : {"text" : "kmichy","term" : {"field" : "user"}}}
}

示例3:多个建议查询可以使用全局的查询文本

POST _search
{"suggest": {"text" : "tring out Elasticsearch","my-suggest-1" : {"term" : {"field" : "message"}},"my-suggest-2" : {"term" : {"field" : "user"}}}
}

二、Suggester 介绍

1. Term suggester

term 词项建议器,对给入的文本进行分词,为每个词进行模糊查询提供词项建议。对于在索引中存在词默认不提供建议词,不存在的词则根据模糊查询结果进行排序后取一定数量的建议词。

常用的建议选项:

示例1:

POST twitter/_search
{"query" : {"match": {"message": "tring out Elasticsearch"}},"suggest" : { <!-- 定义建议查询 -->"my-suggestion" : { <!-- 一个建议查询名 -->"text" : "tring out Elasticsearch", <!-- 查询文本 -->"term" : { <!-- 使用词项建议器 -->"field" : "message" <!-- 指定在哪个字段上获取建议词 -->}}}
}

2. phrase suggester

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

示例1:

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

结果1:

{"took": 177,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 2,"max_score": 1,"hits": [{"_index": "ftq","_type": "_doc","_id": "2","_score": 1,"_source": {"title": "java spring boot","content": "lucene is writerd by java"}},{"_index": "ftq","_type": "_doc","_id": "1","_score": 1,"_source": {"title": "lucene solr and elasticsearch","content": "lucene solr and elasticsearch for search"}}]},"suggest": {"myss": [{"text": "java sprin boot","offset": 0,"length": 15,"options": [{"text": "java spring boot","score": 0.20745796}]}]}
}

3. 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"}}}}
}

Input 指定输入词 Weight 指定排序值(可选)

PUT music/_doc/1?refresh
{"suggest" : {"input": [ "Nevermind", "Nirvana" ],"weight" : 34}
}

指定不同的排序值:

PUT music/_doc/1?refresh
{"suggest" : [{"input": "Nevermind","weight" : 10},{"input": "Nirvana","weight" : 3}]}

放入一条重复数据

PUT music/_doc/2?refresh
{"suggest" : {"input": [ "Nevermind", "Nirvana" ],"weight" : 20}
}

示例1:查询建议根据前缀查询:

POST music/_search?pretty
{"suggest": {"song-suggest" : {"prefix" : "nir", "completion" : { "field" : "suggest" }}}
}

结果1:

{"took": 25,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 0,"max_score": 0,"hits": []},"suggest": {"song-suggest": [{"text": "nir","offset": 0,"length": 3,"options": [{"text": "Nirvana","_index": "music","_type": "_doc","_id": "2","_score": 20,"_source": {"suggest": {"input": ["Nevermind","Nirvana"],"weight": 20}}},{"text": "Nirvana","_index": "music","_type": "_doc","_id": "1","_score": 1,"_source": {"suggest": ["Nevermind","Nirvana"]}}]}]}
}

示例2:对建议查询结果去重

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

结果2:

{"took": 4,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 0,"max_score": 0,"hits": []},"suggest": {"song-suggest": [{"text": "nir","offset": 0,"length": 3,"options": [{"text": "Nirvana","_index": "music","_type": "_doc","_id": "2","_score": 20,"_source": {"suggest": {"input": ["Nevermind","Nirvana"],"weight": 20}}}]}]}
}

示例3:查询建议文档存储短语

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}
}

查询3:

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

结果3:

{"took": 3,"timed_out": false,"_shards": {"total": 5,"successful": 5,"skipped": 0,"failed": 0},"hits": {"total": 0,"max_score": 0,"hits": []},"suggest": {"song-suggest": [{"text": "lucene s","offset": 0,"length": 8,"options": [{"text": "lucene so cool","_index": "music","_type": "_doc","_id": "3","_score": 20,"_source": {"suggest": {"input": ["lucene solr","lucene so cool","lucene elasticsearch"],"weight": 20}}},{"text": "lucene solr cool","_index": "music","_type": "_doc","_id": "4","_score": 10,"_source": {"suggest": {"input": ["lucene solr cool","lucene elasticsearch"],"weight": 10}}}]}]}
}

转载于:https://www.cnblogs.com/leeSmall/p/9206646.html

elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)相关推荐

  1. 绘制系列(五)-DrawText()详解

    绘制系列(五)-DrawText()详解 文字基础知识 1.setTextAlign() 设置文字对齐方式(起始点相对于文字) canvas.drawText("文字",起始点,p ...

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

    文章目录 查询建议是什么 ES查询建议API Suggester介绍 term suggester phrase suggester completion suggester 自动补全 查询建议是什么 ...

  3. ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解...

    墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门.索引管理.映射详解,本文详细介绍ElasticSearch的索引别名.分词器.文档管理.路由.搜索详解. 一.索引别名 1. ...

  4. Docker系列07—Dockerfile 详解

    Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...

  5. 阿里架构总监一次讲透中台架构,13页PPT精华详解,建议收藏

    阿里架构总监一次讲透中台架构,13页PPT精华详解,建议收藏 https://www.toutiao.com/i6733390971112784391/?tt_from=weixin&utm_ ...

  6. ElasticSearch预警服务-Watcher详解-Schedule配置

    介绍 Watcher服务详解-定时器的设定 关于Schedule配置选择,Watcher提供了丰富的时间语法支持,采用UTC时间,来我们一起看下如何设置: 支持的设置方式: hourly:按小时周期设 ...

  7. Landsat系列数据级别详解

    Landsat系列数据级别详解 转载自此文:https://www.cnblogs.com/icydengyw/p/12056211.html 一.Landsat Collection 1 Lands ...

  8. 极智AI | 量化实现分享五:详解格灵深瞳 EQ 量化算法实现

    欢迎关注我的公众号 [极智视界],回复001获取Google编程规范   O_o   >_<   o_O   O_o   ~_~   o_O   大家好,我是极智视界,本文剖析一下格灵深瞳 ...

  9. 应用架构、业务架构、技术架构和业务流程图详解「建议收藏」

    应用架构.业务架构.技术架构和业务流程图详解「建议收藏」 应用架构(ApplicationArchitecture)是描述了IT系统功能和技术实现的内容.应用架构分为以下两个不同的层次:企业级的应用架 ...

  10. PointNet系列代码复现详解(1)—PointNet分类部分

    想尽快入门点云,因此就从这个经典的点云处理神经网络开始.源码已经有了中文注释,但在一些对于自己不理解的地方添加了一些注释.欢迎大家一起讨论. 代码是来自github:GitHub - yanx27/P ...

最新文章

  1. (初学者)安装hadoop集群注意事项
  2. jQuery常用的方法
  3. 为知笔记 Markdown 新手指南
  4. 百度网盘搜索源码,新加分词功能,内容相关度聚合更高
  5. conda不是内部文件或外部命令_Fastqc文件数据质量质检
  6. plsql查询不显示结果_管理NVivo的查询结果
  7. Docker系列之一:在线安装docker和下载镜像
  8. CreatePipe、CreateProcess函数
  9. opencv 骨架提取/图片细化 代码
  10. Prometheus:Java调用PromQL工具类(瞬时数据查询)
  11. 13 Django之中间件
  12. python 输出秒 转成时分秒格式(1时40分21秒)
  13. 一文尽览!弱监督语义/实例/全景分割全面调研(2022最新综述)
  14. 装机不求人,10 分钟电脑配置挑选速成攻略
  15. python实现滑块移动操作
  16. Unity3d--实现第三人称视角(相机跟随)
  17. 【stata笔记】从规律混乱的字符串中提取某个类别的字符(以CGSS2010的地区变量为例)
  18. 12.9 Daily Scrum
  19. 孕妇php是什么意思,关于孕妇
  20. RabbitMQ 基础学习七:路由(Router)模式

热门文章

  1. Java类集框架 —— LinkedList源码分析
  2. [转] c#中 多线程访问winform控件
  3. Android中垃圾回收日志信息
  4. 如何判断Customer和Administor
  5. 管理Exchange 2003客户端访问
  6. 深入理解计算机系统学习记录(一)
  7. Spring AOP 本质(3)
  8. Javascript实现浏览器菜单命令
  9. 用 SpringBoot,亲自打造一个在线题库系统
  10. 单片机设置12分频c语言,AT89C51单片机,如何实现延迟一秒