文章目录
- 一、前言
- 二、内容说明
- 三、操作内容
- 四、常见问题处理
-
- 1、数据迁移处理
- [2、处理shard 满的问题](#2、处理shard 满的问题)
- [3、最大子句数量 设置问题](#3、最大子句数量 设置问题)
- 4、分片配置检测(通常关闭了分片)
一、前言
本文主要叙述
ES
的结构,基础查询
和部分调用实践
内容,主要以7.x
版本为基准
二、内容说明
1、目录简介
bin/
包含 Elasticsearch 的启动脚本和管理工具
比如 elasticsearch(启动服务)和插件管理工具 elasticsearch-plugin 等。
config/
保存 Elasticsearch 的配置文件。
主要包括:
-
elasticsearch.yml: 核心配置文件,用于定义集群名称、节点设置、网络绑定等。
-
jvm.options: 用于配置 JVM 相关参数,例如堆大小、垃圾回收设置。
-
log4j2.properties: 配置日志记录参数。
data/
存储实际的索引数据。
每个节点的所有索引及其分片数据都保存在这个目录中。
logs/
存储 Elasticsearch 的日志文件。
modules/
保存 Elasticsearch 核心功能模块
比如内置的分析器或监控功能。通常不需要手动干预。
plugins/
保存已安装的插件,每个插件都有一个单独的子目录。
例如 Kibana 连接插件或安全插件。
lib/
包含 Elasticsearch 运行所需的核心类库和依赖包。
2、本文例子前提内容
默认部署的ip地址
: 192.168.6.8用户组及用户
: elasticsearch:elasticsearch安装目录
: /opt/elasticsearch测试索引
:my_index
三、操作内容
1、设置ES为服务
1.1、创建服务文件
下面的
User
和elasticsearch
因个人而定,这里默认采用elasticsearch
用户组
shell
sudo nano /etc/systemd/system/elasticsearch.service
bash
[Unit]
Description=Elasticsearch
Documentation=https://www.elastic.co
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=elasticsearch
Group=elasticsearch
ExecStart=/opt/elasticsearch/bin/elasticsearch
Restart=always
LimitNOFILE=65535
LimitNPROC=4096
[Install]
WantedBy=multi-user.target
1.2、重新加载守护进程(识别新服务文件)
bash
sudo systemctl daemon-reload
1.3、设置自启动及启停操作
bash
# 设置自启动
sudo systemctl enable elasticsearch
# 启动服务
sudo systemctl start elasticsearch
# 关闭服务
sudo systemctl stop elasticsearch
# 检测服务状态
sudo systemctl staus elasticsearch
2、查看健康度
curl -XGET 'http://192.168.6.8:9200/_cluster/health?pretty=true
响应示例
json
{
"cluster_name" : "elasticsearch",
"status" : "yellow",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 2,
"active_primary_shards" : 10,
"active_shards" : 20,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 10,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 66.7
}
参数解析
参数名称 | 含义 |
---|---|
cluster_name |
表示 Elasticsearch 集群的名称。 |
status |
集群健康状态,可能值为:green (健康)、yellow (有未分配副本分片)、red (有未分配主分片)。 |
number_of_nodes |
当前集群中节点的总数量,包括主节点和数据节点。 |
number_of_data_nodes |
当前集群中负责存储和查询数据的节点数量。 |
active_primary_shards |
当前处于活跃状态的主分片数量。 |
unassigned_shards |
当前未分配到任何节点的分片数。 |
number_of_pending_tasks |
集群中等待处理的任务数量。 |
active_shards_percent_as_number |
活跃分片的百分比,例如 66.7 表示当前 66.7% 的分片是活跃状态。 |
3、索引相关查询
基础查询格式
bash
curl -XGET 'http://192.168.6.8:9200/my_index/_search?pretty' -H "Content-Type: application/json" -d '{
"query": {
"match_all": {}
}
}'
3.1、查询指定索引内容
3.1.1、匹配查询
默认查询元素元素为
name
、age
、birthday
json
# keyword替换值
# 【分词匹配】 : match
# 【短语完全匹配】 : match_phrase
{
"query": {
"{{keyword}}": {
"name": "ringo lam"
}
}
}
3.1.2、精确匹配(不尝试分词)
json
# keyword替换值
# 【精确匹配】 : term
value : "ringo lam"
# 【短语完全匹配】 : terms
value : ["lao wu", "lao liu"]
{
"query": {
"{{keyword}}": {
"name": {{value}}
}
}
}
3.1.3、范围查询
主要针对数字会比较好,日期上偶尔会有点问题
json
# 数字示例
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
# 日期示例
{
"query": {
"range": {
"birthday": {
"gte": "2020-03-01", // 起始日期
"lte": "2023-03-31", // 截止日期
"format": "yyyy-MM-dd" // 日期格式 (可选)
}
}
}
}
3.1.4、id查询
根据文档的 _id 搜索文档
json
{
"query": {
"ids": {
"values": ["1", "2"]
}
}
}
3.1.5、通配符及前缀匹配
通配符模式,通常可以使用如下内容
- *:匹配 零个或多个任意字符(包括空字符)。
- ?:匹配 单个任意字符。
json
# keyword替换值
# 【指定前缀开头匹配】 : prefix
value : "lao"
# 【通配符匹配】 : wildcard
value : "lao*"
{
"query": {
"{{keyword}}": {
"name": {{value}}
}
}
}
3.1.6、正则表达式模式(最佳混淆匹配方案)
这里可以尽情发挥正则的匹配内容,性能上有损耗
bash
{
"query": {
"regexp": {
"name": "lao.*"
}
}
}
3.1.7、多字段匹配
分词后查询
这里采用搜索
name
和nick_name
字段
bash
{
"query": {
"multi_match": {
"query": "lao liu",
"name": ["name", "nick_name"]
}
}
}
3.1.8、函数分数查询(业务处理计算使用)
待清空业务关系后,
完善补充
3.1.9、布尔查询(组合查询方法)
组合多个条件来综合查询,主要增加过滤的条件
可以使用
must
(必须匹配)、should
(可以匹配)或must_not
(禁止匹配)
json
{
"query": {
"bool": {
"must": [
{ "match": { "name": "lao liu" } }
],
"should": [
{ "match": { "name": "lao wu" } }
],
"must_not": [
{ "term": { "name": "lao san" } }
]
}
}
3.2、查询mapping
bash
curl -XGET 'http://192.168.6.8:9200/my_index/_mappings?pretty'
3.3、查询所有索引信息
bash
curl -XGET 'http://192.168.6.8:9200/_cat/indices?v`
参数名称 | 含义 |
---|---|
health |
索引的健康状态:green (健康)、yellow (有未分配副本分片)、red (有未分配主分片)。 |
status |
索引的状态:open 表示索引是打开的,close 表示索引被关闭。 |
index |
索引的名称。 |
uuid |
索引的唯一标识符,用于区分不同的索引。 |
pri |
主分片的数量,即该索引拥有的主分片数量。 |
rep |
副本分片的数量,即每个主分片有多少副本。 |
docs.count |
当前索引中的文档总数,包括主分片和副本分片的总和。 |
docs.deleted |
已被标记为删除但尚未从磁盘中物理删除的文档数量。 |
store.size |
索引占用的总磁盘空间大小,包括主分片和副本分片。 |
pri.store.size |
主分片占用的磁盘空间大小,仅包含主分片的存储大小。 |
3.4、移除索引
这里默认测试id
6bd3b7e63f844886909e66c7f5548b50
bash
curl -XDELETE 'http://192.168.6.8:9200/my_index/_doc/6bd3b7e63f844886909e66c7f5548b50'
3.5、统计条数
bash
curl -XGET 'http://192.168.6.8:9200/my_index/_count?pretty'
四、常见问题处理
1、数据迁移处理
2、处理shard 满的问题
使用
Head插件
或者Kibana
的Dev Tools 执行如下命令(通过下面的命令重启es会失效,因为 transient 是临时生效的):
1、api配置 (临时处理,重启后失效)
bash
curl -X PUT "http://192.168.6.8:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d '
{
"persistent" : {
"cluster" : {
"max_shards_per_node" : "10000"
}
}
}'
2、通过 elasticsearch.yml
文件配置(永久处理)
cluster.max_shards_per_node: 10000
3、校验配置
bash
curl "http://192.168.6.8:9200/_cluster/settings?pretty"
3、最大子句数量 设置问题
查询时报错
示例错误:QueryPhaseExecutionException[failed to execute query]; nested: TooManyClauses[maxClauseCount is set to 1024];
1、api配置 (临时处理,重启后失效)
bash
curl -X PUT "http://192.168.6.8:9200/_cluster/settings?pretty" -H 'Content-Type: application/json' -d '
{
"persistent" : {
"indices.query.bool.max_clause_count" : "2048"
}
}'
2、通过 elasticsearch.yml
文件配置:
indices.query.bool.max_clause_count: 2048
3、校验配置
bash
curl "http://192.168.6.8:9200/_cluster/settings?pretty"
4、分片配置检测(通常关闭了分片)
集群可用
1、检测分片
curl -XGET 'http://localhost:9200/_cluster/settings?pretty'
2、开启分片配置
bash
curl -XPUT 'http://localhost:9200/_cluster/settings' -H 'Content-Type: application/json' -d '{
"transient": {
"cluster.routing.allocation.enable": "all"
}
}'