【ES】【elasticsearch】分布式搜索

news/2024/7/7 5:46:47 标签: docker, elasticsearch, 分布式

文章目录

  • ☀️安装elasticsearch
  • ☀️1.部署单点es
    • 🌸1.1.创建网络
    • 🌸1.2.下载镜像
    • 🌸1.3.运行
  • ☀️2.部署kibana
    • 🌸2.1.部署
    • 🌸2.2.DevTools
  • ☀️3.安装IK分词器
    • 🌸3.1.在线安装ik插件(较慢)
    • 🌸3.2.离线安装ik插件(推荐)
      • 🌸1)查看数据卷目录
      • 🌸2)解压缩分词器安装包
      • 🌸3)上传到es容器的插件数据卷中
      • 🌸4)重启容器
      • 🌸5)测试:
    • 🌸3.3 扩展词词典
  • ☀️4.部署es集群

elasticsearch_1">☀️安装elasticsearch

☀️1.部署单点es

🌸1.1.创建网络


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

docker network create es-net

🌸1.2.下载镜像


docker镜像官网https://hub.docker.com/search?q=elasticsearch

docker pull elasticsearch:7.12.1

🌸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:端口映射配置

☀️2.部署kibana


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

docker pull kibana:7.12.1

🌸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:端口映射配置

kibana启动一般比较慢,需要多等待一会,可以通过命令:

docker logs -f kibana

查看运行日志,当查看到下面的日志,说明成功:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JIy4PK1J-1692000631230)(assets/image-20210109105135812.png)]

此时,在浏览器输入地址访问:http://ip:5601,即可看到结果

🌸2.2.DevTools


kibana中提供了一个DevTools界面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PqoXSA15-1692000631231)(assets/image-20210506102630393.png)]

在这里插入图片描述

这个界面中可以编写DSL来操作elasticsearch。并且对DSL语句有自动补全功能。

☀️3.安装IK分词器


🌸3.1.在线安装ik插件(较慢)


# 进入容器内部
docker exec -it es 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插件(推荐)


🌸1)查看数据卷目录


安装插件需要知道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"
    }
]

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

🌸2)解压缩分词器安装包


下载分词器包: https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip

重命名为ik

在这里插入图片描述

🌸3)上传到es容器的插件数据卷中


也就是/var/lib/docker/volumes/es-plugins/_data
在这里插入图片描述

🌸4)重启容器


# 4、重启容器
docker restart es
# 查看es日志
docker logs -f es

🌸5)测试:


IK分词器包含两种模式:

  • ik_smart:最少切分

  • ik_max_word:最细切分

在这里插入图片描述

GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "疯狂星期四v50我"
}

结果:

{
  "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" : "v50",
      "start_offset" : 5,
      "end_offset" : 8,
      "type" : "LETTER",
      "position" : 2
    },
    {
      "token" : "我",
      "start_offset" : 8,
      "end_offset" : 9,
      "type" : "CN_CHAR",
      "position" : 3
    }
  ]
}

🌸3.3 扩展词词典


随着互联网的发展,“造词运动”也越发的频繁。出现了很多新的词语,在原有的词汇列表中并不存在。比如:“黑粉”,“爱坤” 等。

所以我们的词汇也需要不断的更新,IK分词器提供了扩展词汇的功能。

来试一把 , 可以看到根本识别不出来

GET /_analyze
{
  "analyzer": "ik_smart",
  "text": "我们都是爱坤,不是黑粉"
}

在这里插入图片描述
1)打开IK分词器config目录:
在这里插入图片描述
2)在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>

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

爱坤
黑粉

4)重启elasticsearch

docker restart es

# 查看 日志
docker logs -f es
  1. 测试一下

可以看到非常完美的分词成功
在这里插入图片描述

☀️4.部署es集群


部署es集群可以直接使用docker-compose来完成,不过要求你的Linux虚拟机至少有4G的内存空间

首先编写一个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:
      - 9200: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
    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
    networks:
      - elastic

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

networks:
  elastic:
    driver: bridge

Run docker-compose to bring up the cluster:

docker-compose up

http://www.niftyadmin.cn/n/4939484.html

相关文章

Flowable 6.8.0中主要数据表及其字段

在Flowable 6.8.0中&#xff0c;以下是每个表的作用并列出每张表的所有字段及其含义&#xff1a; act_evt_log (用于记录流程引擎事件的日志) log_nr&#xff1a;日志编号type&#xff1a;事件类型proc_def_id&#xff1a;流程定义IDproc_inst_id&#xff1a;流程实例IDexecuti…

新能源汽车电控系统

新能源汽车电控系统主要分为&#xff1a;三电系统电控系统、高压系统电控系统、低压系统电控系统 三电系统电控系统 包括整车控制器、电池管理系统、驱动电机控制器等。 整车控制器VCU 整车控制器作为电动汽车中央控制单元&#xff0c;是整个控制系统的核心&#xff0c;也是…

移植 U-boot常见命令

U-boot官方提供的命令有很多&#xff0c;并且支持自定义命令。但在实际开发中&#xff0c;即落实到具体某一款开发板时&#xff0c;并不需要那么多的命令&#xff0c;所以半导体厂商或开发板生产厂商会配置自己的uboot 1.查询命令 1.1 bdinfo 查看芯片中各设备使用的地址 使用…

关于vue,记录一次修饰符.stop和.once的使用,以及猜想。

内置指令 | Vue.js 在vue的api里&#xff0c;关于v-on有stop和once两个事件标签。 .stop - 调用 event.stopPropagation()。.once - 最多触发一次处理函数。 原有主要代码和页面效果 &#xff08;无stop和once&#xff09;: ...<div class"div" click"di…

欧拉函数和最大公约数

分析&#xff1a;如果两个数的最大公约数是一个质数p&#xff0c;那么这两个数都除以p&#xff0c;得到的两个数的最大公约数一定是1. 反证法&#xff1a;如果得到的两个数的最大公约数不是1&#xff0c;那么把此时的最大公约数乘以上边的最大公约数&#xff0c;得到的一定比上…

小程序-uni-app:hbuildx uni-app 安装 uni-icons 及使用

一、官方文档找到uni-icons uni-app官网 二、下载插件 三、点击“打开HBuildX” 四、选择要安装的项目 五、勾选要安装的插件 六、安装后&#xff0c;项目插件目录 根目录uni_modules目录下增加uni-icons、uni-scss 七、引入组件&#xff0c;使用组件 <uni-icons type&qu…

Linux学习之防火墙概述

防火墙分类&#xff1a; 软件防火墙&#xff1a;常用于数据包的过滤&#xff0c;比如限制某些ip或者端口&#xff0c;进行某些数据的转发或者传送 硬件防火墙&#xff1a;防御地域攻击 软件防火墙的分类&#xff1a; 包过滤防火墙&#xff1a;控制比较宽泛&#xff0c;防御效果…

Netty:ByteBuf类型转化

说明 io.netty.buffer.ByteBuf经常需要跟其它类型互相转化&#xff0c;例如ByteBuf类型作为Object类型函数参数传递&#xff0c;函数内部处理时将Object转换为ByteBuf。 代码示例 ByteBuf和Object类型互转 package com.thb;import io.netty.buffer.ByteBuf; import io.net…