为Elasticsearch添加中文分词插件-ik 并修改mapping.analyzer

为什么需要中文分词

不造轮子了, 这一篇文档写得挺易懂的: elasticsearch 利用ik分词搜索

安装ik

去到ik的github, 里面会说如何安装

为Elasticsearch添加中文分词插件-ik 并修改mapping.analyzer_第1张图片
install

由于我想使用docker作为部署方式, 所以我的路子是: 到releases下载插件, 并打包成一个docker镜像.

// 新建一个目录用于构建docker镜像
mkdir elasticsearch-ik
cd elasticsearch-ik

写入Dockerfile

$ echo "FROM elasticsearch:5.5.1
RUN mkdir -p /usr/share/elasticsearch/plugins/ik
COPY ./ik /usr/share/elasticsearch/plugins/ik/" >> Dockerfile

到Releases页面https://github.com/medcl/elasticsearch-analysis-ik/releases/tag/v5.5.1 下载编译好的文件. (注意选择自己的ES版本).

将下载的文件解压, 并放在此目录, 如下

├── Dockerfile
└── ik
    ├── commons-codec-1.9.jar
    ├── commons-logging-1.2.jar
    ├── config
    │   ├── extra_main.dic
    │   ├── extra_single_word.dic
    │   ├── extra_single_word_full.dic
    │   ├── extra_single_word_low_freq.dic
    │   ├── extra_stopword.dic
    │   ├── IKAnalyzer.cfg.xml
    │   ├── main.dic
    │   ├── preposition.dic
    │   ├── quantifier.dic
    │   ├── stopword.dic
    │   ├── suffix.dic
    │   └── surname.dic
    ├── elasticsearch-analysis-ik-5.5.1.jar
    ├── httpclient-4.5.2.jar
    ├── httpcore-4.4.4.jar
    └── plugin-descriptor.properties

开始构建

sudo docker build . -t bysir/elasticsearch:ik-5.5.1
// push 到远程仓库
sudo docker push bysir/elasticsearch:ik-5.5.1

完成, 使用方法和原来的官方镜像一样.

将ik设置为analyzer.

安装好插件之后如何使用插件呢?

需要新建Index并指定使用ik作为analyzer, 如下

curl -XPUT http://localhost:9200/content -H 'Content-Type:application/json' -d'
{
    "mappings": {
      "content": {
        "properties": {
          "data": {
            "type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_max_word"
          },
          "id": {
            "type": "text"
          }
        }
      }
    }
}

那么问题来了, 如果已经有Index了该怎么办?

修改已有Index的Mapping

ES也有api可以修改mapping

curl -XPOST http://localhost:9200/content/content/_mapping -H 'Content-Type:application/json' -d'
{
        "properties": {
          "data": {
            "type": "text",
            "analyzer": "ik_max_word",
            "search_analyzer": "ik_max_word"
          },
          "id": {
            "type": "text"
          }
        }
}

但如果有property的analyzer有变化 则会修改不成功, 报错 Mapper for [content] conflicts with existing mapping in other types:\n[mapper [data] has different [analyzer]]

那这个时候怎么办?

使用reindex解决mapping修改冲突

用报错信息去Google就能得到答案, 参看: change analyzer for an elasticsearch index?

  1. Create a new index with the mapping you want
  2. Use "reindex" to copy the data from the old index to the new one
  3. Drop the old index, but create an alias with the name of the old index that points to the new index (because ElasticSearch does not allow you to rename an index.)

Tips:

  • reindex会复制老Index的数据到新的Index, 这时新Index的mapping就会生效.
  • alias的概念和mysql的视图类似, 通过alias也能访问的index的数据, 这样我们在代码中就不用修改index名字的了.

参考

  • 沉淀再出发:ElasticSearch的中文分词器ik

你可能感兴趣的:(为Elasticsearch添加中文分词插件-ik 并修改mapping.analyzer)