Elasticsearch:路由 - routing_elasticsearch路由机制-程序员宅基地

技术标签: spring boot  Elastic  Elasticsearch  elasticsearch  全文检索  搜索引擎  大数据  

你是否考虑过 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 可以提供帮助。 如果你有兴趣,请查看 shrinksplit 功能来进行缩小或扩大分片数。 使用这些可以帮助你创建具有不同数量分片的新索引并重新索引所有文档而不会遇到严重麻烦。

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/UbuntuTouch/article/details/131031191

智能推荐

JavaScript中的(内置)方式来检查字符串是否为有效数字_js 判断是的有效数字-程序员宅基地

文章浏览阅读1.2k次。我希望在与旧的VB6 IsNumeric()函数相同的概念空间中有东西吗? _js 判断是的有效数字

PHP5.4NTS MYSQL_windows安装Apache2.4.3(mod_fcgi)+PHP5.4.10+Mysql5.5.29-程序员宅基地

文章浏览阅读129次。最近有朋友问我,根据我的以前的一个教程,用php5apache2_4.dll来运行php的http://www.myxzy.com/post-333.html,但是现在apachelounge官网没有php5apache2_4.dll文件下载了,只有一个mod_fcgid了,php的包里面也没有php5apache2_4.dll这个文件。所以就写了这个教程。这个教程是在windows下用Apach..._windows 安装apahce2.4安装mod_fcgid.so

三分钟教你如何用Github找开源项目--值得一看!_github 网站 下载课题相关的开源代码程序。-程序员宅基地

文章浏览阅读10w+次。Git(读音为/gɪt/)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。# 按照项目名/仓库名搜索(大小写不敏感)in:name xxx # 按照README搜索(大小写不敏感)in:readme xxx# 按照description..._github 网站 下载课题相关的开源代码程序。

MAC地址表、端口安全、MAC地址偏移-程序员宅基地

文章浏览阅读1.4k次,点赞7次,收藏6次。文章目录MAC地址1.组成2.分类3.常见MAC地址4.MAC地址表MAC地址表分类2.端口安全安全MAC地址分类端口安全保护动作配置端口安全经常使用的场景MAC地址偏移出现场景如何避免MAC地址漂移检测MAC地址MAC(Media Access Control Address)地址:网络中每台设备都有一个唯一的网络标识。1.组成MAC地址为48位(6字节)前24bit是通过向IETF等机构申请用来表示厂商的代码,后24bit是厂商分配给产品的唯一数值。2.分类物理MAC地址:MAC地址的_mac地址偏移

KEIL调试正在运行的程序_keil attach-程序员宅基地

文章浏览阅读2k次。有时程序跑着跑着就飞了,但此时却没有接仿真器,不能停下来看运行状态。如果重新启动调试,会破坏现场。有没有办法attach到应用程序上调试呢?答案是肯定的。_keil attach

【JavaScript】JS执行机制--同步与异步_js 同步和异步的展示-程序员宅基地

文章浏览阅读5.6k次,点赞41次,收藏30次。## 单线程`JavaScript`语言具有单线程的特点,同一个时间只能做一件事情。这是因为`JavaScript`脚本语言是为了处理页面中用户的交互,以及操作`DOM`而诞生的。如果对某个`DOM`元素进行添加和删除,不同同时进行。应该是先添加,再删除,事件有序。单线程的特点是所有任务都需要排队进行,前一个任务结束,才会执行后一个任务。这样会导致问题:如果JS执行时间过长,这样会导致页面渲染不连贯,导致页面渲染加载阻塞。_js 同步和异步的展示

随便推点

JS之前台参数提交到后台,双引号转义为"解决办法-程序员宅基地

文章浏览阅读1.5k次。问题描述var param = $("#searchForm").serializeJson();前台封装好了键值对形式的字符串,使用了EasyUI的treeGrid控件,传到后台后,双引号转义为"解决办法apache工具包common-lang中有一个很有用的处理字符串的工具类,其中之一就是StringEscapeUtils,利用此工具类进行解决问题...

vscode代码片段置顶_vscode置顶代码-程序员宅基地

文章浏览阅读1.9k次。默认情况下,我们自定义的代码片段在 VSCode 的智能提示中优先级是比较低的,这往往并不符合我们的预期。那么,我们该如何提升自定义代码片段的优先级呢?首先,打开用户设置。然后,搜索 snippet。最后,将 editor.snippetSuggestions 设为 top 即可。..._vscode置顶代码

百万级PHP网站架构工具箱,高并发架构方案_1000并发 架构php-程序员宅基地

文章浏览阅读7.2k次。在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de。Poppen.de是德国的一个社交网站,相对Facebook、Flickr来说是一个很小的网站,但它有一个很好的架构,融合了很多技术,如 Nigix、MySql、CouchDB、Erlang、Memcached、RabbitMQ、PHP、Graphite、Red5以及Tsu_1000并发 架构php

数据结构中的C语言编程基础_编写数据结构的格式c语言-程序员宅基地

文章浏览阅读3.2k次,点赞28次,收藏123次。C语言进行编程时一脸懵?对于数据结构中的数据类型不会定义?基本的算法不会写、记不住?来看一看这篇文章,提前根据考研的要求进行算法的编写,帮助你在考研时轻松拿分!_编写数据结构的格式c语言

GBDT和随机森林-附原版动画PPT(技术分享也可以文艺范?)_随机森林讲解ppt下载-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏14次。版权声明:本文为博主原创文章,未经博主允许不得转载。本周在公司给校招生做了次 GBDT和随机森林 分享,把PPT分享出来。原版动画PPT下载链接:《GBDT和随机森林- CSDN博主dkjkls》参考资料:学习笔记【机器学习重点与实战】——4 集成学习-Bagging学习笔记【机器学习重点与实战】——5 集成学习-Boosting《机器学习 - 周志华》第8章 集成学习 《机器..._随机森林讲解ppt下载

pip3升级报错:PermissionError: [Errno 13] Permission denied: '/usr/bin/pip' -> '/tmp/pip-yndfk0h8-uninsta_oserror: [errno 13] permission denied: '/usr/bin/p-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏3次。pip3 install pip --upgrade报错PermissionError: [Errno 13] Permission denied:来说一下关于pip3升级报错,下面是错误提示:Exception:Traceback (most recent call last):File “/usr/lib/python3.6/shutil.py”, line 550, in move..._oserror: [errno 13] permission denied: '/usr/bin/pip

推荐文章

热门文章

相关标签