ElasticSearch第2篇(1.4万字记录ElasticSearch集群部署、节点、分片、副本、路由、的概念与增删改查操作、客户端调用、设置指标、集群读写流程、故障转移)

前置衔接文章:ElasticSearch第1讲(4万字详解 Linux下安装、原生调用、API调用超全总结、Painless、IK分词器、4种和数据库同步方案、高并发下一致性解决方案、Kibana、 ELK)

ElasticSearch集群

  • 极简概括:多个ES节点组成的一个系统。
  • 解决问题:
    • 防止单点故障。
    • 算力和容量负载均衡,用更多的节点来扩展集群的容量和性能。
  • 适用场景:涉及大数据检索的系统,无固定场景,有需求就用。
  • 优点:
    • 防止单点故障,当集群内一个节点挂掉后,不影响集群使用,若master节点挂掉,ES集群也会自动选举master,并持续对外提供服务(主节点恢复后就可能不在是主节点了,类似Redis的哨兵模式)
    • 算力和容量负载均衡,用更多的节点来扩展集群的容量和性能。
    • 高可用性:通过分片(Sharding)和副本(Replication)机制,ES能够保证数据的高可用性和容错性。即使某个节点出现故障,数据依然可以从其他副本中恢复。
    • 具有强大的分片与副本分布算法,开发人员不用刻意去维护。
  • 缺点:
    • 集群配置:对于配置集群,ES默认的配置文件并未提供充分的预留配置项,使得配置集群困难。
    • 运维成本:多个节点不可避免的增加运维成本。

ES集群搭建(version 8.14.1)

  • 搭建目标:192.168.0.183(master & data),192.168.0.183(data),192.168.0.183(data)。
  • 系统配置:
都要做集群的,推荐修改以下配置,用于Linux系统对es性能优化。

vim  /etc/security/limits.conf
文末添加两行配置,优化文件描述符软硬限制,对提高性能非常重要,文件描述符用于标识和管理每个进程都可以打开文件的数量
es soft nofile 65536
es hard nofile 65536

vim /etc/security/limits.d/20-nproc.conf
文末添加两行配置,优化文件描述符软硬限制,对提高性能非常重要,文件描述符用于标识和管理每个进程都可以打开文件的数量
es soft nofile 65536
es hard nofile 65536

vim /etc/sysctl.conf
定义系统中可以同时打开的最大文件描述符数量。
fs.file-max=655350
定义Linux内核中进程可以拥有的最大内存映射区域数量
vm.max_map_count=262144

重启
sysctl -p
  • 节点1配置
注意配置格式,key: value之间要留出空格,否则ES不识别对应的值。
通过上一章,已经安装好了ES,并能跑起来。可在这个基础上配置ES集群
vim ES根目录/config/elasticsearch.yml
找到---------------------------------- Cluster -----------------------------------段,修改以下内容
集群名称,一个集群下的节点,需要保持一致
cluster.name: zs_es_cluster
找到------------------------------------ Node ------------------------------------段,修改以下内容
节点名称,每个节点名称必须不一样
node.name: node_01
设置节点的角色,推荐只设置一个主节点
node.roles: [master, data]
找到---------------------------------- Network -----------------------------------段,修改以下内容
配置IP
network.host: 192.168.0.183
并添加一行端口
transport.tcp.port: 9300
将光标指针移至文末,添加跨域配置
http.cors.enabled: true
http.cors.allow-origin: "*"
http.max_content_length: 200MB

3行指令用于配置相关节点,以供服务发现
discovery.seed_hosts: ["1节点IP:主节点集群端口",2节点IP:主节点集群端口,3节点IP:主节点集群端口]

这个设置启用TCP连接的keep-alive机制。启用keep-alive后,Elasticsearch会定期向连接的另一端发送探测包,以检查连接是否仍然有效。这有助于保持长时间未活动的连接处于活动状态,从而防止连接由于超时被意外关闭。
network.tcp.keep_alive: true
这个选项禁用Nagle算法。Nagle算法用于减少网络上的小数据包的数量,但在实时系统中,它可能导致延迟。将network.tcp.no_delay设置为true可以确保数据包尽快发送,而不经过Nagle算法的延迟处理,有助于提高网络通信的实时性。
network.tcp.no_delay: true

在----------------------- BEGIN SECURITY AUTO CONFIGURATION -----------------------段,
若设置了
xpack.security.enabled: true
请打开
xpack.security.transport.ssl:
  enabled: true
