1. 姓名搜索的特殊性
大部分人在搜索框键入汉字的时候用的是拼音输入法,所以大部分人员搜索纠错问题其实是拼音纠错问题。
eg:
- 杨长青 --> 杨常青
- 刘明越 --> 刘明月
- 章jun --> 章俊
- 卢洪波 --> 卢红波
- yangchangqin --> 杨常青
2. ES 的纠错支持
ES 5.x 版本在suggester api下有term suggester 、phrase suggester提供对纠错的支持,ES的纠错基于编辑距离,suggester api下还有completion suggester可以做补全类型搜索建议,另外还有最强大的Context Suggester提供类别查询和地理映射。
2.1phrase suggester 纠错
term suggester支持对单个文本进行纠错,所以采用这种就不能对纠错文本进行分词。
新建测试索引
PUT /dis_sugs_test
建索引mapping,注意使用 term suggester的字段不能分词 。
PUT /dis_sugs_test/_mapping/SUGNAME
{
"properties": {
"sugs": {
"type": "keyword"
},
"name": {
"type": "keyword"
}
}
}
灌入一些测试数据
POST _bulk/?refresh=true
{ "index" : { "_index" : "dis_sugs_test", "_type" : "SUGNAME" } }
{ "name": "yanchangqing"}
试试纠错效果,注意min_word_length默认值为4,一般中文人名为3个字,如果不设值是没有召回数据的。其余term 纠错属性可查阅官方文档。
GET /dis_sugs_test/SUGNAME/_search
{
"suggest": {
"my-suggestion": {
"text": "yanchangqin",
"term": {
"field": "name",
"suggest_mode": "always",
"min_word_length": 1
}
}
}
}
2.2phrase suggester 纠错
phrase suggester 对纠错文本分词之后存在字典里。
POST _analyze
{
"text": [
"Lucene is cool",
"Elasticsearch builds on top of lucene",
"Elasticsearch rocks",
"Elastic is the company behind ELK stack",
"elk rocks",
"elasticsearch is rock solid"
]
}
{
"tokens": [
{
"token": "lucene",
"start_offset": 0,
"end_offset": 6,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "is",
"start_offset": 7,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "cool",
"start_offset": 10,
"end_offset": 14,
"type": "<ALPHANUM>",
"position": 2
}
]
}
phrase suggester 通过存了token 的位置数据,考虑到了词之间的关系,同时记录多次的token在倒排索引里记录的词频会比较高,当进行文本纠错时,phrase suggester基于共现和频率来做出关于选择哪些 token 的更好的决定。
我们目前做的人员姓名纠错不是短文本纠错,所以选择使用term suggester api可满足我们的需要。
关于term suggester 和 phrase suggester 的具体参数细节参考elasticsearch官网 https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-suggesters.html,
有一个组织做了翻译工作 http://cwiki.apachecn.org/display/Elasticsearch/Term+suggester
3. 人名纠错策略
由于大部分的人名纠错问题都可以归于拼音问题,而单纯的汉字姓名进行编辑距离纠错召回失掉了拼音信息,所以目前采用的汉字转拼音之后再进行纠错。
参考链接:
https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-suggesters.html
https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-suggesters-phrase.html
http://cwiki.apachecn.org/display/Elasticsearch/Phrase+Suggester
https://www.jianshu.com/p/d1da9b0a04aa
https://elasticsearch.cn/question/493
https://discuss.elastic.co/t/what-are-the-best-approach-for-chinese-japanese-language-indexing-and-searching/79
https://github.com/medcl/elasticsearch-analysis-ik/issues/266
https://www.bbsmax.com/A/ZOJPXK9PJv/
网友评论