elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)
一、查询建议介绍
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 介绍)相关推荐
- 绘制系列(五)-DrawText()详解
绘制系列(五)-DrawText()详解 文字基础知识 1.setTextAlign() 设置文字对齐方式(起始点相对于文字) canvas.drawText("文字",起始点,p ...
- Elasticsearch搜索引擎第十一篇-Suggest查询建议
文章目录 查询建议是什么 ES查询建议API Suggester介绍 term suggester phrase suggester completion suggester 自动补全 查询建议是什么 ...
- ElasticSearch最全详细使用教程:入门、索引管理、映射详解、索引别名、分词器、文档管理、路由、搜索详解...
墨墨导读:之前我们分享了ElasticSearch最全详细使用教程:入门.索引管理.映射详解,本文详细介绍ElasticSearch的索引别名.分词器.文档管理.路由.搜索详解. 一.索引别名 1. ...
- Docker系列07—Dockerfile 详解
Docker系列07-Dockerfile 详解 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作 dockerfile,docker build 基于容器制作镜像,已经在上篇Do ...
- 阿里架构总监一次讲透中台架构,13页PPT精华详解,建议收藏
阿里架构总监一次讲透中台架构,13页PPT精华详解,建议收藏 https://www.toutiao.com/i6733390971112784391/?tt_from=weixin&utm_ ...
- ElasticSearch预警服务-Watcher详解-Schedule配置
介绍 Watcher服务详解-定时器的设定 关于Schedule配置选择,Watcher提供了丰富的时间语法支持,采用UTC时间,来我们一起看下如何设置: 支持的设置方式: hourly:按小时周期设 ...
- Landsat系列数据级别详解
Landsat系列数据级别详解 转载自此文:https://www.cnblogs.com/icydengyw/p/12056211.html 一.Landsat Collection 1 Lands ...
- 极智AI | 量化实现分享五:详解格灵深瞳 EQ 量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下格灵深瞳 ...
- 应用架构、业务架构、技术架构和业务流程图详解「建议收藏」
应用架构.业务架构.技术架构和业务流程图详解「建议收藏」 应用架构(ApplicationArchitecture)是描述了IT系统功能和技术实现的内容.应用架构分为以下两个不同的层次:企业级的应用架 ...
- PointNet系列代码复现详解(1)—PointNet分类部分
想尽快入门点云,因此就从这个经典的点云处理神经网络开始.源码已经有了中文注释,但在一些对于自己不理解的地方添加了一些注释.欢迎大家一起讨论. 代码是来自github:GitHub - yanx27/P ...
最新文章
- (初学者)安装hadoop集群注意事项
- jQuery常用的方法
- 为知笔记 Markdown 新手指南
- 百度网盘搜索源码,新加分词功能,内容相关度聚合更高
- conda不是内部文件或外部命令_Fastqc文件数据质量质检
- plsql查询不显示结果_管理NVivo的查询结果
- Docker系列之一:在线安装docker和下载镜像
- CreatePipe、CreateProcess函数
- opencv 骨架提取/图片细化 代码
- Prometheus:Java调用PromQL工具类(瞬时数据查询)
- 13 Django之中间件
- python 输出秒 转成时分秒格式(1时40分21秒)
- 一文尽览!弱监督语义/实例/全景分割全面调研(2022最新综述)
- 装机不求人,10 分钟电脑配置挑选速成攻略
- python实现滑块移动操作
- Unity3d--实现第三人称视角(相机跟随)
- 【stata笔记】从规律混乱的字符串中提取某个类别的字符(以CGSS2010的地区变量为例)
- 12.9 Daily Scrum
- 孕妇php是什么意思,关于孕妇
- RabbitMQ 基础学习七:路由(Router)模式