Elasticsearch:路由 - routing

news2025/2/23 5:15:00

你是否考虑过 Elasticsearch 如何知道将文档存储在何处? 它如何知道在哪里寻找它们,以及是否检索、更新或删除它们? 这是一个令人兴奋的过程,一切都归结为路由的概念。

路由介绍

路由是确定文档属于哪个分片以便检索它或将其存储在它所属的位置的过程。 当 Elasticsearch 索引文档时,它会进行各种计算以确定将其放在哪个分片上。 这是通过使用以下公式完成的:

shard_num = hash(_routing) % num_primary_shards

默认情况下,“_routing” 等于文档的 ID。 这表明 Elasticsearch 查找文档的 ID 以确定它属于哪个分片。 当我们更新或删除文档时也是如此。

因此,当我们要求 Elasticsearch 通过其 ID 检索文档时,Elasticsearch 使用该 ID 来定位存储文档的分片。 如果文档存在,几乎可以肯定它在路由公式对应的分片上。

当我们更新或删除某些文档时也是如此。 但是,如果要根据 ID 以外的特征来查找文档,则情况会有所不同。 但我们最终会谈到这一点。

默认路由策略

路由的妙处在于它对 Elasticsearch 用户是完全不可见的。 Elasticsearch 通过提供默认路由策略让我们的生活变得更加轻松,这让我们不必自己处理所有这些路由问题。

你可能想知道是否可以更改默认路由策略。 答案是肯定的; 如果你愿意,你可以修改它。 然而,这是一个复杂的话题,我们稍后会讨论。

除了确保文档被分配到一个分片并且我们可以通过 ID 获取它们之外,默认路由策略还确保文档均匀分布在索引中的所有分片上。 这有助于确保没有一个分片比另一个分片拥有更多的文档。

如果我们决定修改文档的路由方式,我们必须要么确保它们仍然均匀分布,要么接受一个分片最终可能比另一个分片拥有更多的文档。

Elasticsearch 元字段和自定义路由

Elasticsearch 在其索引的文档中保留了一些附加信息。 除了我们提供的数据(比如我们用来添加文档的 JSON)之外,Elasticsearch 还包括像 _id 和 _source 这样的元字段。 _id 字段具有文档的唯一标识符,而 _source 字段包含用于为其编制索引的 JSON 负载。

还有一个名为 _routing 的元字段。 此选项用于为我们的文档自定义路由计划。

默认情况下,Elasticsearch 使用基于哈希的路由方法来确定文档应放置在哪些分片中。但是,如果我们在索引文档时提供自定义路由值,Elasticsearch 将使用该值来识别适当的分片编号。比如我们可以使用如下的方式来进行 routing:

PUT my_index/_doc/3?routing=1?refresh  (1)
{
  "text": "This is an answer",
  "my_join_field": {
    "name": "answer",   (2)
    "parent": "1"       (3)
  }
}
 
PUT my_index/_doc/4?routing=1?refresh
{
  "text": "This is another answer",
  "my_join_field": {
    "name": "answer",
    "parent": "1"
  }
}

如上所示,我们把 routing 设置为1,那么所有都含有同样的 routing 值的文档都会被写入到同一个分片里。这种情况在有些时候是必须的,比如针对 join 数据类型的文档。具体操作可以参阅文档 “Elasticsearch: Join 数据类型​​​​​​​”。

了解索引中的分片数量是固定的并且在创建索引后无法修改这一点至关重要。 这是因为 Elasticsearch 的路由公式依赖于索引中的分片数量。 具体来说,它用来确定分片数量的公式是 shard_num = hash(_routing) % num_primary_shards。

如果索引中的分片数量发生变化,路由公式将提供不同的结果。 对于新索引的文档来说这不是什么大不了的事情,但对于旧的文档来说却是这样。 假设我们有一个包含两个分片的索引,并且我们索引了一个文档。 根据路由公式,文档存储在第二个分片中。 但是,如果索引中的分片数量后来增加到四个,则需要将文档转移到单独的分片中。 这可能需要一些时间,我的朋友。 所以,在 Elasticsearch 中创建索引时,我们必须仔细考虑我们想要的分片数量。

管理 Elasticsearch 分片:注意事项和最佳实践

好的,让我们假装我们向索引添加了更多分片,比如大约 5 个。 这样,我们可以添加更多文档而不会引起任何明显的问题。 但是,当我们尝试通过 ID 查找某些文档时,Elasticsearch 有时会找不到它们。 基本上,ID 会再次通过路由算法运行,并且由于其中一个因素发生了变化,结果可能会有所不同。

