ElasticSearch Docker 部署
本文简要记录如何使用 Docker 部署 ElasticSearch,并安装 hanlp 分词器提高中文分词效果。
什么是 ElasticSearch
以下是官方原文:
Elasticsearch 是一个开源的分布式 RESTful 搜索和分析引擎、可扩展的数据存储和向量数据库,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。
Docker 部署
以下为完整的 docker compose 文件,包括:
- ElasticSearch
- Kibana
docker compose 文件如下:
1 | services: |
创建默认配置文件
./data/config/elasticsearch.yml
,内容如下:
1 | cluster.name: "docker-cluster" |
安装步骤
启动 docker 容器
1 | # 为挂载容器设置权限,这一步非常重要,否则 es 会启动失败 |
设置用户名和密码
按如下步骤设置用户名和密码:
1 | # 这个命令会依次为 elastic, kibana, logstash_system,beats_system 四个用户设置密码 |
还有一个更简单的方式,直接重置 elastic
用户的密码:
1 | docker exec -it elastic-search bin/elasticsearch-reset-password -u elastic -s |
此处密码一定要保存好。
若要重置为指定密码,可以使用:
1 | docker exec -it elastic-search bin/elasticsearch-reset-password -u elastic -i |
完整命令帮助如下:
配置 kibana
打开 kibana
使用浏览器打开 kibana
地址为:http://docker-host-ip:9301
右下角提示,需要配置 publicBaseUrl,由于是内网使用,可以不用管它
生成 enrollment token
远程到 docker 宿主机,执行以下命令获取:
1 | docker exec -it elastic-search bin/elasticsearch-create-enrollment-token --scope kibana |
结果如图所示:
将 token 复制到输入框后,点确认。
获取验证码
上一步之后,会弹出验证码弹窗:
使用如下命令获取验证码:
1 | docker exec -it kibana bin/kibana-verification-code |
输入之后,等待配置完成。
配置分词插件
中文分词器对比
最终选择 hankcs/HanLP: 中文分词 作为分词器。
HanLP 插件安装
本节主要参考:p3psi-boo/elasticsearch-analysis-hanlp-8.x
配置与测试可以在 /app/dev_tools#/console
开发者工具中进行
下载分词器
1 | # 进入到插件目录 |
下载分词模型
analysis-hanlp 插件下载完成后,还需要下载分词模型,接着上一步继续操作:
1 | cd analysis-hanlp |
修改默认分词器
打开 kibana 的控制台 Console - Dev Tools - Elastic,在里面输入执行命令或者直接通过 http 请求接口。
本节主要参考:Specify an analyzer
创建索引
以下参数会创建一个 search-iepc-document 索引并设置 hanlp 为默认分词器
1 | # 创建索引 |
为索引创建默认分词器
若要修改设置,可以先关闭索引,然后更新设置
1 | # 关闭服务 |
生成 API_KEY
为了能够通过 API 调用,需要生成一个 API_KEY。
访问 Kibana 这个页面进行生成:http://host:9301/app/management/security/api_keys
更加详细的权限控制参考:Create API key API
在配置时,建议启用受限权限:
python 连接
1 | from elasticsearch import Elasticsearch |
常用 kibana 控制台命令
以下命令可直接在 kibana 的控制台 /app/dev_tools#/console 中使用
详情如下:
1 | # 查看分词效果 |
结语
上面的安装方式使用了 elasticsearch-analysis-hanlp,这种方式有个弊端,无法快速迭代分词器。
后期若有升级需要,可以将 hanlp 独立成服务,然后制作一个网络分词器插件进行调用。