一、什么是拼写纠错

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

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.指定要在哪个字段上进行拼写纠错;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "hots vlna",
  6. "term": {
  7. "field": "content"
  8. }
  9. }
  10. }
  11. }

elasticsearch返回结果中的suggest部分包含对应的结果;

不同名字的suggester在返回结果中作为suggest对象的字段,其作为数组承载每个text分词的建议结果;

每个原始的word作为一个对象,对象会记录原始word的基本信息及所有的建议词;

每个建议词对象会包含文本、打分、出现频率;

  1. {
  2. "suggest" : {
  3. "my_sug" : [
  4. {
  5. "text" : "hots",
  6. "offset" : 0,
  7. "length" : 4,
  8. "options" : [
  9. {
  10. "text" : "host",
  11. "score" : 0.75,
  12. "freq" : 109
  13. },
  14. {
  15. "text" : "http",
  16. "score" : 0.5,
  17. "freq" : 235
  18. },
  19. {
  20. "text" : "https",
  21. "score" : 0.5,
  22. "freq" : 9
  23. },
  24. {
  25. "text" : "hours",
  26. "score" : 0.5,
  27. "freq" : 6
  28. },
  29. {
  30. "text" : "hole",
  31. "score" : 0.5,
  32. "freq" : 5
  33. }
  34. ]
  35. },
  36. {
  37. "text" : "vlna",
  38. "offset" : 5,
  39. "length" : 4,
  40. "options" : [
  41. {
  42. "text" : "vlan",
  43. "score" : 0.75,
  44. "freq" : 200
  45. },
  46. {
  47. "text" : "vpna",
  48. "score" : 0.75,
  49. "freq" : 3
  50. },
  51. {
  52. "text" : "vlan1",
  53. "score" : 0.5,
  54. "freq" : 111
  55. },
  56. {
  57. "text" : "vlans",
  58. "score" : 0.5,
  59. "freq" : 11
  60. },
  61. {
  62. "text" : "vlan8",
  63. "score" : 0.5,
  64. "freq" : 10
  65. }
  66. ]
  67. }
  68. ]
  69. }
  70. }

三、Term Suggester的通用配置选项

Term Suggester基于编辑距离来计算字符串的相似性;如果一个建议词通过更少字符的改变、添加、删除来转变成原始的字符串,那么这就是一个更好的建议词;例如host通过变换t和s的位置变成hots,则二者的编辑距离是1;

text既可以在suggest里边单独设置,也可以在全局设置;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "text": "hots vlna",
  5. "content_sug": {
  6. "term": {
  7. "field": "content"
  8. }
  9. },
  10. "title_sug": {
  11. "term": {
  12. "field": "title"
  13. }
  14. }
  15. }
  16. }

analyzer对text设置的文本进行analyse处理,默认使用field字段的search analyzer;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "hots vlna",
  6. "term": {
  7. "analyzer":"standard",
  8. "field": "content"
  9. }
  10. }
  11. }
  12. }

size设置每个word返回的建议词的数量,默认是5个;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "hots vlna",
  6. "term": {
  7. "analyzer":"standard",
  8. "field": "content",
  9. "size":6
  10. }
  11. }
  12. }
  13. }

sort设置每个word对应的建议词的排序方式,由于每个建议词只包含text、score、freq,这就涉及以哪个字段先排序;

score,先使用score排序,后使用freq排序,最后使用建议词排序;

frequency,先使用freq排序,后使用score排序,最后使用建议词排序;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "hots",
  6. "term": {
  7. "field": "content",
  8. "sort":"frequency"
  9. }
  10. }
  11. }
  12. }
  13. {
  14. "suggest" : {
  15. "my_sug" : [
  16. {
  17. "text" : "hots",
  18. "offset" : 0,
  19. "length" : 4,
  20. "options" : [
  21. {
  22. "text" : "http",
  23. "score" : 0.5,
  24. "freq" : 235
  25. },
  26. {
  27. "text" : "host",
  28. "score" : 0.75,
  29. "freq" : 109
  30. },
  31. {
  32. "text" : "https",
  33. "score" : 0.5,
  34. "freq" : 9
  35. },
  36. {
  37. "text" : "hours",
  38. "score" : 0.5,
  39. "freq" : 6
  40. },
  41. {
  42. "text" : "hole",
  43. "score" : 0.5,
  44. "freq" : 5
  45. }
  46. ]
  47. }
  48. ]
  49. }
  50. }

suggest_mode,主要控制针对什么样的词会返回建议词,以及返回那些建议词;

missing,默认的选项,只有输入的词在对应字段的分词中不存在,才有可能返回建议词;

popular,只返回在更多的文档中出现的建议词;

always,任何的建议词都可以返回;

由于vlan322在字段content里已经存在,使用missing模式没有任何返回结果;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan322",
  6. "term": {
  7. "field": "content",
  8. "suggest_mode":"missing"
  9. }
  10. }
  11. }
  12. }
  13. {
  14. "suggest" : {
  15. "my_sug" : [
  16. {
  17. "text" : "vlan322",
  18. "offset" : 0,
  19. "length" : 7,
  20. "options" : [ ]
  21. }
  22. ]
  23. }
  24. }