这意味着 Elasticsearch 在错误的分片中查找文档并且不返回任何内容,尽管该文档在索引中。 众所周知,此问题会产生重大问题,尤其是在处理时间敏感的信息时。 一种解决方案是开发一种更好的路由机制,可以更有效地处理分片数量的变化。

还值得注意的是,其他因素(例如文档如何分布在不同的分片中)也会在这个问题中发挥作用。 因此,仔细评估索引策略并确保其针对最大效率和准确性进行优化至关重要。

在考虑向索引添加更多分片时,请牢记这一非常重要的原则。 你必须确保索引中的文档分布不均匀,否则你可能会遇到性能问题。 因此,如果你可以平衡所有分片,那么搜索时间和其他方面会好得多。

但是,如果要更改分片数,则必须创建新索引并重新索引所有文档。你可以使用 reindex 来进行重新索引文档。我们可以参考文章 “Elasticsearch: Reindex 接口”。

这听起来很糟糕,但有些 API 可以提供帮助。 如果你有兴趣,请查看 shrink 和 split 功能来进行缩小或扩大分片数。 使用这些可以帮助你创建具有不同数量分片的新索引并重新索引所有文档而不会遇到严重麻烦。

总的来说,你在建立索引时应该谨慎行事,并考虑所需的分片数量以及任何潜在的未来修订。 然而,通过适当的准备和正确的工具,管理分片会变得轻而易举,并显着提高你的搜索速度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/619507.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新手配learnsite

把下载好的learnsite放在C盘根目录下 改个名 开始,Microsoft SQL Server Tools 19,SQL Server Management studio 19 这里我其实是没看懂,但是我觉得是选个服务器。 点开数据库引擎这里试一下 因为我来回装好几次sql,这里只有ls2有印象好像是…

git statsh、git submodule

文章目录 git stash解决git pull和本地文件的冲突1、先将本地修改存储起来2、pull内容3、还原暂存的内容4、解决文件中冲突的的部分5、删除stash。6 、git stash pop 与 git stash apply <stash{id}> 的区别。 回退后的版本是不追踪的git 还原修改git submodule git stas…

SpringBoot整合达梦数据库的教程(详解)

一、官网下载试用版本 http://www.dameng.com/down.aspx 我是win 11系统下载如下&#xff1a; 二、安装 解压后 双击打开iso文件 然后点击安装 选择创建实例&#xff08;注意记住账号/密码 端口号 默认的是 SYSDBA/SYSDBA 5236&#xff09; 然后一直下一步 到完成&#xff…

Win11下查看快捷键占用情况

Win11下查看快捷键占用情况 使用 OpenArk&#xff0c;根据文档描述&#xff0c;它可以查看许多 Windows 系统信息&#xff0c;包括快捷键&#xff0c;支持 Win10。 操作步骤&#xff1a; 1.下载 OpenArk Github&#xff1a;https://github.com/BlackINT3/OpenArk 单文件下载&…

计算机毕业论文内容参考|基于c语言的新一代预约挂号系统的设计与实现

文章目录 导文文章重点前言系统架构相关技术与方法介绍网络通信技术数据库管理技术算法模型选择技术分析技术设计:技术实现:总结与展望:本文总结:后续工作展望:导文 计算机毕业论文内容参考|基于c语言的新一代预约挂号系统的设计与实现 文章重点 前言 随着科技的不断发展…

linuxOPS基础_linux软件包安装

软件包概述 上图是windows下的软件包 Linux下也有很多可以安装的软件&#xff0c;而这些软件的安装包可细分为两种&#xff0c;分别是源码包和二进制包。 Linux下软件的安装方式 ① RPM软件包安装 > 软件名称.rpm ② YUM包管理工具 > yum install 软件名称 -y ③ 源码…

红外-星光-黑光-全彩夜视摄像头选型

星光”、“黑光”、“AI超微光”、“极光”&#xff0c;在安防行业这些概念似乎比“低照度摄像机”本身要火的多。 无论营销名称是什么&#xff0c;归根到底&#xff0c;它们都是用不同的方法使摄像机能在夜间拍摄到更像白昼一般的 高清夜视摄像头除了以前我们在项目上经常使…

腾讯云服务器怎么使用?新手入门教程

腾讯云服务器入门教程包括云服务器CPU内存带宽配置选择&#xff0c;选择云服务器CVM或轻量应用服务器&#xff0c;云服务器创建后重置密码、远程连接、搭建程序环境等&#xff0c;腾讯云服务器网分享从0到1腾讯云服务器入门教程&#xff1a; 腾讯云服务器入门教程目录&#xf…

