elasticsearch拼写纠错之Term Suggester
一、什么是拼写纠错
拼写纠错就是搜索引擎可以智能的感知用户输入关键字的错误,并使用纠正过的关键字进行搜索展示给用户;拼写纠错是一种改善用户体验的功能;
elasticsearch提供了以下不同类型的suggester来完成拼写纠错和自动完成功能;
term suggester主要针对单个的term分词进行纠正的场景;
phrase suggester主要针对整个短语的拼写纠正场景;
completion suggester主要提供一种快速高效的自动提示功能;
二、Term Suggester基于单个词的拼写纠错
Term Suggester会将用户输入的text进行解析分解成单个的word,然后针对每个word进行纠错;
elasticsearch的suggester请求的还是_search端点,要发送一个Term suggester请求,我们需要
1.在body中添加suggest字段;
2.指定我们的suggest的名字,我们可以使用不同的名字同时进行多个拼写纠错, 其最终的执行结果在response中也会使用这个名字进行区分;
3.通过text字段指定要纠正的文本;
4.指定要使用的suggester类型,这里使用term;
5.指定要在哪个字段上进行拼写纠错;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "hots vlna",
"term": {
"field": "content"
}
}
}
}
elasticsearch返回结果中的suggest部分包含对应的结果;
不同名字的suggester在返回结果中作为suggest对象的字段,其作为数组承载每个text分词的建议结果;
每个原始的word作为一个对象,对象会记录原始word的基本信息及所有的建议词;
每个建议词对象会包含文本、打分、出现频率;
{
"suggest" : {
"my_sug" : [
{
"text" : "hots",
"offset" : 0,
"length" : 4,
"options" : [
{
"text" : "host",
"score" : 0.75,
"freq" : 109
},
{
"text" : "http",
"score" : 0.5,
"freq" : 235
},
{
"text" : "https",
"score" : 0.5,
"freq" : 9
},
{
"text" : "hours",
"score" : 0.5,
"freq" : 6
},
{
"text" : "hole",
"score" : 0.5,
"freq" : 5
}
]
},
{
"text" : "vlna",
"offset" : 5,
"length" : 4,
"options" : [
{
"text" : "vlan",
"score" : 0.75,
"freq" : 200
},
{
"text" : "vpna",
"score" : 0.75,
"freq" : 3
},
{
"text" : "vlan1",
"score" : 0.5,
"freq" : 111
},
{
"text" : "vlans",
"score" : 0.5,
"freq" : 11
},
{
"text" : "vlan8",
"score" : 0.5,
"freq" : 10
}
]
}
]
}
}
三、Term Suggester的通用配置选项
Term Suggester基于编辑距离来计算字符串的相似性;如果一个建议词通过更少字符的改变、添加、删除来转变成原始的字符串,那么这就是一个更好的建议词;例如host通过变换t和s的位置变成hots,则二者的编辑距离是1;
text既可以在suggest里边单独设置,也可以在全局设置;
POST blogs/_search
{
"suggest": {
"text": "hots vlna",
"content_sug": {
"term": {
"field": "content"
}
},
"title_sug": {
"term": {
"field": "title"
}
}
}
}
analyzer对text设置的文本进行analyse处理,默认使用field字段的search analyzer;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "hots vlna",
"term": {
"analyzer":"standard",
"field": "content"
}
}
}
}
size设置每个word返回的建议词的数量,默认是5个;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "hots vlna",
"term": {
"analyzer":"standard",
"field": "content",
"size":6
}
}
}
}
sort设置每个word对应的建议词的排序方式,由于每个建议词只包含text、score、freq,这就涉及以哪个字段先排序;
score,先使用score排序,后使用freq排序,最后使用建议词排序;
frequency,先使用freq排序,后使用score排序,最后使用建议词排序;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "hots",
"term": {
"field": "content",
"sort":"frequency"
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "hots",
"offset" : 0,
"length" : 4,
"options" : [
{
"text" : "http",
"score" : 0.5,
"freq" : 235
},
{
"text" : "host",
"score" : 0.75,
"freq" : 109
},
{
"text" : "https",
"score" : 0.5,
"freq" : 9
},
{
"text" : "hours",
"score" : 0.5,
"freq" : 6
},
{
"text" : "hole",
"score" : 0.5,
"freq" : 5
}
]
}
]
}
}
suggest_mode,主要控制针对什么样的词会返回建议词,以及返回那些建议词;
missing,默认的选项,只有输入的词在对应字段的分词中不存在,才有可能返回建议词;
popular,只返回在更多的文档中出现的建议词;
always,任何的建议词都可以返回;
由于vlan322在字段content里已经存在,使用missing模式没有任何返回结果;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan322",
"term": {
"field": "content",
"suggest_mode":"missing"
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "vlan322",
"offset" : 0,
"length" : 7,
"options" : [ ]
}
]
}
}
使用popular模式则会返回对应的建议词;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan322",
"term": {
"field": "content",
"suggest_mode":"popular"
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "vlan322",
"offset" : 0,
"length" : 7,
"options" : [
{
"text" : "vlan0022",
"score" : 0.71428573,
"freq" : 5
},
{
"text" : "vlan30",
"score" : 0.6666666,
"freq" : 14
},
{
"text" : "vlan20",
"score" : 0.6666666,
"freq" : 7
},
{
"text" : "vlan.2",
"score" : 0.6666666,
"freq" : 6
},
{
"text" : "vlan12",
"score" : 0.6666666,
"freq" : 6
}
]
}
]
}
}
四、Term Suggester的专有配置选项
max_edits,主要控制可以包含的最大编辑距离的建议词,可以取值1或者2,默认值为2;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan322",
"term": {
"field": "content",
"max_edits":1
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "htpt",
"offset" : 0,
"length" : 4,
"options" : [
{
"text" : "http",
"score" : 0.75,
"freq" : 235
}
]
}
]
}
}
prefix_length,主要控制原始word的开头多少个字符不参与拼错纠正,默认值为1,提高这个值可以提高性能;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan322",
"term": {
"field": "content",
"prefix_length":2
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "htpt",
"offset" : 0,
"length" : 4,
"options" : [ ]
}
]
}
}
min_word_length,控制建议词的最小字符长度,默认是4;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan32",
"term": {
"field": "content",
"min_word_length":7
}
}
}
}
shard_size,主要控制每个分片返回的建议词的数量,通过增大这个设置数量可以提高建议词的准确性,但是可能会降低整体的性能;默认值跟size保持一致;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan32",
"term": {
"field": "content",
"shard_size":3,
"size":10,
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "vlan32",
"offset" : 0,
"length" : 6,
"options" : [
{
"text" : "vlan30",
"score" : 0.8333333,
"freq" : 14
},
{
"text" : "vlan.2",
"score" : 0.8333333,
"freq" : 6
},
{
"text" : "vlan12",
"score" : 0.8333333,
"freq" : 6
}
]
}
]
}
}
max_inspections,通过与shards_size相乘控制shard级别检测可选建议词的数量,默认值5;没有测试出具体的效果;
min_doc_freq,主要控制返回建议词至少在index中至少多个document中出现过,默认值为0,通过提高这个值可以提高准确率,可以设置具体的值也可以设置百分比;这是一个基于shard level配置选项;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan32",
"term": {
"field": "content",
"min_doc_freq":3
}
}
}
}
{
"suggest" : {
"my_sug" : [
{
"text" : "vlan32",
"offset" : 0,
"length" : 6,
"options" : [
{
"text" : "vlan30",
"score" : 0.8333333,
"freq" : 14
},
{
"text" : "vlan.2",
"score" : 0.8333333,
"freq" : 6
},
{
"text" : "vlan12",
"score" : 0.8333333,
"freq" : 6
},
{
"text" : "vlan2",
"score" : 0.8,
"freq" : 8
},
{
"text" : "vlan10",
"score" : 0.6666666,
"freq" : 55
}
]
}
]
}
}
max_term_freq,主要控制建议词在文档中出现的最多的次数,可以设置具体数值和百分比;默认值0.01f;降低这个值可以排除更多的建议词从而提高性能;这个也是shard级别的配置;
POST blogs/_search
{
"suggest": {
"my_sug": {
"text": "vlan32",
"term": {
"field": "content",
"max_term_freq":1
}
}
}
}
string_distance,设置计算编辑距离的具体算法,可选值有internal、damerau_levenshtein、levenshtein、jaro_winkler、ngram;
elasticsearch拼写纠错之Term Suggester的更多相关文章
- 拼写纠错的利器,BK树算法
BK树或者称为Burkhard-Keller树,是一种基于树的数据结构,被设计于快速查找近似字符串匹配,比方说拼写纠错,或模糊查找,当搜索”aeek”时能返回”seek”和”peek”. 本文首先剖析 ...
- Elasticsearch 5.0 中term 查询和match 查询的认识
Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...
- Elasticsearch学习系列之term和match查询
lasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为book ...
- Elasticsearch 5.x 关于term query和match query的认识
http://blog.csdn.net/yangwenbo214/article/details/54142786 一.基本情况 前言:term query和match query牵扯的东西比较多, ...
- Elasticsearch学习系列之term和match查询实例
Elasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为boo ...
- Elasticsearch(四)优化用户体验
改正用户拼写 Term suggester:词项匹配建议:可以通过wiki的插件来下载wiki上面的单词以及短语,来作为你的拼写提示基础仓库: Phrase suggester:n-gram算法,短语 ...
- elasticsearch 中文 term & completion suggester
Term suggester 创建索引 curl -XPUT 'http://172.16.125.136:9200/term?pretty'创建 mapping curl -XPOST http:/ ...
- ES系列十三、Elasticsearch Suggester API(自动补全)
1.概念 1.补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comple ...
- elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)
一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...
随机推荐
- 工厂为什么要进行计划排产,APS高级计划排程系统的优势作用是什么?
我们每个人的指挥中心是大脑,大脑对我们身体发出各种各样的指令,不停的告诉我们身体去干什么. 那么,一个制造企业的指挥中心是哪里?工厂每天都会接到各种各样的订单,通过几百上千的工人,使用各种设备来生产. ...
- CF1106A Lunar New Year and Cross Counting 题解
Content 试求出在一个 \(n\times n\) 的地图 \(M\) 中,满足 \(1\leqslant i,j\leqslant n\) 且 \(M_{i,j}=M_{i+1,j+1}=M_ ...
- 【LeetCode】1464. 数组中两元素的最大乘积 Maximum Product of Two Elements in an Array (Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力 找最大次大 日期 题目地址:https://le ...
- 【LeetCode】981. Time Based Key-Value Store 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典 日期 题目地址:https://leetcod ...
- 【LeetCode】808. Soup Servings 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/soup-serv ...
- 【LeetCode】33. Search in Rotated Sorted Array 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
- 终于做了一把MySQL调参boy
本文通过笔者经历的一个真实案例来介绍一个MySQL中的重要参数innodb_buffer_pool_size,希望能给大家带来些许收获,当遇到类似性能问题时可以多一种思考方式. 图片拍摄于大唐不夜城 ...
- [算法笔记-题解]问题 A: 例题4-1 一元二次方程求根
问题 A: 例题4-1 一元二次方程求根 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 12 MB 题目描述 求一元二次方程ax2+bx+c=0的根,三个系数a, b, c ...
- 决策树之PEP(悲观剪枝)
引用这2篇文章 https://blog.csdn.net/taoqick/article/details/72818496 https://www.open-open.com/lib/view/op ...
- 比例阀驱动电路后级PWM滤波尖刺如何消除?PWM通过RC低通滤波器模拟DAC
双头比例阀驱动电路,采用单片机输出2路PWM,分别驱动功率器件(U100的2和4脚),经过U100的8和10脚输出供电电源的高压PWM波形,这个高压PWM经过R104和R114分别采样后经过电流放大器 ...