一、什么是拼写纠错

拼写纠错就是搜索引擎可以智能的感知用户输入关键字的错误,并使用纠正过的关键字进行搜索展示给用户;拼写纠错是一种改善用户体验的功能;

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相关推荐

  1. elasticSearch学习笔记04-同义词,停用词,拼音,高亮,拼写纠错

    由于elasticSearch版本更新频繁,此笔记适用ES版本为 7.10.2 此笔记摘录自<Elasticsearch搜索引擎构建入门与实战>第一版 文中涉及代码适用于kibana开发工 ...

  2. NLP-文本处理:拼写纠错【非词(编辑距离)、真词(编辑距离...)候选词 -> “噪音通道模型”计算候选词错拼成待纠错词的似然概率 -> N-gram模型评估候选词组成的语句合理性】

    一.贝叶斯公式 1.单事件 P(Ax∣B)P(A_x|B)P(Ax​∣B)=P(AxB)P(B)=P(B∣Ax)×P(Ax)P(B)=P(B∣Ax)×P(Ax)∑i=0n[P(B∣Ai)∗P(Ai)] ...

  3. java 拼写纠错_拼写纠错的利器,BK树算法

    BK树或者称为Burkhard-Keller树,是一种基于树的数据结构,被设计于快速查找近似字符串匹配,比方说拼写纠错,或模糊查找,当搜索"aeek"时能返回"seek& ...

  4. NLP实战(三)实现拼写纠错

    Part 3: 实现拼写纠错 此项目需要的数据: vocab.txt: 这是一个词典文件,作为判断单词是否拼错的依据,任何未出现在词典中的词都认为拼写错误. spell-errors.txt: 该文件 ...

  5. NLP基础:编辑距离+拼写纠错实战

    NLP基础:编辑距离+拼写纠错实战 1. 编辑距离相关 1.1 编辑距离的计算 1.2 运行结果 1.3 生成特定编辑距离的字符串 1.3.1 生成与目标字符编辑距离为1的字符 1.3.2 运行结果 ...

  6. NLP项目(二)——拼写纠错

    目录 前言 一.数据集介绍 1-1.spell-errors.txt 1-2.vocab.txt 1-3.testdata.txt 二.拼写纠错代码 Part0:构建词库 Part1:生成所有的候选集 ...

  7. NLP预处理阶段----拼写纠错实战

    拼写纠错流程 仅限拼写上的纠错,暂不去进行语法层次上的纠错. I like play football. 本文暂不纠错. 数据集: spell-errors.txt 正确:错误1,错误2- 其他错误给 ...

  8. 动态规划应用--搜索引擎拼写纠错

    文章目录 1. 字符串相似度 1.1 莱文斯坦距离 1.2 最长公共子串长度 2. 计算编辑距离 2.1 莱文斯坦距离 2.2 最长公共子串长度 3. 搜索引擎拼写纠错 4. 练习题 在 Trie树那 ...

  9. 中文拼写纠错_58搜索拼写纠错

    在搜索引擎中,用户希望得到和输入查询词相关的并且质量较好的网页或文档.但是往往出于各种原因,用户输入的查询词本身质量不高或是错误的,如果搜索引擎不对这种错误进行修正弥补,会导致召回错误的结果,或者结果 ...

最新文章

  1. 超级实用的 MySQL 常用优化指南!
  2. HTML的input类型为hidden导致无法reset改字段的value问题
  3. 【C#】调度程序进程已挂起,但消息仍在处理中;
  4. newcode Islands 思维
  5. 【Flex】读取本地JSON,然后JSON数据转成XML数据
  6. python找不同数字的个数_在Python中找到N个按位或等于K的不同数字
  7. Unity 导入高分辨率图片
  8. SmartFoxServer,多人flash游戏开发
  9. 房屋租赁合同电子版最新版(word版本适合个人租房用)
  10. excel怎么将文本转为数值
  11. NVI(Non-Virtual Interface )
  12. 关于智能家居、360wifi、wifi开关,以及wifi芯片的选择
  13. 谏太宗十思疏 魏征(原文/译文)
  14. 现货白银与白银TD的换算方法
  15. Redis 如何实现附近的人
  16. C++ 取json中的某一个值,解析json字符串
  17. 拼题---求链式线性表的倒数第K项(两种算法的比较)
  18. 用Nginx禁止国外IP访问我的网站...
  19. Unable to make field private final byte[] java.lang.String.value accessible: module java.base does n
  20. 删除Windows.old提示需要TrustInstaller权限

热门文章

  1. BIOS和BMC的介绍
  2. i5 10210u和1035G1 的区别 哪个好
  3. qq人脸更换_微信这样更换实名认证信息,你肯定还不知道吧!
  4. 【分布式能源的选址与定容】基于非支配排序多目标粒子群优化算法求解分布式能源的选址与定容附Matlab代码
  5. Java super关键字:super调用父类的构造方法、利用super访问父类成员
  6. 《应用非线性控制》第二章——相平面分析 2.1 相平面分析的概念
  7. 使用Mac抓取iPhone数据包(二.RVI)
  8. 关于enum应用的总结
  9. matlab 曲线法线,平面曲线的切线及法线.ppt
  10. SEO接单需谨慎 并非所有的单子都能接