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;

本网页由快兔兔AI采集器生成,目的为演示采集效果,若侵权请及时联系删除。

原文链接:https://www.cnblogs.com/wufengtinghai/p/15811554.html

更多内容