姓名搜索糾錯問題調(diào)研

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/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容