否则报错bootstrap checks failed. You must address the points described in the following [1] lines before starting Elasticsearch

Esc wq保存并退出。

chown -R es:es ES根目录

随后启动或重启ES,注意防火墙要打开指定的端口。
期间可用ps aux命令查看ES是否跑得起来。

通过curl访问ES,可直接查看对应的ES配置情况。
curl IP:9200/_cluster/health
结果:
{
    "cluster_name": "zs_es_cluster",
    "status": "green",
    "timed_out": false,
    "number_of_nodes": 3,
    "number_of_data_nodes": 3,
    "active_primary_shards": 7,
    "active_shards": 14,
    "relocating_shards": 0,
    "initializing_shards": 0,
    "unassigned_shards": 0,
    "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": 100.0
}
1. cluster_name
含义:集群名称。
示例值:"zs_es_cluster"
用途:用于标识集群的名称,方便在管理和监控时识别。
2. status
含义:集群状态。
示例值:"green"
用途:指示集群的健康状态:
green:所有主分片和副本分片都正常。
yellow:所有主分片正常,但有副本分片未分配。
red:有主分片未分配。
3. timed_out
含义:查询是否超时。
示例值:false
用途:指示查询请求是否因超时而失败。
4. number_of_nodes
含义:集群中的节点总数。
示例值:3
用途:显示集群中的总节点数。
5. number_of_data_nodes
含义:集群中的数据节点总数。
示例值:3
用途:显示处理数据存储和搜索的节点数。
6. active_primary_shards
含义:活跃的主分片数量。
示例值:7
用途:显示当前活跃的主分片总数。
7. active_shards
含义:活跃的分片总数(包括主分片和副本分片)。
示例值:14
用途:显示集群中活跃的所有分片的总数。
8. relocating_shards
含义:正在迁移的分片数量。
示例值:0
用途:显示当前正在迁移的分片数。迁移通常发生在节点故障或集群扩展时。
9. initializing_shards
含义:正在初始化的分片数量。
示例值:0
用途:显示正在初始化的分片数。初始化分片通常是在刚刚创建索引时发生的。
10. unassigned_shards
含义:未分配的分片数量。
示例值:0
用途:显示未分配的分片数。这通常表示在集群启动或索引创建时需要分配的分片。
11. delayed_unassigned_shards
含义:延迟未分配的分片数量。
示例值:0
用途:显示因延迟而未分配的分片数量。
12. number_of_pending_tasks
含义:待处理任务的数量。
示例值:0
用途:显示当前待处理的集群管理任务数量,例如分片分配或设置更改。
13. number_of_in_flight_fetch
含义:当前进行中的获取请求数量。
示例值:0
用途:显示当前正在进行的搜索请求数量。
14. task_max_waiting_in_queue_millis
含义:任务在队列中等待的最大时间(毫秒)。
示例值:0
用途:显示任务在队列中等待的最长时间。值为 0 表示没有任务等待。
15. active_shards_percent_as_number
含义:活跃分片的百分比。
示例值:100.0
用途:显示当前活跃的分片占总分片数的百分比。值为 100.0 表示所有分片都在正常工作中。


或者使用如下方式查看
curl IP:9200/_cat/nodes?v
结果:
ip            heap.percent ram.percent cpu load_1m load_5m load_15m node.role   master name
192.168.0.184           30          94   0    0.16    0.11     0.22 cdfhilmrstw -      node_02
192.168.0.183           50          94   0    0.29    0.33     0.30 cdfhilmrstw *      node_01
192.168.0.185           63          93   0    0.79    7.42     5.21 cdfhilmrstw -      node_03

1. heap.percent
含义:JVM 堆内存的使用百分比。
用途:显示当前 JVM 堆内存的使用情况。高使用率可能表示需要增加内存或优化查询/索引操作。
2. ram.percent
含义:系统内存的使用百分比。
用途:显示节点系统内存的使用情况。用于监控内存压力,确保系统有足够的可用内存以避免性能问题。
3. cpu
含义:节点的 CPU 使用情况。
用途:显示节点的 CPU 使用情况。高 CPU 使用率可能表示节点在处理大量请求或需要优化配置。
4. load_1m
含义:过去 1 分钟的系统负载。
用途:显示系统的负载情况。负载值超过 CPU 核心数量可能表示系统负载较高,可能需要进一步调查。
5. load_5m
含义:过去 5 分钟的系统负载。
用途:显示系统的负载趋势。可以帮助识别长期的负载变化情况。
6. load_15m
含义:过去 15 分钟的系统负载。
用途:显示系统负载的长期趋势。可以用于分析系统负载的稳定性和变化趋势。
7. node.role
含义:节点角色。
用途:显示节点在集群中的角色,例如主节点(m)、数据节点(d)、协调节点(c)等。这帮助理解节点的功能和在集群中的作用。
8. master
含义:是否为主节点。
用途:显示节点是否是当前的主节点。主节点负责集群的管理和协调任务。
9. name
含义:节点名称。

  • 节点2、3配置基本同上,IP和节点名称需更改,并清空ES根目录/data,否则亲测节点无法发现,记得密码配置的要一致,客户端调用要输入用户名密码的,不一致会报错。

