avatar
@bangbang93

elasticsearch中文分词+拼音搜索

9/29/2017, 6:14:12 PM

最近厂里的项目在做全文搜索,于是上了elasticsearch,顺带还要折腾一下中文分词的问题
首先拿出两个插件

第一个是用了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']

就是这么轻松,搞完了,塞点数据进去试试

图片