使用popular模式则会返回对应的建议词;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan322",
  6. "term": {
  7. "field": "content",
  8. "suggest_mode":"popular"
  9. }
  10. }
  11. }
  12. }
  13. {
  14. "suggest" : {
  15. "my_sug" : [
  16. {
  17. "text" : "vlan322",
  18. "offset" : 0,
  19. "length" : 7,
  20. "options" : [
  21. {
  22. "text" : "vlan0022",
  23. "score" : 0.71428573,
  24. "freq" : 5
  25. },
  26. {
  27. "text" : "vlan30",
  28. "score" : 0.6666666,
  29. "freq" : 14
  30. },
  31. {
  32. "text" : "vlan20",
  33. "score" : 0.6666666,
  34. "freq" : 7
  35. },
  36. {
  37. "text" : "vlan.2",
  38. "score" : 0.6666666,
  39. "freq" : 6
  40. },
  41. {
  42. "text" : "vlan12",
  43. "score" : 0.6666666,
  44. "freq" : 6
  45. }
  46. ]
  47. }
  48. ]
  49. }
  50. }

四、Term Suggester的专有配置选项

max_edits,主要控制可以包含的最大编辑距离的建议词,可以取值1或者2,默认值为2;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan322",
  6. "term": {
  7. "field": "content",
  8. "max_edits":1
  9. }
  10. }
  11. }
  12. }
  13. {
  14. "suggest" : {
  15. "my_sug" : [
  16. {
  17. "text" : "htpt",
  18. "offset" : 0,
  19. "length" : 4,
  20. "options" : [
  21. {
  22. "text" : "http",
  23. "score" : 0.75,
  24. "freq" : 235
  25. }
  26. ]
  27. }
  28. ]
  29. }
  30. }

prefix_length,主要控制原始word的开头多少个字符不参与拼错纠正,默认值为1,提高这个值可以提高性能;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan322",
  6. "term": {
  7. "field": "content",
  8. "prefix_length":2
  9. }
  10. }
  11. }
  12. }
  13. {
  14. "suggest" : {
  15. "my_sug" : [
  16. {
  17. "text" : "htpt",
  18. "offset" : 0,
  19. "length" : 4,
  20. "options" : [ ]
  21. }
  22. ]
  23. }
  24. }

min_word_length,控制建议词的最小字符长度,默认是4;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan32",
  6. "term": {
  7. "field": "content",
  8. "min_word_length":7
  9. }
  10. }
  11. }
  12. }

shard_size,主要控制每个分片返回的建议词的数量,通过增大这个设置数量可以提高建议词的准确性,但是可能会降低整体的性能;默认值跟size保持一致;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan32",
  6. "term": {
  7. "field": "content",
  8. "shard_size":3,
  9. "size":10,
  10. }
  11. }
  12. }
  13. }
  14. {
  15. "suggest" : {
  16. "my_sug" : [
  17. {
  18. "text" : "vlan32",
  19. "offset" : 0,
  20. "length" : 6,
  21. "options" : [
  22. {
  23. "text" : "vlan30",
  24. "score" : 0.8333333,
  25. "freq" : 14
  26. },
  27. {
  28. "text" : "vlan.2",
  29. "score" : 0.8333333,
  30. "freq" : 6
  31. },
  32. {
  33. "text" : "vlan12",
  34. "score" : 0.8333333,
  35. "freq" : 6
  36. }
  37. ]
  38. }
  39. ]
  40. }
  41. }

max_inspections,通过与shards_size相乘控制shard级别检测可选建议词的数量,默认值5;没有测试出具体的效果;

min_doc_freq,主要控制返回建议词至少在index中至少多个document中出现过,默认值为0,通过提高这个值可以提高准确率,可以设置具体的值也可以设置百分比;这是一个基于shard level配置选项;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan32",
  6. "term": {
  7. "field": "content",
  8. "min_doc_freq":3
  9. }
  10. }
  11. }
  12. }
  13. {
  14. "suggest" : {
  15. "my_sug" : [
  16. {
  17. "text" : "vlan32",
  18. "offset" : 0,
  19. "length" : 6,
  20. "options" : [
  21. {
  22. "text" : "vlan30",
  23. "score" : 0.8333333,
  24. "freq" : 14
  25. },
  26. {
  27. "text" : "vlan.2",
  28. "score" : 0.8333333,
  29. "freq" : 6
  30. },
  31. {
  32. "text" : "vlan12",
  33. "score" : 0.8333333,
  34. "freq" : 6
  35. },
  36. {
  37. "text" : "vlan2",
  38. "score" : 0.8,
  39. "freq" : 8
  40. },
  41. {
  42. "text" : "vlan10",
  43. "score" : 0.6666666,
  44. "freq" : 55
  45. }
  46. ]
  47. }
  48. ]
  49. }
  50. }

