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"
                        }
                    }
                }
            }
        }
    }
}
  • 搜索实现的结果如下图所示:


    Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包括内容: IK分词组件的添加和配置 索引建立及高亮搜索示例 添加自定义分词的测试 版本: ES - 2.4.5,...
    君剑阅读 8,732评论 0 0
  • 摘要: 原创出处 www.bysocket.com 「泥瓦匠BYSocket 」欢迎转载,保留摘要,谢谢! 『 春...
    子木聊出海阅读 3,437评论 1 51
  • 1.Search Engine 目前主流的开源搜索引擎主要有两个,一个是基于Java的Apache Lucene,...
    秦汉邮侠阅读 851评论 0 1
  • 我买了一个笔记本 很贵, 特别贵, 我不敢轻易在上面写字 我也许会写错别字 也许会写很多病句 也许会涂改 总之它会...
    苏打熊阅读 170评论 0 0
  • 一直喜欢一首歌,大概就是像:一直想单曲循环新发现的一首歌时,如果是这首歌排在后面,那就不会反感。它的魅力给予了它像...
    莺时阅读 180评论 0 1