1.部署单点es

1.1.创建网络

因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:

docker network create es-net

1.2.加载镜像

自己下载注意版本

docker load -i es.tar

docker load -i kibana .tar

1.3.运行

运行docker命令,部署单点es:

docker run -d \
	--name es \
    -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 \
    --privileged \
    --network es-net \
    -p 9200:9200 \
    -p 9300:9300 \
elasticsearch:7.12.1

命令解释:

  • -e "cluster.name=es-docker-cluster":设置集群名称
  • -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:挂载逻辑卷,绑定es的数据目录
  • -v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录
  • -v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录
  • --privileged:授予逻辑卷访问权
  • --network es-net :加入一个名为es-net的网络中
  • -p 9200:9200:端口映射配置

在浏览器中输入自己的IP+:9200即可看到elasticsearch的响应结果:

linux系统设置es占用内存 linux部署es_搜索引擎

2.部署kibana

kibana可以给我们提供一个elasticsearch的可视化界面。

2.1.部署

运行docker命令,部署kibana

docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--network=es-net \
-p 5601:5601  \
kibana:7.12.1
  • --network es-net :加入一个名为es-net的网络中,与elasticsearch在同一个网络中
  • -e ELASTICSEARCH_HOSTS=http://es:9200":设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch
  • -p 5601:5601:端口映射配置

在浏览器中输入自己的IP+:5601 即可看到结果

3.安装IK分词器

es自带的分词器无法对中文分词

# 测试
POST /_analyze
{
  "analyzer": "standard",
  "text": "好好学习"
}

#结果
{
  "tokens" : [
    {
      "token" : "好",
      "start_offset" : 0,
      "end_offset" : 1,
      "type" : "<IDEOGRAPHIC>",
      "position" : 0
    },
    {
      "token" : "好",
      "start_offset" : 1,
      "end_offset" : 2,
      "type" : "<IDEOGRAPHIC>",
      "position" : 1
    },
    {
      "token" : "学",
      "start_offset" : 2,
      "end_offset" : 3,
      "type" : "<IDEOGRAPHIC>",
      "position" : 2
    },
    {
      "token" : "习",
      "start_offset" : 3,
      "end_offset" : 4,
      "type" : "<IDEOGRAPHIC>",
      "position" : 3
    }
  ]
}

3.1.在线安装ik插件

# 进入容器内部
docker exec -it es /bin/bash

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

#退出
exit
#重启容器
docker restart es

3.2.离线安装ik插件

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

docker volume inspect es-plugins
[
    {
        "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"
    }
]

将分词器安装包解压并上传到插件数据卷中

# 重启容器
docker restart es

3.3.测试

IK分词器包含两种模式:

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

GET /_analyze
{
  "analyzer": "ik_max_word",
  "text": "好好学习"
}

查看结果

4. 自动补全插件

效果:

linux系统设置es占用内存 linux部署es_搜索引擎_02

4.1 拼音分词器

安装方法同上

测试:

 默认拼音分词器不好用,需要自定义

POST /_analyze
{
  "text": "如家酒店还不错",
  "analyzer": "pinyin"
}

4.2 自定义分词器

elasticsearch中分词器(analyzer)的组成包含三部分:

  • character filters:在tokenizer之前对文本进行处理。例如删除字符、替换字符
  • tokenizer:将文本按照一定的规则切割成词条(term)。例如keyword,就是不分词;还有ik_smart
  • tokenizer filter:将tokenizer输出的词条做进一步处理。例如大小写转换、同义词处理、拼音处理等

 步骤:

  • 创建索引库时,在settings中配置,可以包含三部分
  • character filter
  • tokenizer
  • filter

linux系统设置es占用内存 linux部署es_搜索引擎_03

自定义分词器和自动补全代码如下:

PUT /hotel
{
   "settings":{
  "analysis":{
   "analyzer":{
    "my_analyzer":{
     "tokenizer":"ik_max_word",
      "filter":"py"
    },
    "completion_analyzer":{
      "tokenizer":"keyword",
      "filter":"py"
    }
   },
"filter":{
  "py":{
    "type":"pinyin",
    "keep_full_pinyin":false,
    "keep_joined_full_pinyin":true,
    "keep_original":true,
    "limit_first_letter_length":16,
    "remove_duplicated_term":true,
    "none_chinese_pinyin_tokenize":false
    }
   }
  }
 },
  "mappings": {
    "properties": {
      
      "id":{
        "type": "keyword"
      },
      "name":{
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "ik_max_word", 
        "copy_to": "all"
      },
      "address":{
        "type":"keyword",
        "index": false
      },
      "price":{
        "type": "integer"
      },
      "brand":{
        "type": "keyword",
         "copy_to": "all"
      },
      "city":{
        "type": "keyword",
         "copy_to": "all"
      },
      "starName":{
        "type": "keyword"
      },
      "business":{
        "type": "keyword"
      },
      "location":{
        "type": "geo_point"
      },
      "pic":{
        "type": "keyword",
        "index": false
      },
      "all":{
        "type": "text",
        "analyzer": "my_analyzer",
        "search_analyzer": "ik_max_word"
      },
      "suggestion":{
        "type":"completion",
        "analyzer": "completion_analyzer",
        "search_analyzer": "keyword"
      }
    }
  }
}

 结果:

linux系统设置es占用内存 linux部署es_大数据_04

5. 扩展词词典

打开IK分词器config目录:

linux系统设置es占用内存 linux部署es_大数据_05

 在IKAnalyzer.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>

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

好好学习

天天向上

……

重启elasticsearch

docker restart es

5.1停用词词典

在互联网项目中,在网络间传输的速度很快,所以很多敏感词语是不允许在网络上传递的,那么我们在搜索时也应该忽略当前词汇。

IKAnalyzer.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>

在 stopword.dic 添加停用词

XXX

重启elasticsearch

docker restart elasticsearch
docker restart kibana

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

6.部署es集群

部署es集群可以直接使用docker-compose来完成。

首先编写一个docker-compose文件,内容如下:

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9201:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9202:9200
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
    ports:
      - 9203:9200
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge

然后启动

docker-compose up