max_term_freq,主要控制建议词在文档中出现的最多的次数,可以设置具体数值和百分比;默认值0.01f;降低这个值可以排除更多的建议词从而提高性能;这个也是shard级别的配置;

  1. POST blogs/_search
  2. {
  3. "suggest": {
  4. "my_sug": {
  5. "text": "vlan32",
  6. "term": {
  7. "field": "content",
  8. "max_term_freq":1
  9. }
  10. }
  11. }
  12. }

string_distance,设置计算编辑距离的具体算法,可选值有internal、damerau_levenshtein、levenshtein、jaro_winkler、ngram;

elasticsearch拼写纠错之Term Suggester的更多相关文章

  1. 拼写纠错的利器,BK树算法

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

  2. Elasticsearch 5.0 中term 查询和match 查询的认识

    Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...

  3. Elasticsearch学习系列之term和match查询

    lasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为book ...

  4. Elasticsearch 5.x 关于term query和match query的认识

    http://blog.csdn.net/yangwenbo214/article/details/54142786 一.基本情况 前言:term query和match query牵扯的东西比较多, ...

  5. Elasticsearch学习系列之term和match查询实例

    Elasticsearch查询模式 一种是像传递URL参数一样去传递查询语句,被称为简单查询 GET /library/books/_search //查询index为library,type为boo ...

  6. Elasticsearch(四)优化用户体验

    改正用户拼写 Term suggester:词项匹配建议:可以通过wiki的插件来下载wiki上面的单词以及短语,来作为你的拼写提示基础仓库: Phrase suggester:n-gram算法,短语 ...

  7. elasticsearch 中文 term & completion suggester

    Term suggester 创建索引 curl -XPUT 'http://172.16.125.136:9200/term?pretty'创建 mapping curl -XPOST http:/ ...

  8. ES系列十三、Elasticsearch Suggester API(自动补全)

    1.概念 1.补全api主要分为四类 Term Suggester(纠错补全,输入错误的情况下补全正确的单词) Phrase Suggester(自动补全短语,输入一个单词补全整个短语) Comple ...

  9. elasticsearch系列五:搜索详解(查询建议介绍、Suggester 介绍)

    一.查询建议介绍 1. 查询建议是什么? 查询建议,为用户提供良好的使用体验.主要包括: 拼写检查: 自动建议查询词(自动补全) 拼写检查如图: 自动建议查询词(自动补全): 2. ES中查询建议的A ...

随机推荐

  1. Google Earth Engine 中的位运算

    Google Earth Engine中的位运算 按位运算是编程中一个难点,同时也是在我们后续处理影像数据,尤其要使用影像自带的波段比如QA波段经常会用到的一个东西.通过按位运算我们可以筛选出我们想要 ...

  2. CF1095B Array Stabilization 题解

    Content 有一个长度为 \(n\) 的数组 \(a_1,a_2,a_3,...,a_n\),现在需要从这些数中删除一个数,使得 \(\max\limits_{i=1}^na_i-\min\lim ...

  3. k8s daemonset controller源码分析

    daemonset controller分析 daemonset controller简介 daemonset controller是kube-controller-manager组件中众多控制器中的 ...

  4. 当在myeclipse里发送邮件有错误时,不妨把环境都改成jdk的

    当在myeclipse里发送邮件有错误时,不妨把环境都改成jdk的, 如果是jre的环境会出错,改成jdk的就行了.

  5. FlashFXP链接到服务器上,如果www目录下的文件隐藏

    FlashFXP链接到服务器上,如果www目录下的文件隐藏,那么请按照如下设置,就可以显示隐藏的文件了 [站点]->[站点管理器]->选项,然后按照如下设置:

  6. Visual Studio 2022有趣又强大的智能辅助编码

    工欲善其事,必先利其器 作为一名.Net开发人员,开发利器当然是首选微软自家的:宇宙第一IDE - Visual Studio了. 这不 VS 2022 正式版已经发布近两个月了,我也体验了近两个月, ...

  7. 小白误入(<<<绝没有针对>>>)企业级架构介绍与IP tables防火墙介绍

    内容详细 架构图 架构图详解 架构: 把一个整体(完成人类生存的所有工作)切分成不同的部分(分工),由不同角色来完成这些分工,并通过建立不同部分相互沟通的机制,使得这些部分能够有机的结合为一个整体,并 ...

  8. SpringBoot整合zimg图片服务器

    依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</arti ...

  9. ARTS Week 18

    Algorithm 本周的 LeetCode 题目为 55. 跳跃游戏 给定一个非负整数数组 nums, 你最初位于数组的 第一个下标 .数组中的每个元素代表你在该位置可以跳跃的最大长度.判断你是否能 ...

  10. Python pyecharts绘制折线图

    一.pyecharts绘制折线图line.add()方法简介 line.add()方法简介 add(name,x_axis,y_axis,is_symbol_show=True, is_smooth= ...