ES Head插件

原本是想通过Chrome加载该文件成为插件,但是报错,那就通过网页的形式使用。
cd 插件目录
npm i

然后手动打开插件目录下的index.html

节点角色(主节点、数据节点)

  • 官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-node.html
  • 极简概括节点:就是每个服务器上的ES实例,在集群环境下的称呼。
  • 极简概括节点角色:集群环境下每个ES实例的工作侧重点,是通过角色控制的。
  • 分类:master、data、data_content、data_hot、data_warm、data_cold、data_frozen、ingest
    、ml、remote_cluster_client、transform。这么多种类,目前能够用到的,就只有master、data节点。
  • 主节点:就是master节点,用于控制集群。
  • 主节点作用:
    • 集群管理:主节点负责集群状态的管理和维护,包括节点的加入和退出、索引的创建和删除等。
    • 元数据管理:主节点管理集群的元数据,包括索引和映射的信息。
    • 协调操作:主节点协调分片的分配和再分配,确保数据的平衡和容错性。
    • 处理集群状态更新:主节点负责更新集群状态,并将这些更新广播到所有数据节点。
若要把节点,配置为主节点,需要再elasticsearch.yml中配置
node.roles: [master]
  • 数据节点:具有多个数据角色之一的节点。数据节点保存数据并执行与数据相关的操作,如CRUD、搜索和聚合。具有泛型的节点data角色可以担任任何专门的数据节点角色。
node.roles: [master, data]

分片

  • 极简概括:是将索引拆分成多个小的独立部分的过程。
  • 类比MySQL:分表。
  • 解决问题:
    • 容量问题:几十亿的索引,单个节点装不下,就需要拆分。
    • 性能提升:将数据分布到多个分片上,多个节点可以并行处理查询请求,从而提高查询性能。
    • 副本备份:防止单点故障引发的数据丢失问题。
  • 适用场景:大数据下因存储问题(解决存储的问题),和高并发下因算力问题(解决性能的问题)。
  • 优点:如上。
  • 缺点:
    • 不可避免的增加运维成本。
    • 数据倾斜:因算法,或者数据本身的特点,让分片之间分布不均,从而造成负载不均衡。这种不均衡可能会影响整体性能和资源利用效率。
    • 主分片:拆分后的分片数据,并非主节点的分配数据。注意分片数量,创建索引时就已经确定,默认是1个,之后也无法更改。

副本(或叫副本分片)

  • 极简概括:分片的备份,分片的冗余。
  • 对比分片:不是一个东西,分片是将源数据拆分成小部分,副本分片的备份。
  • 分布模式:当有两台及以上数量的实例时,分片和对应的副本会放置在不同的服务器上,用来避免单节点故障引起的数据丢失。

节点扩容带来的问题

  • 为什么要扩容:因存储不足或者算力不足的情况下,想通过扩容节点来解决。
  • 问题:由于分片数量在创建索引时就已经确定(默认是1个,可手动更改),之后也无法更改。这会导致扩容会受节点数量牵制。
  • 解决:分片数量无法热增加,但是副本分片却可以热增加(增大索引的number_of_replicas参数)。因为副本即分片,所以ES访问分片或副本可以。将副本分布在更多的节点上,吞吐量,就上来了。
  • 换个说法:在增加节点的期间,增加副本数量,让更多的副本,均摊在更多的节点上,从而增加算力并减轻存储压力。
  • 注意:过多的副本,在ES写入数据时需要更长时间的同步,这会消耗一定的资源。

