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支持對單個文本進(jìn)行糾錯,所以采用這種就不能對糾錯文本進(jìn)行分詞。
新建測試索引
PUT /dis_sugs_test
建索引mapping,注意使用 term suggester的字段不能分詞 。
PUT /dis_sugs_test/_mapping/SUGNAME
{
"properties": {
"sugs": {
"type": "keyword"
},
"name": {
"type": "keyword"
}
}
}
灌入一些測試數(shù)據(jù)
POST _bulk/?refresh=true
{ "index" : { "_index" : "dis_sugs_test", "_type" : "SUGNAME" } }
{ "name": "yanchangqing"}
試試糾錯效果,注意min_word_length默認(rèn)值為4,一般中文人名為3個字,如果不設(shè)值是沒有召回數(shù)據(jù)的。其余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 的位置數(shù)據(jù),考慮到了詞之間的關(guān)系,同時記錄多次的token在倒排索引里記錄的詞頻會比較高,當(dāng)進(jìn)行文本糾錯時,phrase suggester基于共現(xiàn)和頻率來做出關(guān)于選擇哪些 token 的更好的決定。
我們目前做的人員姓名糾錯不是短文本糾錯,所以選擇使用term suggester api可滿足我們的需要。
關(guān)于term suggester 和 phrase suggester 的具體參數(shù)細(xì)節(jié)參考elasticsearch官網(wǎng) https://www.elastic.co/guide/en/elasticsearch/reference/5.0/search-suggesters.html,
有一個組織做了翻譯工作 http://cwiki.apachecn.org/display/Elasticsearch/Term+suggester
3. 人名糾錯策略
由于大部分的人名糾錯問題都可以歸于拼音問題,而單純的漢字姓名進(jìn)行編輯距離糾錯召回失掉了拼音信息,所以目前采用的漢字轉(zhuǎn)拼音之后再進(jìn)行糾錯。
參考鏈接:
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
http://www.itdecent.cn/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/