[ElasticSearch]Suggest查询建议(自动补全纠错)
1) 概念
查询建议,能够为用户提供良好的使用体验。主要包括:
拼写检查(纠错)
自动建议查询词(自动补全)
2) Suggest种类及参数
2.1 Term Suggester
Term Suggester: 对给入的文本进行分词,为每个词进行模糊查询提供词项建议。(建议对搜索词进行长度控制,超过长度则不会进行TermSuggest,原因也是一般Term Suggester适用于单个词使用 把得分最高的推荐词进行返回代表纠错)
参数 | 描述 |
---|---|
text | 建议文本,即要进行推荐建议的文本(推荐控制长度 使用单个词进行搜索推荐)。 |
field | 从哪个字段中获取建议结果,智搜词库中指定的keyword字段 |
analyzer | 分析器 |
size | 建议返回的更正词的最大数量。 |
sort | 排序方式 1.score(默认):首先是按分数进行排序,分数相同按词频(freq)进行排序 2.frequency: 首先按词频进行排序,然后按分数进行排序 |
suggest_mode | 建议模式控制 1.missing(默认): 搜索的词如果本身就存在词库中,则不进行推荐搜索 2.popular:推荐词的词频大于搜索的词的时候才会推荐出来 3.always:根据建议文本中的术语提出任何匹配的建议。 |
max_edits | 允许推荐的词的最大编辑距离 默认为2 |
prefix_length | 必须满足搜索词的前端的多少个字符 |
max_term_freq | 搜索词可以出现在文档中的最大阈值(一般设置为百分比如0.4) 用于过滤高频词 |
min_doc_freq | 最少出现在多少个文档中 |
string_distance | 指定算法进行推荐计算 1.internal: 默认基于 damerau_levenshtein,但高度优化用于比较索引内术语的字符串距离 2.damerau_levenshtein 3.levenshtein 4.jaro_winkler 5. ngram |
2.2 Phrase Suggester
Phrase Suggester:在term的基础上,会考量多个term之间的关系,比如是否同时出现在索引的原文里,相邻程度,以及词频等。
如果说term suggester建议处理单个词的纠错 那么Phrase Suggester就建议作为一整句话的纠错(返回值的suggest列表中返回的也是一整句话)
参数 | 描述 |
---|---|
max_errors | 该句子中拼写错误的术语的最大百分比 如果给定[0,1)的浮点数则为百分比!! 如果>1 则为可拼写错误词的个数!! |
separator | 短语中各个术语的分隔符 默认为空格 可以手动指定 |
highlight | 可以指定高亮 |
2.3 Completion Suggester
Completion Suggester:自动补全的建议器,此场景下用户每输入一个字符的时候,就需要即时发送一次查询请求到后端查找匹配项,在用户输入速度较高的情况下对后端响应速度要求比较苛刻。因此实现上它和前面两个Suggester采用了不同的数据结构。为了使用Completion Suggester,字段的类型需要专门定义如下(当然可以通过fields来指定):
这里比较有意思的一点是:completion并非使用倒排索引,而是将analyze过的数据编码成FST和索引一起存放。也就是直接编码放入内存,这样会导致他是连续的(非倒排的连续索引),这样就可以保证自动补全(利用前缀)的查询速度极快,但是由于他不是倒排索引仅仅只能用于前缀搜索了
接下来我们put数据进行测试
利用completion suggester进行查找
得到结果应该为 Elastic is the company behind...那一条
但是此处如果我们更换analyzer为English
此时我们在此插入并搜索 elastic i 将搜索不到,这是因为 我们前面提过了 它是通过分词器进行分词 并且把连续的词放入内存中以便快速搜索,但是english analyzer会剥离高频词 比如is 所以我们输入 elastic i的时候 输入被分解成"elastic"和"i",FST没有编码这个“i” , 匹配失败。
但是如果查询 elastic is 则会查询到 因为:经过english analyzer的时候is也被剥离了,只需在FST里查询"elastic"这个前缀,自然就可以匹配到了。
2.4 参数
刨析参数之前,值得一提的是:它不仅仅包含前缀查询 还包含以下几种
* prefix前缀:一般就是用于搜索推荐自动补全的 最常用
* fuzzy模糊: 对输入的词进行模糊查询并自动补全
* Regex正则:满足正则表达式的搜索....
prefix参数 | 描述 |
---|---|
field | 推荐结果选取字段 |
size | 最大返回推荐数量 |
skip_duplicates | 是否去重(默认false) |
fuzzy参数 | 描述 |
---|---|
fuzziness | 模糊音字 参考上方的Fuzzy Query中的详解 |
transpositions | 是否允许术语之间的位置交换,默认为ture |
min_length | 输入的最小长度 默认为3 |
prefix_length | 前多少个字符必须完全满足 |
3) 查询语句及返回结果解析
# 通用格式
{"suggest" : {"my-suggestion" : { #一个查询建议名称"text" : "tring out Elasticsearch", #查询文本"term" : { #种类 可以替换为phrase(phrase suggester)/prefix(complite suggester)/fuzzy....."field" : "message" #指定在哪个字段上获取建议词}}}
}
# term
{ "suggest": {"my-suggestion": {"text": "lucne rock","term": {"suggest_mode": "missing","field": "body"}}}
}
# Phrase
{"suggest": {"my-suggestion": {"text": "lucne and elasticsear rock","phrase": {"field": "body","highlight": {"pre_tag": "<em>","post_tag": "</em>"}}}}
}
# completion
POST blogs_completion/_search?pretty
{ "size": 0,"suggest": {"blog-suggest": {"prefix": "elastic i","completion": {"field": "body"}}}
}# 返回结果格式及解析
# 需要注意term suggester返回的结果为术语,而phrase返回的为一段话# term返回结果解析
# 可以看到在options中返回结果集,text即为推荐的结果 score即为得分 frep为推荐词出现的词频
{"suggest":{"my_suggest1":[{"text":"curr","offset":0,"length":4,"options":[{"text":"curry","score":0.75,"freq":6},{"text":"court","score":0.5,"freq":1}]}]}
}# phrase返回结果解析
# 可以看到根据我们的文本进行短语的模糊搜索并给出一整句话!!这是需要注意的和term的区别
{"suggest":{"my_suggest1":[{"text":"curr is good","offset":0,"length":12,"options":[{"text":"curry is good","score":0.007225802},{"text":"court is good","score":0.0033184804}]}]}
}
4) Java SDK
SearchRequest request = new SearchRequest("test_index");SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();// 内层的term以及参数 还有text给定TermSuggestionBuilder termSug = SuggestBuilders.termSuggestion("content").text("查询文本").suggestMode(TermSuggestionBuilder.SuggestMode.ALWAYS).size(10);// 外层suggestSuggestBuilder suggestBuilder = new SuggestBuilder();suggestBuilder.addSuggestion("my_suggest", termSug);// 给入suggest到整个查询中searchSourceBuilder.suggest(suggestBuilder);request.source(searchSourceBuilder);
[ElasticSearch]Suggest查询建议(自动补全纠错)相关推荐
- elasticsearch搜素关键字自动补全(suggest)
elasticsearch搜素关键字自动补全顾名思义 在搜索框搜索时能有提示列表可供选择. 最终效果如下: 该搜索优化功能是elasticsearch自带的即suggest,suggest即存储一个词 ...
- java模糊查询、自动补全的实现
java模糊查询.自动补全的实现 1使用场景 2 maven依赖 3 拼音的工具类 4 模糊搜索具体的实现 5 模糊搜索字段的含义和用法 6 调用 7 工具类提供 8 注意事项 1使用场景 在平时的开 ...
- ElasticSearch六:搜索模板与suggest search(自动补全)、地图位置检索功能实现、FileBeat与LogSteash使用
目录 search template template入门案例 记录template实现重复调用 保存template到ES 调用template执行搜索 查询已定义的template 删除已定义的t ...
- solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现
今天思考实现了下字符加汉字的搜索建议的 实现--思想主要还是昨天的思想,不过这个方法使用的是匹配查询 ,查询速度可能不太理想 /*** * @描述:用于完成拼音加汉字 组合情况的搜索建议 ---尽量少 ...
- es的自动补全查询——DSL语句java代码实现
1.DSL语句 elasticsearch提供了Completion Suggester查询来实现自动补全功能.这个查询会匹配以用户输入内容开头的词条并返回. 为了提高补全查询的效率,对于文档中字段的 ...
- Elasticsearch高级使用-自动补全
一.概念 注意事项 为了避免搜索同音字,搜索时不要使用拼音分词器 二.拼音分词器 官网https://github.com/medcl/elasticsearch-analysis-pinyin 安装 ...
- elasticsearch模仿淘宝、京东、百度、谷歌搜索,自动补全、自动完成
Elasticsearch(简称es)是一款功能强大的开源分布式实时搜索引擎,在日志分析.企业级搜索.时序分析等领域有广泛应用,几乎是各大公司搜索分析引擎的开源首选方案.本文不讲废话,不谈理论,目的在 ...
- elasticsearch基础3——聚合、补全、集群
用于复习快速回顾. 目录 1.数据聚合 1.1.聚合的种类 1.2.DSL实现聚合 1.2.1.Bucket聚合语法 1.2.2.聚合结果排序 1.2.3.query限定聚合范围 1.2.4.Metr ...
- Elasticsearch生产实战(ik分词器、拼音分词、自动补全、自动纠错)
目录 一.IK分词器 1.IK分词器介绍 2.安装 3.使用 4.自定义词库 二.拼音分词器 1.拼音分词器介绍 2.安装 三.自动补全 1.效果演示 2.实战 四.自动纠错 1.场景描述 2.DSL ...
最新文章
- 我国自主研发手机操作系统 960 OS 发布
- Gogs-Windows Server下搭建Git服务器
- php和python写爬虫-python写爬虫方便还是php方便
- cmake (0)简介
- IE 10的新HTML​解析规则​
- 两个很有用的进程间通信函数popen,pclose
- LeetCode 318. 最大单词长度乘积(位运算)
- linux使用设备文件的目录,Linux系统下的/dev目录
- pythondev更新到3_python版本升级到3.7
- 原生 Ajax 封装 和 Axios 二次 封装
- mysqldump的一些用法
- excel两列数据对比找不同_眼睛的救星,Excel怎么快速找出两列数据的不同之处?...
- 半/全加器中的异或门和与门的应用
- 第115章 属性关键字 - SqlListDelimiter
- 玩客云刷linuxARMBIAN当服务器过程记录
- Plane(Fixed Wing) ——ArduPilot——飞行模式
- 一行代码用表情包制作炫酷二维码,详细教程奉上,包学会
- Factory Method vs Abstract Factory
- SEO竞争对手分析及网站SEO优化方案设计分析
- 【Proteus仿真】【51单片机】智能雨刷器设计
热门文章
- GAM调节电路及CABC设置
- 中石油 暑期集训个人赛第一场 题解
- hdp3.1平台安装kylin2.6教程和遇到的问题
- 西门子S7-1200控制四轴伺服程序案例 内容涵盖伺服,步进点动,回原,相对定位,绝对定位,速度模式控制
- 为c/c++程序设置默认头文件
- 湖南艺术职业学院计算机音乐,【音乐会预告】音乐系“韵展新程——计算机音乐制作”视听音乐会...
- python实现计时器
- wxPython的 wx.App 和 wx.PySimpleApp 有什么区别,如何区别使用?
- 周末python培训机构
- 吴恩达机器学习课程笔记(1-10章)