节点、分片、副本的计算、分布与演进

  • 背景:我把他拿出来讲,是因为容易混淆。创建索引时,若设置number_of_shards为3,number_of_replicas为1。
  • 则表示:
    • number_of_shards为3:表示这个索引设置3个分片。起个名:也就是分片1,分片2,分片3。
    • number_of_replicas为1:定义每个主分片有1个副本。3个分片,就会有3个副本,起个名:也就是副本1,副本2,副本3。
  • 当节点数量为1时,则表示:
    • 分片数量:3。
    • 副本数量:3。
    • 分片分布情况:分片1,分片2,分片3全部在这个单一节点上。
    • 副本分布情况:副本1,副本2,副本3全部在这个单一节点上。若节点挂掉,源数据和备份有丢失风险,因此存在单点故障。
    • 分布如图
|--------节点1--------|
| 分片1、分片2、分片3  |
| 副本1、副本2、副本3  |
|---------------------|
  • 演进,当节点数量为2时,则表示:
    • 分片数量:3。
    • 副本数量:3。
    • 分片分布情况:分片1,分片2,分片3可能全部在这个节点1上,因为这样变动动用资源较少。
    • 副本分布情况:副本1,副本2,副本3可能全部在这个节点2上,总之,分片和这个分片对应的副本,不能出现在同一个节点上,谨防单点故障。
    • 分布如图
只要节点数量>=2,就不能再同一节点上出现存储分片n,又存储副本n的情况。
|--------节点1--------|
| 分片1、分片2、分片3  |
|---------------------|

|--------节点2--------|
| 副本1、副本2、副本3  |
|---------------------|
  • 演进,当节点数量为3时,则表示:
    • 分片数量:3。
    • 副本数量:3。这个3,表示的3个分片各会有1个副本,则产生3份副本。
    • 分片分布情况:分片1和分片2可能在节点1上,分片3可能在节点3上。
    • 副本分布情况:副本1和副本3可能在节点2上,副本2可能在节点3上。
    • 分布如图:
只要节点数量>=2,就不能再同一节点上出现存储分片n,又存储副本n的情况。
|-----节点1----|
| 分片1、分片2  |
|--------------|

|-----节点2----|
| 副本1、副本3  |
|--------------|

|-----节点3----|
| 副本2、 分片3 |
|--------------|
  • 当节点数量大于6时:
    • 3个分片,那么加上3个分片对应的3份副本,一共就是6份数据,最多使用6个节点,所以节点不能超过6个,否则会产生多余的节点。
  • 演进:number_of_replicas为2,number_of_shards为3,且节点数量为3,则表示:
    • 分片数量:3。
    • 副本数量:6。
    • 分片分布情况:可能分片1,分片2在节点1上,分片3在节点3上。
    • 副本分布情况:可能副本3_1在节点1,副本1、副本2、副本3_1在节点2,副本1_1、副本2_1、分片3在节点3。
    • 分布如图
只要节点数量>=2,就不能再同一节点上出现存储分片n,又存储副本n的情况。
|----------节点1----------|
| 分片1、分片2、副本3     |
|------------------------|

|----------节点2----------|
| 副本1、副本2、副本3_1    |
|-------------------------|

|----------节点3----------|
| 副本1_1、副本2_1、分片3 |
|------------------------|
  • 节点数量增加后,还可以接着演进……。

路由

  • 极简概括:指的是如何将文档定位到具体的分片上的策略。
  • 作用:帮忙在读写时快速定位具体的分片。
  • 过程:文档的ID经过哈希计算,并通过固定的分片数量取模,根据得到的值决定用哪个分片。
  • 策略:默认是用轮询节点的方式进行路由。
  • 分类:
    • 内置路由:ES使用文档ID的哈希值取模分片数量来计算其存储的分片位置,并自动定位分片。
    • 自定义路由:用户提供一个routing参数,这个参数可以是任意的字符串值,ES将使用这个值j经过哈希后取模来进行路由计算。

