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查询建议(自动补全纠错)相关推荐

  1. elasticsearch搜素关键字自动补全(suggest)

    elasticsearch搜素关键字自动补全顾名思义 在搜索框搜索时能有提示列表可供选择. 最终效果如下: 该搜索优化功能是elasticsearch自带的即suggest,suggest即存储一个词 ...

  2. java模糊查询、自动补全的实现

    java模糊查询.自动补全的实现 1使用场景 2 maven依赖 3 拼音的工具类 4 模糊搜索具体的实现 5 模糊搜索字段的含义和用法 6 调用 7 工具类提供 8 注意事项 1使用场景 在平时的开 ...

  3. ElasticSearch六:搜索模板与suggest search(自动补全)、地图位置检索功能实现、FileBeat与LogSteash使用

    目录 search template template入门案例 记录template实现重复调用 保存template到ES 调用template执行搜索 查询已定义的template 删除已定义的t ...

  4. solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现

    今天思考实现了下字符加汉字的搜索建议的 实现--思想主要还是昨天的思想,不过这个方法使用的是匹配查询 ,查询速度可能不太理想 /*** * @描述:用于完成拼音加汉字 组合情况的搜索建议 ---尽量少 ...

  5. es的自动补全查询——DSL语句java代码实现

    1.DSL语句 elasticsearch提供了Completion Suggester查询来实现自动补全功能.这个查询会匹配以用户输入内容开头的词条并返回. 为了提高补全查询的效率,对于文档中字段的 ...

  6. Elasticsearch高级使用-自动补全

    一.概念 注意事项 为了避免搜索同音字,搜索时不要使用拼音分词器 二.拼音分词器 官网https://github.com/medcl/elasticsearch-analysis-pinyin 安装 ...

  7. elasticsearch模仿淘宝、京东、百度、谷歌搜索,自动补全、自动完成

    Elasticsearch(简称es)是一款功能强大的开源分布式实时搜索引擎,在日志分析.企业级搜索.时序分析等领域有广泛应用,几乎是各大公司搜索分析引擎的开源首选方案.本文不讲废话,不谈理论,目的在 ...

  8. elasticsearch基础3——聚合、补全、集群

    用于复习快速回顾. 目录 1.数据聚合 1.1.聚合的种类 1.2.DSL实现聚合 1.2.1.Bucket聚合语法 1.2.2.聚合结果排序 1.2.3.query限定聚合范围 1.2.4.Metr ...

  9. Elasticsearch生产实战(ik分词器、拼音分词、自动补全、自动纠错)

    目录 一.IK分词器 1.IK分词器介绍 2.安装 3.使用 4.自定义词库 二.拼音分词器 1.拼音分词器介绍 2.安装 三.自动补全 1.效果演示 2.实战 四.自动纠错 1.场景描述 2.DSL ...

最新文章

  1. 我国自主研发手机操作系统 960 OS 发布
  2. Gogs-Windows Server下搭建Git服务器
  3. php和python写爬虫-python写爬虫方便还是php方便
  4. cmake (0)简介
  5. IE 10的新HTML​解析规则​
  6. 两个很有用的进程间通信函数popen,pclose
  7. LeetCode 318. 最大单词长度乘积(位运算)
  8. linux使用设备文件的目录,Linux系统下的/dev目录
  9. pythondev更新到3_python版本升级到3.7
  10. 原生 Ajax 封装 和 Axios 二次 封装
  11. mysqldump的一些用法
  12. excel两列数据对比找不同_眼睛的救星,Excel怎么快速找出两列数据的不同之处?...
  13. 半/全加器中的异或门和与门的应用
  14. 第115章 属性关键字 - SqlListDelimiter
  15. 玩客云刷linuxARMBIAN当服务器过程记录
  16. Plane(Fixed Wing) ——ArduPilot——飞行模式
  17. 一行代码用表情包制作炫酷二维码,详细教程奉上,包学会
  18. Factory Method vs Abstract Factory
  19. SEO竞争对手分析及网站SEO优化方案设计分析
  20. 【Proteus仿真】【51单片机】智能雨刷器设计

热门文章

  1. GAM调节电路及CABC设置
  2. 中石油 暑期集训个人赛第一场 题解
  3. hdp3.1平台安装kylin2.6教程和遇到的问题
  4. 西门子S7-1200控制四轴伺服程序案例 内容涵盖伺服,步进点动,回原,相对定位,绝对定位,速度模式控制
  5. 为c/c++程序设置默认头文件
  6. 湖南艺术职业学院计算机音乐,【音乐会预告】音乐系“韵展新程——计算机音乐制作”视听音乐会...
  7. python实现计时器
  8. wxPython的 wx.App 和 wx.PySimpleApp 有什么区别,如何区别使用?
  9. 周末python培训机构
  10. 吴恩达机器学习课程笔记(1-10章)