最近厂里的项目在做全文搜索,于是上了elasticsearch,顺带还要折腾一下中文分词的问题
首先拿出两个插件
- https://github.com/medcl/elasticsearch-analysis-ik
- https://github.com/medcl/elasticsearch-analysis-pinyin
第一个是用了ik分词器的中文分词插件,第二个就是转换为拼音索引的插件了
我打算让elasticsearch直接跑在docker里,所以写了dockerfile
FROM docker.elastic.co/elasticsearch/elasticsearch:5.6.1
RUN bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.6.1/elasticsearch-analysis-ik-5.6.1.zip \
&& bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v5.6.1/elasticsearch-analysis-pinyin-5.6.1.zip
这两个插件似乎还暂时没有更新到5.6.2,所以只能先用5.6.1跑着了
这样基础的准备工作就做完了,可以开始动工了
首先要给index准备好mapping
const Analyzer = {
type: 'text',
analyzer: 'ik_max_word',
search_analyzer: 'ik_smart',
fields: {
pinyin: {
type: 'text',
analyzer: 'pinyin',
}
},
}
const MAPPING = {
'chipcoo-im-message': {
properties: {
message: Analyzer,
isEdited: {type: 'boolean'},
type: {type: 'keyword'},
sender: {type: 'keyword'},
roomId: {type: 'keyword'},
attachments: {type: 'object'},
createdAt: {type: 'date'},
ext: {type: 'object'},
}
}
}
使用es的multi-field特性,为需要搜索的属性添加一个pinyin的field,就可以单独为他指定analyzer了,这样的话,搜索的时候需要用multi_match
指定字段['message', 'message.pinyin']
就是这么轻松,搞完了,塞点数据进去试试