集群内数据的读写流程

  • 写流程
    1. 客户端发送写请求:客户端向ES集群中的某个节点发送写请求,这个节点会作为本次请求的协调节点(Coordinating Node)。
    2. 路由到正确的分片:协调节点使用文档ID的哈希值来确定文档属于哪个分片,并通过集群状态中的内容路由表信息获知该分片的主分片位置。
    3. 主分片写入:协调节点将写请求转发到主分片所在的节点,由主分片执行实际的写操作。
    4. 主从复制:如果主分片写入成功,它会将请求并行转发到所有的副本分片(Replica Shard)所在的节点,等待副本分片写入成功。这是为了保证数据的冗余和一致性。
    5. 确认写入成功:一旦所有副本分片都成功写入了数据,主分片节点会向协调节点报告成功,随后协调节点向客户端返回写入成功的响应(有例外)。
  • 读流程
    1. 客户端发送读请求:客户端向ES集群中的某个节点发送读请求,这个节点同样会作为本次请求的协调节点。
    2. 确定数据和副本信息:协调节点使用文档ID的哈希值来确定文档属于哪个分片,并通过集群状态中的内容路由表信息获知该分片的副本信息。
    3. 转发请求到副本节点:协调节点可以将读请求转发到有副本分片的任意节点进行读取。在实际操作中,为了负载均衡,协调节点可能会采用轮询的方式将请求分发到不同的副本节点。
    4. 返回数据给客户端:处理读请求的节点将数据返回给协调节点,随后协调节点将数据返回给客户端。
  • 协调节点:负责处理集群内请求并将其分发到合适数据节点的节点。协调节点不直接存储数据或索引,而是负责处理请求的路由。

故障转移带来的影响

  • 补充:这里的故障转移,指的是某个节点挂掉后,对集群本身和调用端的影响。
  • 角色:若master挂掉,集群会从其他可用的节点中选出来一个作为master,若老master恢复,则不在是master角色。
  • 分片与副本分布:节点挂掉后,意味着节点数量发生了变化,就算再次启动,分片与副本分布可能会与原先的不一样。
  • 调用端:只要节点不全部挂掉,访问速度会变慢,但支持正常访问。

客户端调用集群的方案

composer require elasticsearch/elasticsearch

新建PHP文件,以下代码数据为公共部分。
include './vendor/autoload.php';
use Elastic\Elasticsearch\ClientBuilder;
//连接ES主节点
$client = ClientBuilder::create()->setHosts(['192.168.0.183:9200', '192.168.0.184:9200', '192.168.0.185:9200'])
->build();
//若es有密码,则需要添加一个setBasicAuthentication()方法,各节点密码须一致。
$client = ClientBuilder::create()->setHosts(['192.168.0.183:9200', '192.168.0.184:9200', '192.168.0.185:9200'])
->setBasicAuthentication('elastic', '123456')->build();

分片与副本设置指标

  • 容量考虑:控制每个分片占用的硬盘容量,不超过ES最大JVM的堆空间设置(一般设置不超过32G),如果索引的总容量在500G大小,那分片设置16个即可。
  • 节点考虑:避免让单个节点存储多个分片,一旦出现了故障(参考上文 “演进,当节点数量为3时”(不知道这句话在那里直接Ctrl F搜))仍旧有丢失数据的可能,一般的分片数量,不会超过节点数的3倍。
  • 公式:节点数 <= 主分片数 * (副本数 + 1)
  • 补充:由于ES偏向IO密集,而非计算密集型,所以硬件层面,使用固态硬盘和磁盘阵列(RAID0、10、5、6、50、60)用于提升性能。

分片增与查

  • 增:
返回bool
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_shards' => 3, //创建3个分片
            'number_of_replicas' => 1 //每个分片有1个副本
        ]
    ]
];

$response = $client->indices()->create($params);
dd($response->asBool());
  • 删:不支持的操作,可通过建立新的索引去实现。
  • 改:不支持的操作,可通过建立新的索引去实现。
  • 查:
返回array
$params = [
    'index' => 'shards_test',
    'format' => 'json'
];

$response = $client->cat()->shards($params);
dd($response->asArray());

array:6 [
  0 => array:9 [
    "index" => "shards_test"
    "shard" => "0"
    "prirep" => "r"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.185"
    "node" => "node_03"
  ]
  1 => array:9 [
    "index" => "shards_test"
    "shard" => "0"
    "prirep" => "p"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.183"
    "node" => "node_01"
  ]
  2 => array:9 [
    "index" => "shards_test"
    "shard" => "1"
    "prirep" => "p"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.185"
    "node" => "node_03"
  ]
  3 => array:9 [
    "index" => "shards_test"
    "shard" => "1"
    "prirep" => "r"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.184"
    "node" => "node_02"
  ]
  4 => array:9 [
    "index" => "shards_test"
    "shard" => "2"
    "prirep" => "p"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.184"
    "node" => "node_02"
  ]
  5 => array:9 [
    "index" => "shards_test"
    "shard" => "2"
    "prirep" => "r"
    "state" => "STARTED"
    "docs" => "0"
    "store" => "227b"
    "dataset" => "227b"
    "ip" => "192.168.0.183"
    "node" => "node_01"
  ]
]


