Docker安装Elasticsearch及IK分词器详解

引言

Elasticsearch是一个分布式、RESTful风格的搜索和分析引擎,能够解决越来越多的用例。作为Elastic Stack的核心,它可以集中存储数据,帮助发现意料之外的情况。而对于中文搜索来说,IK分词器是必不可少的组件,它能够有效地进行中文分词,提高搜索的准确性和效率。本文将详细介绍如何使用Docker安装Elasticsearch及IK分词器。

环境准备

  • 已安装Docker(建议Docker 19.03+)
  • 至少4GB内存(Elasticsearch要求)
  • 互联网连接(用于拉取镜像)

1. Docker安装Elasticsearch

1.1 拉取Elasticsearch镜像

首先,选择一个合适的Elasticsearch版本。本文使用8.11.1版本作为示例:

docker pull elasticsearch:8.11.1

如果需要特定版本,可以在Docker Hub上查找可用的标签。

1.2 创建网络(可选)

为了方便Elasticsearch和Kibana等其他服务通信,我们可以创建一个专用网络:

docker network create elastic-net

1.3 创建配置目录和数据目录

mkdir -p /data/elasticsearch/config
mkdir -p /data/elasticsearch/data
mkdir -p /data/elasticsearch/plugins

1.4 调整目录权限

Elasticsearch不能以root用户运行,需要设置适当的权限:

chmod -R 777 /data/elasticsearch/

1.5 创建elasticsearch.yml配置文件

cat > /data/elasticsearch/config/elasticsearch.yml << EOF
cluster.name: "docker-es-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
xpack.security.enabled: false
discovery.type: single-node
EOF

1.6 运行Elasticsearch容器

docker run -d \
  --name elasticsearch \
  --net elastic-net \
  -p 9200:9200 \
  -p 9300:9300 \
  -e "discovery.type=single-node" \
  -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
  -v /data/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  -v /data/elasticsearch/data:/usr/share/elasticsearch/data \
  -v /data/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
  elasticsearch:8.11.1

参数说明:

  • -d: 后台运行容器
  • --name: 指定容器名称
  • --net: 指定网络
  • -p: 端口映射
  • -e: 环境变量
  • -v: 挂载卷

1.7 验证Elasticsearch安装

访问 http://localhost:9200 或者使用curl命令:

curl http://localhost:9200

如果返回JSON格式的集群信息,说明安装成功。

2. 安装IK分词器

IK分词器有两种安装方式:直接在容器内安装和挂载方式安装。这里介绍两种方法,推荐使用第二种方式。

2.1 方法一:在容器内安装

进入容器

docker exec -it elasticsearch bash

使用Elasticsearch插件管理器安装

cd /usr/share/elasticsearch
bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.11.1/elasticsearch-analysis-ik-8.11.1.zip

注意:确保IK分词器版本与Elasticsearch版本一致。

重启Elasticsearch容器

docker restart elasticsearch

2.2 方法二:挂载方式安装(推荐)

下载对应版本的IK分词器

mkdir -p /data/elasticsearch/plugins/ik
cd /data/elasticsearch/plugins/ik
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v8.11.1/elasticsearch-analysis-ik-8.11.1.zip
unzip elasticsearch-analysis-ik-8.11.1.zip
rm -f elasticsearch-analysis-ik-8.11.1.zip

调整权限

chmod -R 777 /data/elasticsearch/plugins/

重启Elasticsearch容器

docker restart elasticsearch

3. 验证IK分词器安装

创建测试索引

curl -X PUT "localhost:9200/test_index"

测试IK分词器

curl -X POST "localhost:9200/test_index/_analyze" -H "Content-Type: application/json" -d'
{
  "analyzer": "ik_smart",
  "text": "中华人民共和国是一个伟大的国家"
}
'

如果返回分词结果,则表明IK分词器安装成功:

