拼音分词器的配置
-
拼音分词器:要实现根据字母做补全,就必须对文档按照拼音分词。在GitHub上恰好有elasticsearch的拼音分词插件。
地址:https://github.com/medcl/elasticsearch-analysis-pinyin
自定义分词器:elasticsearch中分词器(analyzer)的组成包含三部分:
-
character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
-
tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik smart
-
tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等
-
工作流程示例:
要想自定义分词器的时候要在创建索引库的时候,通过setting来配置自定义的analyzer
{"settings": {"analysis": {"analyzer": {"my_analyzer": {"tokenizer": "ik_max_word","filter": ["py"]}},"filter": {"py": {"type": "pinyin","keep_full_pinyin": false,"keep_joined_full_pinyin": true,"keep_original": true,"limit_first_letter_length": 16,"remove_duplicated_term": true,"none_chinese_pinyin_tokenize": false}}}},"mappings": {// 这里如果后续要定义具体的字段映射,可补充类似如下结构(示例,根据实际需求调整)// "properties": {// "field_name": {// "type": "text",// "analyzer": "my_analyzer"// }// }}
}
配置说明:
-
analysis
部分:用于定义分词相关的分析器、过滤器等。
-
analyzer
:定义名为my_analyzer
的自定义分析器,使用ik_max_word
分词器(需确保已安装 IK 分词器插件,它擅长中文分词,会尽可能细地拆分中文文本 ),并搭配名为py
的词元过滤器。 -
filter
:定义py
过滤器,类型是pinyin
(需确保已安装 Elasticse arch 拼音分词相关插件,用于处理中文拼音转换 ),各参数含义:-
keep_full_pinyin
:是否保留完整拼音,这里设为false
。 -
keep_joined_full_pinyin
:是否保留连接后的完整拼音,设为true
,比如 “中国” 可能会生成 “zhongguo” 这样的连续拼音形式 。 -
keep_original
:是否保留原始文本,设为true
,即分词时会同时保留原始中文词和拼音转换后的结果 。 -
limit_first_letter_length
:限制首字母缩写的长度,这里为 16 ,比如中文词语拼音首字母拼接后长度限制 。 -
remove_duplicated_term
:是否移除重复的词项,设为true
,避免重复的拼音或文本进入倒排索引 。 -
none_chinese_pinyin_tokenize
:是否对非中文进行拼音分词,设为false
,即只处理中文相关的拼音转换 。
-
-
-
mappings
部分:目前是空的,若要让某个字段使用这个自定义分词器my_analyzer
,需要在properties
里定义具体字段及映射规则,比如有一个content
字段要做文本分词,可写成:"mappings": {"properties": {"content": {"type": "text","analyzer": "my_analyzer"}} }
自定义分词器适合在创建倒排索引的时候使用,但不能在搜索的时候使用。因为在创建倒排索引的时候会有同音字,虽然在中文的时候会进行新的索引创建,但是在谐音的情况下就会在一个相同的拼音词条之内有着两个不同汉字意思的词语分词。因此在创建索引的时候应该使用自定义的分词器,在字段搜索的时候应该使用IK分词器。
"analyzer":"my_analyzer"
"search_analyzer":"ik_smart"