index: 索引的名称。在这个例子中,索引名称是 shards_test。
shard: 分片的编号。"0"表示这是索引的第一个主分片。
prirep: 分片的类型。"r"表示这是一个副本分片(“r” 是“replica”的缩写)。主分片的标识是 "p"。
state: 分片的状态。"STARTED"表示该分片已成功启动并处于活动状态。
docs: 分片中的文档数量。"0"表示当前分片中没有文档。
store: 分片占用的存储空间大小。"227b"表示这个分片的大小为227字节。
dataset: 这个字段通常不在标准的 _cat/shardsAPI输出中,可能是某个自定义的监控系统中的字段。在这里它和 store 的值相同,即 227b。
ip: 托管该分片的节点的IP地址。在这个例子中是192.168.0.185。
node: 托管该分片的节点名称。在这个例子中是node_03。

副本增删改查

  • 增:
返回bool
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_shards' => 3, //创建3个分片
            'number_of_replicas' => 1 //每个分片有1个副本
        ]
    ]
];

$response = $client->indices()->create($params);
dd($response->asBool());
  • 删:
返回bool
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_replicas' => 0
        ]
    ]
];

$response = $client->indices()->putSettings($params);
dd($response->asBool());
  • 改:
$params = [
    'index' => 'shards_test',
    'body'  => [
        'settings' => [
            'number_of_replicas' => 2 //自定义数量
        ]
    ]
];

$response = $client->indices()->putSettings($params);
dd($response->asBool());
  • 查:
返回array
同节点查看操作
$params = [
    'index' => 'shards_test',
    'format' => 'json'
];

$response = $client->cat()->shards($params);
dd($response->asArray());

自定义路由相关增删改查

  • 不妨先创建一个索引及其映射与分片副本配置
$params = [
    'index' => 'route_test',
    'body'  => [
        'mappings' => [
            'properties' => [
                'test_field' => [
                    'type' => 'text',
                    'index' => true
                ]
            ]
        ],
        'settings' => [
            'number_of_shards' => 3,
            'number_of_replicas' => 1
        ]
    ]
];
$response = $client->indices()->create($params);
dd($response->asBool());
  • 增:不支持的操作。路由是个字符串,用于哈希计算分片的参数标识,自定义路由本身没有添加的意义,可参与创建数据。
返回bool
$params = [
    'index' => 'route_test',
    'id'    => '1',
    'body'  => [
        'test_field' => 'C语言是世界上最好的编程语言',
    ],
    'routing' => 'share_01' //自定义路由标识
];

$response = $client->index($params);
dd($response->asBool());
  • 删:不支持的操作。路由是个字符串,用于哈希计算分片的参数标识,自定义路由本身没有删除的意义,可参与删除数据。
$params = [
    'index' => 'route_test',
    'id'    => '1',
    'routing' => 'share_01'  //若使用其它的路由,则无法命中,导致删除出现异常报错
];


try {
    $response = $client->delete($params);
} catch (\Exception $exception) {
    //异常兜底操作
    dd($exception->getMessage());
}
dd($response->asBool());
  • 改:不支持的操作。路由是个字符串,用于哈希计算分片的参数标识,自定义路由本身没有更改的意义,可参与更新数据。
返回bool
$params = [
    'index' => 'route_test',
    'id'    => '1',
    'body'  => [
        'doc' => [
            'test_field' => 'C是世界上最好的编程语言'
        ]
    ],
    'routing' => 'share_01' //若使用其它的路由,则无法命中,导致更新出现异常报错
];

try {
    $response = $client->update($params);
} catch (\Exception $exception) {
    //异常兜底操作
    dd($exception->getMessage());
}
dd($response->asBool());
  • 查:不支持的操作。路由是个字符串,用于哈希计算分片的参数标识,自定义路由本身没有查询的意义,可参与查询数据。
返回数组
$params = [
    'index' => 'route_test',
    'body'  => [
        'query' => [
            'match' => [
                'test_field' => 'C语言是世界上最好的编程语言'
            ]
        ]
    ],
    'routing' => 'share_01' //若使用其它的路由,则无法命中,导致查询不出来数据。
];

$response = $client->search($params);
dd($response->asArray());
posted @ 2024-07-26 03:07  小松聊PHP进阶  阅读(11)  评论(0编辑  收藏  举报