姓名搜索纠错问题调研

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": "",
      "position": 0
    },
    {
      "token": "is",
      "start_offset": 7,
      "end_offset": 9,
      "type": "",
      "position": 1
    },
    {
      "token": "cool",
      "start_offset": 10,
      "end_offset": 14,
      "type": "",
      "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/

你可能感兴趣的:(姓名搜索纠错问题调研)