Docker 安装ElasticSearch、Kibana、IK分词器

36 阅读7分钟

1、安装ElasticSearch

// Step 1:高版本安装`Kibana`的时候需要和`ElasticSearch`在同一网段内,并尽量保持两个的版本一致
// 所以采用`docker`安装首先要确认网段,为了方便操作,我们直接创建一个网络,创建脚本如下:
docker network create es-net

// Step 2:Docker 安装`ElasticSearch`脚本
docker run -d \
    --name elasticsearch \
    -e "http.host=0.0.0.0" \
    -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \
    -e "discovery.type=single-node" \
    -v es-data:/usr/share/elasticsearch/data \
    -v es-plugins:/usr/share/elasticsearch/plugins \
    -v es-config:/usr/share/elasticsearch/config \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1
//命令说明:
//-   `--name elasticsearch"`:设置容器名称
//-   `-e "http.host=0.0.0.0"`:监听的地址,可以外网访问
//-   `-e "ES_JAVA_OPTS=-Xms512m -Xmx512m"`:内存大小
//-   `-e "discovery.type=single-node"`:非集群模式
//-   `-v es-data:/usr/share/elasticsearch/data`:挂载逻辑卷,绑定`elasticsearch`的数据目录
//-   `-v es-logs:/usr/share/elasticsearch/logs`:挂载逻辑卷,绑定`elasticsearch`的日志目录
//-   `-v es-plugins:/usr/share/elasticsearch/plugins`:挂载逻辑卷,绑定`elasticsearch`的插件目录
//-   `--privileged`:授予逻辑卷访问权
//-   `--network es-net` :加入一个名为`es-net`的网络中
//-   `-p 9200:9200`:向外暴露端口映射
//-   `-p 9300:9300`:该节点端口映射配置,集群模式下其它节点可以根据该端口进行访问该节点

//  Step 2:安装完成后访问`http://47.109.156.181:9200/`即可看到`elasticsearch`的响应结果:
//{
    //"name": "faea4773fc6b",
    //"cluster_name": "docker-cluster",
    //"cluster_uuid": "2QUlgKGSSFSs9udFj0lvRQ",
    //"version": {
        //"number": "7.12.1",
        //"build_flavor": "default",
        //"build_type": "docker",
        //"build_hash": "3186837139b9c6b6d23c3200870651f10d3343b7",
        //"build_date": "2021-04-20T20:56:39.040728659Z",
        //"build_snapshot": false,
        //"lucene_version": "8.8.0",
        //"minimum_wire_compatibility_version": "6.8.0",
        //"minimum_index_compatibility_version": "6.0.0-beta1"
    //},
    //"tagline": "You Know, for Search"
//}

//注意:访问前,打开服务器的端口限制9200或者9300。

2、安装Kibana并设置中文面板

2.1、安装Kibana

Kibana 是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让您在 Elastic Stack 中进行导航。您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。

// Step 1: 执行命令需要注意`Kibana`操作的`ElasticSearch`地址,因为`Kibana`是需要连`ElasticSearch`进行操作的,命令如下:
docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200 \
--network es-net \
-p 5601:5601  \
kibana:7.12.1
//命令说明:
//-   `--network es-net` :加入一个名为`es-net`的网络中,与`elasticsearch`在同一个网络中
//-   `-e ELASTICSEARCH_HOSTS=http://elasticsearch:9200"`:设置`elasticsearch`的地址,因为`kibana`已经与`elasticsearch`在一个网络,因此可以用容器名直接访问`elasticsearch`(当前使用容器名称访问),也可以写IP地址实现访问。
//-   `-p 5601:5601`:端口映射配置

// Step 2: 下载安装完成,如果想实时知道服务安装运行的状态,可以通过查看日志实现,查看日志如下:
docker logs -f kibana

// Step 3: 访问`http://47.109.156.181:5601`即可访问`Kibana`页面。

2.2、设置中文面板

// `Kibana`控制台默认英文面板,但`Kibana`是支持中文配置,所以我们可以把`Kibana`配置成中文版,便于我们操作。

// Step 1: 进入容器
docker exec -it kibana /bin/bash

// Step 2: 进入配置文件目录
cd /usr/share/kibana/config

// Step 3:  编辑文件kibana.yml
vi kibana.yml

// Step 4: 点击i,进入insert模式, 在最后一行添加如下配置
i18n.locale: zh-CN

// Step 5: 点击Esc,输入:wq 保存并推出kibana.yml

// Step 6: 退出kibana容器
exit

// Step 7:  并重启容器
docker restart kibana

// 访问`http://47.109.156.181:5601`即可访问`Kibana`中文页面。

3、安装IK分词器

IK Analyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始, IKAnalyzer已经推出了多个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。IK Analyzer则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

ElasticSearch内核其实就是基于Lucene,所以我们可以直接在ElasticSearch中集成IK分词器,IK分词器集成ElasticSearch下载地址:github.com/medcl/elast…

3.1、在线安装

// Step 1: 进入容器内部
docker exec -it elasticsearch /bin/bash