{
  "tokens": [
    {
      "token": "中华人民共和国",
      "start_offset": 0,
      "end_offset": 7,
      "type": "CN_WORD",
      "position": 0
    },
    {
      "token": "是",
      "start_offset": 7,
      "end_offset": 8,
      "type": "CN_CHAR",
      "position": 1
    },
    {
      "token": "一个",
      "start_offset": 8,
      "end_offset": 10,
      "type": "CN_WORD",
      "position": 2
    },
    {
      "token": "伟大",
      "start_offset": 10,
      "end_offset": 12,
      "type": "CN_WORD",
      "position": 3
    },
    {
      "token": "的",
      "start_offset": 12,
      "end_offset": 13,
      "type": "CN_CHAR",
      "position": 4
    },
    {
      "token": "国家",
      "start_offset": 13,
      "end_offset": 15,
      "type": "CN_WORD",
      "position": 5
    }
  ]
}

4. IK分词器的两种模式

IK分词器提供了两种分词模式:

4.1 ik_smart(最少切分)

curl -X POST "localhost:9200/test_index/_analyze" -H "Content-Type: application/json" -d'
{
  "analyzer": "ik_smart",
  "text": "中华人民共和国是一个伟大的国家"
}
'

4.2 ik_max_word(最细粒度切分)

curl -X POST "localhost:9200/test_index/_analyze" -H "Content-Type: application/json" -d'
{
  "analyzer": "ik_max_word",
  "text": "中华人民共和国是一个伟大的国家"
}
'

5. 自定义词典

IK分词器支持自定义词典,可以添加专业术语、新词等。

5.1 创建自定义词典文件

cat > /data/elasticsearch/plugins/ik/config/custom.dic << EOF
宾川出口种植农产品
特色农产品
EOF

5.2 修改IKAnalyzer.cfg.xml文件

vi /data/elasticsearch/plugins/ik/config/IKAnalyzer.cfg.xml

<entry key="ext_dict"></entry>中添加自定义词典:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
    <comment>IK Analyzer 扩展配置</comment>
    <entry key="ext_dict">custom.dic</entry>
    <entry key="ext_stopwords"></entry>
</properties>

5.3 重启Elasticsearch容器

docker restart elasticsearch

5.4 测试自定义词典

curl -X POST "localhost:9200/test_index/_analyze" -H "Content-Type: application/json" -d'
{
  "analyzer": "ik_smart",
  "text": "宾川出口种植农产品基地管理系统"
}
'

6. 常见问题及解决方法

6.1 内存不足问题

问题现象:容器启动失败,日志显示内存不足。

解决方案

  • 增加宿主机内存
  • 调整Elasticsearch的JVM内存设置:
-e "ES_JAVA_OPTS=-Xms256m -Xmx256m"

6.2 权限问题

问题现象:Elasticsearch无法访问挂载的数据目录。

解决方案:调整目录权限:

chmod -R 777 /data/elasticsearch/

6.3 版本不匹配问题

问题现象:IK分词器安装后,Elasticsearch无法启动。

解决方案:确保IK分词器版本与Elasticsearch版本一致。

7. 与Kibana集成(可选)

如果需要图形化界面管理Elasticsearch,可以安装Kibana:

docker pull kibana:8.11.1

docker run -d \
  --name kibana \
  --net elastic-net \
  -p 5601:5601 \
  -e "ELASTICSEARCH_HOSTS=http://elasticsearch:9200" \
  kibana:8.11.1

访问 http://localhost:5601 即可打开Kibana界面。

8. 性能优化建议

  • 调整JVM内存:根据服务器情况,合理设置JVM堆内存
  • 系统参数调整:增加最大文件描述符数量
  • 索引分片设置:根据数据量设置适当的分片数
  • 禁用不必要的特性:如不需要安全功能,可禁用xpack.security

总结

通过Docker安装Elasticsearch和IK分词器非常方便,只需几个简单的步骤即可完成。本文详细介绍了安装过程、验证方法以及常见问题的解决方案。对于中文搜索场景,IK分词器是必不可少的组件,它可以有效提高搜索的准确性和效率。

希望本文能对你在Docker环境下搭建Elasticsearch和IK分词器有所帮助。如有任何问题,欢迎在评论区留言讨论!