进程信号

目录 信号的产生方式 程序的崩溃 通过键盘产生 进程异常产生 系统调用产生 软件条件产生 信号产生中 函数介绍 sigset_t&#xff08;信号集&#xff09; sigprocmask函数 sigpending函数 信号处理 用户态和内核态的理解 处理信号的过程 信号捕捉 sigaction函数…

安全测试13款免费的测试工具!

目录 前言&#xff1a; 1. Excercise in a Box 2. Needle 3. DevSlop 4. 移动安全框架(Mobile Security Framework) 5. Frida 6. Nishang 7. Tamper 8. InSpec 9. Faraday 10. Pocsuite 11. Taipan 12. Pacu 13. Secure Guild 前言&#xff1a; 首先&#xff0c;我想强调一…

策略模式——实践:在业务逻辑中理解设计模式

一般定义 策略模式(Strategy Pattern)&#xff1a;定义一系列算法&#xff0c;将每一个算法封装起来&#xff0c;并让它们可以相互替换。策略模式让算法独立于使用它的客户而变化&#xff0c;也称为政策模式(Policy)。 主要角色 Context: 环境类 Strategy: 抽象策略类 Concr…

CnOpenData电商平台交易数据数据

一、数据简介 电子商务是网络化的新型经济活动&#xff0c;是推动“互联网&#xff0b;”发展的重要力量&#xff0c;是新经济的主要组成部分。通过电商平台获取的电商交易平台数据可以及时统计、监测数据&#xff0c;全方位跟踪分析电子商务市场的发展情况和发展环境&#xff…

mysql中的group by 和 having使用

mysql中的group by 和 having 使用 理论 –sql中的group by 用法解析&#xff1a; – Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。 –它的作用是通过一定的规则将一个数据集划分成若干个小的区域&#xff0c;然后针对若干个小区域进行数…

【Nginx+Tomcat的7层代理和四层代理】

目录 一、NginxTomcat负载均衡、动静分离1、正向代理2、反向代理3、Nginx动静分离实现原理Nginx静态处理优势 二、实战1.部署Nginx 负载均衡器2.部署2台Tomcat 应用服务器3.动静分离配置&#xff08;1&#xff09;Tomcat1 server 配置&#xff08;2&#xff09;Tomcat2 server …

【华为OD机试真题2023B卷 JAVAJS】评论转换输出

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 评论转换输出 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 在一个博客网站上,每篇博客都有评论。每一条评论都是一个非空英文字母字符串。 评论具有树状结构,除了根评论外,每个评论都有一个父评论。 当评论保…

ciso模拟器配置RIP2

本文为ciso模拟器配置RIP2 操作笔记 (供新手参考&#xff09; 思科路由器设置ip地址怎么设置(思科模拟器中怎样给路由器配置ip地址) 方法一&#xff1a; 物理配置 https://www.luyouqi.com/shezhi/39347.html 方法二&#xff1a; 路由 CLI 配置 https://blog.csdn.net/qq_6…

Tomcat ServletConfig和ServletContext接口概述

ServletConfig是一个接口&#xff0c;是Servlet规范中的一员 WEB服务器实现了ServletConfig接口&#xff0c;这里指的是Tomcat服务器 一个Servlet对象中有一个ServletConfig对象&#xff0c;Servlet和ServletConfig对象是一对一 ServletConfig对象是Tomcat服务器创建的&#xf…

你用过的低代码都装备了这四大引擎吗?

低代码开发是一种通过图形化界面和少量编码来快速构建应用程序的方法。尽管增删改查是低代码开发中常见的基本功能&#xff0c;但仅仅通过这些功能的配置&#xff0c;往往只能实现数据的输入和输出&#xff0c;无法满足实际的业务需求。 增删改查功能主要用于对数据进行操作&a…

第11章:SpringMVC注解配置

一、注解配置SpringMVC 目的是&#xff1a;使用配置类和注解代替web.xml和Spring.MVC配置文件的功能 1.创建初始化类&#xff0c;代替web.xml 在Servlet3.0环境中&#xff0c;容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类&#xff0c;如果找…

c++的概述(二)

新增bool类型 bool的变量只能赋值为true (非0) 或false (0) #include <iostream>using namespace std;int main(int argc, char const *argv[]) {bool num;num true;cout<<"true "<<true<<endl;cout<<"false "<<…