// Step 2: 在线下载并安装
./bin/elasticsearch-plugin  install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

// Step 3: 退出
exit

// Step 4:重启容器
docker restart elasticsearch

3.2、离线安装

安装插件需要知道elasticsearchplugins目录位置,而我们用了数据卷挂载,因此需要查看elasticsearch的数据卷目录,通过下面命令查看:

// 查看数据卷目录
docker volume inspect es-plugins

显示结果:说明plugins目录被挂载到了:/var/lib/docker/volumes/es-plugins/_data这个目录中。

[
    {
        "CreatedAt": "2022-05-06T10:06:34+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/es-plugins/_data",
        "Name": "es-plugins",
        "Options": null,
        "Scope": "local"
    }
]

下载安装包elasticsearch-analysis-ik-7.12.1.zip后,并解压,目录如下 image.png 先将解压后的elasticsearch-analysis-ik-7.12.1拷贝云服务器中。 image.png

// Step1: 为了方便配置,我们将elasticsearch-analysis-ik-7.12.1改成ik文件夹
mv elasticsearch-analysis-ik-7.12.1 ik

// Step2: 将ik文件夹拷贝到elasticsearch容器的`plugins`目录中
docker cp ik elasticsearch:/usr/share/elasticsearch/plugins/_data

// Step3: 重启容器
docker restart elasticsearch

// 查看es日志 
docker logs -f elasticsearch

3.3、测试IK分词器

IK分词器包含两种模式:

  • ik_smart:最少切分
  • ik_max_word:最细切分

kibanaDev tools中输入以下代码:

analyzer 就是选择分词器模式

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "黑马程序员学习java太棒了"
}

结果:

{
  "tokens" : [
    {
      "token" : "黑马",
      "start_offset" : 0,
      "end_offset" : 2,
      "type" : "CN_WORD",
      "position" : 0
    },
    {
      "token" : "程序员",
      "start_offset" : 2,
      "end_offset" : 5,
      "type" : "CN_WORD",
      "position" : 1
    },
    {
      "token" : "程序",
      "start_offset" : 2,
      "end_offset" : 4,
      "type" : "CN_WORD",
      "position" : 2
    },
    {
      "token" : "员",
      "start_offset" : 4,
      "end_offset" : 5,
      "type" : "CN_CHAR",
      "position" : 3
    },
    {
      "token" : "学习",
      "start_offset" : 5,
      "end_offset" : 7,
      "type" : "CN_WORD",
      "position" : 4
    },
    {
      "token" : "java",
      "start_offset" : 7,
      "end_offset" : 11,
      "type" : "ENGLISH",
      "position" : 5
    },
    {
      "token" : "太棒了",
      "start_offset" : 11,
      "end_offset" : 14,
      "type" : "CN_WORD",
      "position" : 6
    },
    {
      "token" : "太棒",
      "start_offset" : 11,
      "end_offset" : 13,
      "type" : "CN_WORD",
      "position" : 7
    },
    {
      "token" : "了",
      "start_offset" : 13,
      "end_offset" : 14,
      "type" : "CN_CHAR",
      "position" : 8
    }
  ]
}
3.3.1、扩展词词典

随着互联网的发展,造词运动也越发的频繁。出现了很多新的词语,在原有的词汇列表中并不存在。比如:“奥力给”,“白嫖” 等。所以我们的词汇也需要不断的更新,IK分词器提供了扩展词汇的功能。

1、打开IK分词器config目录: image

2、在IK Analyzer.cfg.xml配置文件内容添加:

<?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">ext.dic</entry>
</properties>

3、新建一个 ext.dic,可以参考config目录下复制一个配置文件进行修改

白嫖
奥力给

4、重启elasticsearch

docker restart elasticsearch

# 查看 日志
docker logs -f elasticsearch

image 日志中已经成功加载ext.dic配置文件

5、测试效果:

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "传智播客Java就业超过90%,奥力给!"
}

注意当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑

3.3.2、停用词词典

在互联网项目中,在网络间传输的速度很快,所以很多语言是不允许在网络上传递的,如:关于宗教、政治等敏感词语,那么我们在搜索时也应该忽略当前词汇。IK分词器也提供了强大的停用词功能,让我们在索引时就直接忽略当前的停用词汇表中的内容。

1、IK Analyzer.cfg.xml配置文件内容添加:

<?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">ext.dic</entry>
         <!--用户可以在这里配置自己的扩展停止词字典  *** 添加停用词词典-->
        <entry key="ext_stopwords">stopword.dic</entry>
</properties>

2、在 stopword.dic 添加停用词

大帅逼

3、重启elasticsearch

# 重启服务
docker restart elasticsearch
docker restart kibana
# 查看 日志
docker logs -f elasticsearch

日志中已经成功加载stopword.dic配置文件

4、测试效果:

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "我是真的会谢Java就业率超过95%,大帅逼都点赞白嫖,奥力给!"
}

注意当前文件的编码必须是 UTF-8 格式,严禁使用Windows记事本编辑。