基于Linux环境部署和使用ElasticSearch搜索引擎
目录
- 一.Elasticsearch基础介绍
- 二.Docker部署单节点ElasticSearch
- 1.环境配置
- 2.创建数据目录
- 3.创建ES自定义配置文件
- 4.启动ElasticSearch服务
- 5.验证服务
- 三.Docker Compose部署单节点ElasticSearch
- 1.环境配置
- 2.创建docker-compose.yml
- 3.创建配置文件elasticsearch.yml
- 4.启动ElasticSearch服务
- 5.验证服务
- 四.Docker部署ElasticSearch集群
- 1.Docker启动单节点集群
- 2.Docker Compose启动多节点集群
- 2.1创建docker-compose.yml文件
- 2.2运行docker-compose启动集群
- 五.Elasticsearch可视化
- 1.Elasticsearch-head
- 2.Elasticsearch-head插件安装和使用
- 六.Elasticsearch基础操作
- 七.Elasticsearch使用资料
一.Elasticsearch基础介绍
- Elasticsearch为所有类型的数据提供实时搜索和分析。无论您是结构化文本还是非结构化文本,数字数据或地理空间数据,Elasticsearch都能以支持快速搜索的方式有效地对其进行存储和索引。
- Elasticsearch是一个分布式文档存储。Elasticsearch不会将信息存储为列数据的行,而是存储已序列化为JSON文档的复杂数据结构。当集群中有多个Elasticsearch节点时,存储的文档将分布在集群中,并且可以从任何节点立即访问。
- Elasticsearch使用称为倒排索引的数据结构,该结构支持非常快速的全文本搜索。反向索引列出了出现在任何文档中的每个唯一单词,并标识了每个单词出现的所有文档。
- Elasticsearch提供了一个简单,一致的REST API,用于管理集群以及索引和搜索数据,支持结构化查询,全文查询和结合了两者的复杂查询。
- 理解集群(cluster)、 节点(node)、索引(index)、 类型(type)、文档(document)、分片和复制(shards & replicas)等概念。映射(Mapping)用于定义一个索引(index)的某个类型(type)的数据的结构(类似于传统关系型数据中table的schema),mapping中主要包括字段名、字段数据类型和字段索引类型。
二.Docker部署单节点ElasticSearch
1.环境配置
- 基础环境
# Docker
Docker version 26.1.4, build 5650f9b
# 系统信息
Operating System: openEuler 24.03 (LTS)
Kernel: Linux 6.6.0-28.0.0.34.oe2403.x86_64
Architecture: x86-64
- 拉取镜像
# 拉取 elasticsearch docker 镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.4.3
2.创建数据目录
mkdir -p /data/es/{data,config,logs}
chown 1000:0 /data/es/{data,logs}
3.创建ES自定义配置文件
- 编写 elasticsearch.yml 配置文件,挂载到容器配置文件目录(/usr/share/elasticsearch/config)
- elasticsearch.yml 文件内容(该配置文件是针对Elasticsearch 8.4.3版本的配置内容,Elasticsearch的配置可能会根据版本和特定用例而有所不同)
ingest.geoip.downloader.enabled: false
http.host: 0.0.0.0
node.name: node-1
cluster.name: es-cluster
path.data: /data/elasticsearch-8.4.3/data
path.logs: /data/elasticsearch-8.4.3/logs
xpack.security.http.ssl.enabled: false
xpack.security.enabled: false
xpack.security.transport.ssl.enabled: false
http.cors.enabled: true
http.cors.allow-origin: "*"
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length
cluster.routing.allocation.disk.threshold_enabled: false
-
elasticsearch.yml文件说明
-
ingest.geoip.downloader.enabled: false 禁用了GeoIP数据的下载;GeoIP 是一种用于根据 IP地址查找地理位置信息的功能,通过将其设置为“false”,将禁用此功能
-
http.host: 0.0.0.0 指定 Elasticsearch 服务 HTTP请求地址;“0.0.0.0”意味着服务将监听所有可用的网络接口,允许Elasticsearch接受来自任何IP地址的HTTP请求
-
node.name: node-1 指定 Elasticsearch 节点的名称,Elasticsearch集群中的每个节点必须有一个唯一的名称
-
cluster.name: es-cluster 指定 Elasticsearch 集群的名称,属于同一集群的节点应该配置相同的集群名称
-
path.data: /data/elasticsearch-8.4.3/data 指定 Elasticsearch 数据存储路径
-
path.logs: /data/elasticsearch-8.4.3/logs 指定 Elasticsearch 日志存储路径
-
xpack.security.http.ssl.enabled: false 控制HTTP通信是否启用SSL/TLS加密,通过将其设置为“false”,HTTP流量的SSL/TLS加密被禁用
-
xpack.security.enabled: false 是否启用X-Pack安全特性;X-Pack是Elastic (Elasticsearch背后的公司)提供的一组商业功能,通过将其设置为“false”,将禁用这些安全功能
-
xpack.security.transport.ssl.enabled: false 控制是否为传输层启用SSL/TLS加密,传输层处理Elasticsearch节点之间的通信;通过将其设置为“false”,在节点到节点的通信中禁用SSL/TLS加密
-
http.cors.enabled: true 开启Elasticsearch HTTP服务的CORS (Cross-Origin Resource Sharing)功能;CORS是一个安全特性,允许从运行在不同域上的web浏览器控制访问Elasticsearch资源
-
http.cors.allow-origin: “*” 指定CORS请求允许的源(域);’ * ’ 通配符表示允许任何域向Elasticsearch发出CORS请求
-
http.cors.allow-headers: Authorization,X-Requested-With,Content-Type,Content-Length 定义了CORS请求允许的HTTP头列表;CORS请求Elasticsearch时,允许使用指定的头,如Authorization、X-Requested-With、Content-Type、Content-Length
-
4.启动ElasticSearch服务
# 在Docker中运行Elasticsearch 8.4.3镜像
docker run --name elasticsearch --net=host --restart=always -d -e ES_JAVA_OPTS="-Xms2048m -Xmx2048m" -v /data/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/es/logs:/data/elasticsearch-8.4.3/logs -v /data/es/data:/data/elasticsearch-8.4.3/data elasticsearch:8.4.3
- -name elasticsearch:将容器命名为 elasticsearch
- –net=host:使用主机网络模式,使Elasticsearch能够直接使用主机的网络接口
- –restart=always:设置容器在退出时自动重启
- -d:以后台模式运行容器
- -e ES_JAVA_OPTS=“-Xms2048m -Xmx2048m”:设置Elasticsearch的Java堆内存大小为2048MB;ES_JAVA_OPTS=“-Xms1g -Xmx1g” 表示设置最小和最大 JVM 堆大小为 1 GB
- -v /data/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:将主机上的elasticsearch.yml文件挂载到容器内的相应路径,用于自定义Elasticsearch的配置
- -v /data/es/logs:/data/elasticsearch-8.4.3/logs:将主机上的日志目录挂载到容器内的相应路径,用于存储Elasticsearch的日志
- -v /data/es/data:/data/elasticsearch-8.4.3/data:将主机上的数据目录挂载到容器内的相应路径,用于存储Elasticsearch的数据
5.验证服务
# 验证 elasticsearch 服务是否正常运行,elasticsearch 默认使用 9200 端口进行http请求
curl http://localhost:9200
# 在浏览器的地址栏输入https://localhost:9200
# Elasticsearch-head可视化工具查看内容
三.Docker Compose部署单节点ElasticSearch
1.环境配置
# 创建network
docker network create elastic
# 拉取镜像,如拉取版本8.12.2
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2
# 创建挂载目录,赋予读写权限
mkdir -p ./es/{data,config,plugins}
chmod -R 777 ./es
# es部署目录下创建docker-compose.yml文件
2.创建docker-compose.yml
version: '3.8'
services:
es01:
container_name: es01
image: docker.elastic.co/elasticsearch/elasticsearch:8.12.2
environment:
- discovery.type=single-node
- ELASTIC_PASSWORD=sc2024
- TZ=Asia/Shanghai
ports:
- "9200:9200"
- "9300:9300"
mem_limit: 1g
volumes:
- ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./es/plugins:/usr/share/elasticsearch/plugins
- ./es/data:/usr/share/elasticsearch/data
networks:
- elastic
networks:
elastic:
external: true
3.创建配置文件elasticsearch.yml
# 配置host为0.0.0.0 允许远程访问
http.host: 0.0.0.0
# 跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
# 开启密码访问,如果不开启密码访问则设置为false
xpack.security.enabled: true
4.启动ElasticSearch服务
# docker-compose.yml的同级目录下执行如下命令启动服务
docker-compose up -d 或 docker compose up -d
5.验证服务
- 在浏览器中访问:http://10.0.28.84:9200
#默认用户名 elastic
用户名:elastic
# 密码在docker-compose.yml 中配置的环境变量ELASTIC_PASSWORD的值
密码:your password
四.Docker部署ElasticSearch集群
1.Docker启动单节点集群
docker run -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" --net=elastic --name elasticsearch -v /data/es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /data/es/data:/usr/share/elasticsearch/data -v /data/es/plugins:/usr/share/elasticsearch/plugins docker.elastic.co/elasticsearch/elasticsearch:8.4.3
2.Docker Compose启动多节点集群
2.1创建docker-compose.yml文件
version: '3.8'
services:
es01:
image: docker.elastic.co/elasticsearch/elasticsearch:8.4.3
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=-Xms2048m -Xmx2048m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es/data01:/usr/share/elasticsearch/data
- ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./es/plugins:/usr/share/elasticsearch/plugins
ports:
- 9200:9200
- 9300:9300
networks:
- elastic
es02:
image: docker.elastic.co/elasticsearch/elasticsearch:8.4.3
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=-Xms2048m -Xmx2048m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es/data02:/usr/share/elasticsearch/data
- ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./es/plugins:/usr/share/elasticsearch/plugins
networks:
- elastic
es03:
image: docker.elastic.co/elasticsearch/elasticsearch:8.4.3
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=-Xms2048m -Xmx2048m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./es/data03:/usr/share/elasticsearch/data
- ./es/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- ./es/plugins:/usr/share/elasticsearch/plugins
networks:
- elastic
volumes:
data01:
driver: local
data02:
driver: local
data03:
driver: local
networks:
elastic:
# driver: bridge
external: true
-
docker-compose.yml 使用环境变量 ES_JAVA_OPTS 手工设置堆大小为 512 MB。我们不推荐在生产环境使用 ES_JAVA_OPTS。
-
Docker Compose 文件,提供了一个三节点 Elasticsearch 集群。节点 es01 监听 localhost:9200,es02 和 es03 通过 Docker 网络与 es01 通信
-
此配置在所有网络接口上暴露端口 9200,Elasticsearch 集群可以公开访问,可能会忽略任何防火墙设置。如果不想暴露端口 9200,转而使用反向代理,在 docker-compose.yml 文件中用 127.0.0.1:9200:9200 替代 9200:9200。Elasticsearch 将只能从主机自身访问。
-
Docker 命名卷 data01、data02 和 data03 存储节点数据目录,以便重启时数据持续存在。如果他们不存在,docker-compose 将会在你创建集群时创建他们
2.2运行docker-compose启动集群
# 启动集群,使用 docker-compose up 重启集群,Docker 卷中的数据将被保存和加载
docker-compose up
# 提交请求 _cat/nodes 查看节点是否启动运行
curl -X GET "localhost:9200/_cat/nodes?v=true&pretty"
# 停止集群
docker-compose down
# 在停止集群时删除数据卷,指定 -v 选项
docker-compose down -v
- 默认情况下,你可以使用 docker logs 访问日志。如果你更想 Elasticsearch 容器把日志写入磁盘,设置环境变量 ES_LOG_STYLE 为 file。这将导致 Elasticsearch 使用与其他 Elasticsearch 分发格式相同的配置。
五.Elasticsearch可视化
1.Elasticsearch-head
- Elasticsearch-head是一种便捷查询操作Elasticsearch库的可视化工具,具备集群管理、增删查改等功能,用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。
- Elasticsearch-head为ES开发的一个页面客户端工具,其源码托管于GitHub,地址为:https://github.com/mobz/elasticsearch-head
2.Elasticsearch-head插件安装和使用
- 下载插件,下载插件地址:https://github.com/liufengji/es-head。
- 修改名称并解压,将elasticsearch-head.crx更名为elasticsearch-head.rar 再解压,进入elasticsearch-head文件夹将_metadata文件夹重命名为metadata。
- 安装插件,打开Google浏览器右上角设置>>>更多工具>>>扩展程序>>>,点击加载已解压的扩展程序,选择解压elasticsearch-head文件夹即可添加插件成功。
- 输入连接地址ip:端口号后点链接即可,如需有ES安全认证会弹出账号和密码输入后登录即可,连接后显示绿色代表健康。
六.Elasticsearch基础操作
- 创建 Elasticsearch 客户端并连接到 Elasticsearch
from elasticsearch import Elasticsearch
ES_HOSTS = 'http://localhost:9200'
# maxsize设置连接池中每个节点的最大连接数,timeout设置请求超时时间,retry_on_timeout超时后重试请求
def initialize_es(ES_HOSTS):
es_client = Elasticsearch(hosts=ES_HOSTS,maxsize=1000,timeout=30,retry_on_timeout=True)
health = es_client.cluster.health() # 检查ES集群健康状态
return es_client
- 创建或更新 Elasticsearch 索引用于存储特征向量
def create_es_index(es_client, index_name, dims=1024):
if not es_client.indices.exists(index=index_name):
mapping = {
"mappings": {
"properties": {
"id": {"type": "keyword"},
"embeddings": {
"type": "dense_vector",
"dims": dims,
"index": True,
"similarity": "cosine"
},
"original_path": {"type": "keyword"},
"thumbnail_path": {"type": "keyword"}
}
}
}
es_client.indices.create(index=index_name, body=mapping)
- 在 Elasticsearch 索引中添加文档数据
doc = {"id": image_id,"embeddings": vector,"original_path": original_url,"thumbnail_path": thumbnail_url}
es_client.index(index=index_name, id=doc['id'], document=doc)
- Elasticsearch 增删改查索引和增删改查索引中的数据等通用操作,查询数据包括复合查询、切片查询、范围查询、前缀查询、通配符查询、正则匹配查询、排序查询、滚动查询等
es_client.indices.create(index=index_name, body=mapping) # 创建索引
index_info = es_client.indices.get(index=index_name) # 查询索引
if es.indices.exists(index=index_name): # 判断索引是否存在
es.indices.delete(index=index_name) # 删除索引
es_client.index(index=index_name, id=doc['id'], document=doc) # 添加数据,更新数据(如果当前id存在则为更新)
res = es_client.search(index=index_name, body=query) # 查询数据,根据查询方式更改query
七.Elasticsearch使用资料
- elasticsearch查询客户端 es-client:项目主页 | es-client
- elasticsearch 未授权访问漏洞验证及修复
- Python Elasticsearch client
- elasticsearch-head
- Python Elasticsearch client
- elasticsearch-head
- Elasticsearch 教程