ElasticSearch实现拼音以及多音字搜索

  • elastic默认的分词插件对中文支持不好,比如对中华人民共和国进行分词的时候:
  1.使用默认分词插件,会分别搜索中、华、人、民、共、和、国
  2. 推荐使用大名鼎鼎的ik分词器, 地址:https://github.com/medcl/elasticsearch-analysis-ik/
  3. 安装方法如前面的一片文章所述,建议使用ik_smarter就够了,上面的分词会变成: 中华、人民、共和国
  4. 使用ik之后,还是有一个问题,对于中文用户,很多人在搜索的时候不一定会切换到中文的输入法,也就是输入的是拼音, 但是ik并不支持拼音搜索,这样搜出来的结果是英文或者是不准确的,所以需要使用拼音分词插件:https://github.com/medcl/elasticsearch-analysis-pinyin
  5. 安装方法依旧如前面所述
  • 安装插件之后,需要重新更新一下mapping,以实现拼音+多音字的搜索结果:
topic = \
{
    "settings": {
        "analysis": {
            "analyzer": {
                "ik_pinyin_analyzer": {
                    "type":"custom",
                    "tokenizer": "ik_smart",
                    "filter": ["my_pinyin","word_delimiter"]
                }
            },
            "filter": {
                "my_pinyin": {
                    "type": "pinyin",
                    "keep_first_letter": False,
                    "keep_full_pinyin": True,
                    "keep_none_chinese": True,
                    "keep_none_chinese_in_first_letter": True,
                    "keep_original": False,
                    "limit_first_letter_length": 16,
                    "lowercase": True,
                    "trim_whitespace": True,
                }
            }
        }
    },
    "mappings" : {
        "topic" : {
            "properties" : {
                "creator" : {
                    "type" : "string",
                    "index": "not_analyzed"
                },
                "postCount" : {
                    "type" : "integer",
                    "index": "not_analyzed"
                },
                "followNum" : {
                    "type" : "integer",
                    "index": "not_analyzed"
                },
                "creatTime" : {
                    "type" : "date",
                    "index": "not_analyzed"
                },
                "tagName": {
                    "type": "text",
                    "index": "analyzed",
                    "store": "no",
                    "analyzer": "ik_pinyin_analyzer",
                    "term_vector": "with_positions_offsets",
                    "boost": 10,
                    "fields" : {
                        "untouch": {
                            "type": "keyword"
                        }
                    }
                }
            }
        }
    }
}
  • 搜索实现的结果如下图所示:


    ElasticSearch实现拼音以及多音字搜索_第1张图片
    Paste_Image.png

你可能感兴趣的:(ElasticSearch实现拼音以及多音字搜索)