elasticsearch 通用笔记

文章目录

一、前言

本文主要叙述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、创建服务文件

下面的 Userelasticsearch 因个人而定,这里默认采用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、匹配查询

默认查询元素元素为 nameagebirthday

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、多字段匹配

分词后查询

这里采用搜索 namenick_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"
  }
}'
相关推荐
铭毅天下7 小时前
《一本书讲透 Elasticsearch》勘误表
大数据·elasticsearch·搜索引擎·全文检索
扣丁梦想家7 小时前
Elasticsearch基础教程:从入门到上手
大数据·elasticsearch·搜索引擎
吱屋猪_8 小时前
Elasticsearch 介绍:分布式搜索与分析引擎
elasticsearch
可观测性用观测云10 小时前
ElasticSearch 可观测性最佳实践
elasticsearch
梦想歌13 小时前
Elasticsearch 分页查询技巧:小数据与大数据场景下的最佳实践
elasticsearch
梦想歌14 小时前
索引设计不合理?Elasticsearch 零停机迁移救场指南
elasticsearch
梦想歌14 小时前
Elasticsearch 批量操作冲突?试试这 2 种优化技巧
elasticsearch
梦想歌14 小时前
如何安全备份 Elasticsearch 数据?两种方案任你选
elasticsearch
Elastic 中国社区官方博客14 小时前
Elasticsearch 在航空行业:数据管理的游戏规则改变者
大数据·数据库·elasticsearch·搜索引擎·全文检索