Elasticsearch 中有四种基本的数据操作。 每个操作都有自己的资源需求。每个用例都使用这些操作,但它们会优先于某些操作。
在今天的文章中,我将详述上面的几个基本操作。
如果你对 Elasticsearch 还不是很熟悉的话,我建议你可以先去读一下我之前的文章:
简单地说,一个 Elasticsearch 的集群由如下的部分组成:

如上所示,Elastic Stack 由 Elasticsearch,Kibana,Beats 及 Logstash 来组成。用一句话来描述,Kibana 是用来可视化及搜索 Elasticsearch 的数据,管理及监控 Elasticsearch 集群,发送通知等。它是 Elastic Stack 的窗口。你可以进一步阅读文章 “Kibana:如何开始使用 Kibana” 以了解更多。 Elasticsearch 是一个大数据的搜索及分析引擎。Beats 及 Logstash 是被用来把数据写入到 Elasticsearch 中的工具。最新的 Elastic Stack 建议使用 Elastic Agent 来作为数据摄入的方式:

有关上面的节点的描述:
有关这些节点的具体描述,请参阅我之前的文章 “ Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica”

上图显示了文档被索引到 Elasticsearch 集群时的数据流。 它包括以下基本步骤:
1)步骤1:客户端发出将文档放入集群的请求,集群中的协调器节点接受请求进行处理。
2)第 2 步:协调器节点使用索引请求中的管道(pipeline)参数来检查文档是否需要在路由到数据节点进行进一步处理之前进行丰富或转换。
如果答案为否,文档将被路由到集群中的数据节点。 如果答案为是,文档将被路由到集群中的摄取节点(ingest node)以丰富文档。 丰富过程完成后,摄取节点继续将丰富的文档路由到数据节点。
集群中哪个数据节点将进一步处理文档的决定是基于索引的分片信息和哈希模公式:
shard = hash(routing) % number_of_shards
从上面的公式中可以看出来,如果 number_of_shards 改变了,那么得出来的 shard 值也会改变。这也是为啥我们在创建一个索引之后,不能修改 number_of_shards 这个参数。一旦 number_of_shards 被修改了之后,我们必须通过 reindex 的方式写入另外一个索引来进行搜索和查询。
3)第三步:数据节点将文档解析为 JSON 对象,然后检查对象中是否有任何文本值。 如果找到文本值,就会涉及文本分析过程。 它分析文本并将其分解为更有用的结构组件。 它还应用一些处理来使文档与全文搜索更相关。 最后,文档被添加到内存缓冲区并附加到事务日志(translog)。
当缓冲区填满时,文档被写入一个段,然后缓冲区被清除。 同时,事务日志仍然保留文档,直到它变得足够大,执行完整提交。 文档永久刷新到磁盘,旧的事务日志被删除并创建新的。关于这个部分的描述,你可以阅读我之前的文章 “Elasticsearch:Elasticsearch 中的 refresh 和 flush 操作指南”。
如果启用复制,则触发复制数据过程。 该数据节点向包含索引副本分片的数据节点发送复制请求。 此处的整个索引过程将在该节点上完成以创建这些文档的副本。
更为详细的描述,请参阅我的另外一篇文章 “Elasticsearch:索引数据是如何完成的”。
搜索是信息检索的通用术语。 Elasticsearch 提供各种检索功能,包括全文搜索、地理搜索、范围搜索、脚本搜索和聚合。你可以阅读文章 “开始使用 Elasticsearch (2)”。
Elasticsearch 如何在幕后执行搜索查询? 下图显示了搜索操作的数据流。

Elasticsearch 在非正式称为 scatter、search、gather 和 merge 的阶段执行搜索。
1)第一阶段:scatter
客户端向集群发出搜索请求,集群中的协调器节点接受请求进行处理。 基于索引的信息,协调器节点将搜索请求路由到包含索引数据的所有数据节点。
2)第 2 阶段:search
在第一阶段接收到搜索请求的每个数据节点解析请求以检查搜索查询中的任何查询子句是否需要应用文本分析过程。 如果是,文本分析处理开始。 最后,数据节点在索引分片的每个段上执行搜索请求。有关文本分析,请详细阅读我的另外一篇文章 “Elasticsearch: analyzer”。
3)第 3 阶段:gather 和 merge
第一阶段 中的协调器节点从将搜索请求路由到的所有数据节点收集搜索结果。 收集处理完成后,合并处理开始。 它对搜索结果进行合并、排名和排序,然后将它们返回给客户端。
当用户针对 Elasticsearch 调用搜索查询时,会发生很多事情。 尽管我们之前谈到了机制,下图显示了引擎如何在后台执行搜索的机制。
特别指明:在上面,我们表明 Node A 是一个数据节点,但是针对大型的 Elasticsearch 集群来说,我们更希望有单独的不含有任何角色的节点来担当这些 coordinator 节点。
当从用户或客户端接收到搜索请求时,引擎将该请求转发到集群中的一个可用节点。 默认情况下,集群中的每个节点都分配有协调器(coordinator)角色; 因此,使每个节点都有资格在循环的(round-robin)基础上接收客户端请求。 一旦请求到达协调器(cooridnator)节点,它就会确定相关文档的分片所在的节点。
在上图中,节点A是协调节点,它接收来自客户端的请求。 它被选为协调器节点,除了演示目的外没有任何特定原因。 一旦它被选为(协调者)活动角色,它就会在由数据组成的集群中的各个节点上创建一个复制组,其中包含一组分片和副本。 请记住,索引由分片组成,每个分片都可以独立存在于其他节点上。 在我们的示例中,索引由四个分片组成:分片 1 到 4 分别存在于节点 A 到 D 上。
然后节点 A 制定查询请求发送给其他节点,请求它们执行搜索。 收到请求后,相应节点会在其分片上执行搜索请求。 然后它提取最上面的一组结果并用结果响应活动的协调器。 然后活动协调器(coordinator)合并数据并对其进行排序,然后将其作为最终结果发送给客户端。
如果协调器具有数据节点(data node)的角色,它也会挖掘自己的存储来获取结果。 并非每个接收到请求的节点都一定是数据节点(事实上,针对大的集群,它会有专有的不含任何角色的 coordinator 节点来接受请求)。 同样,并非每个节点都应成为此搜索查询的复制组的一部分。
如何从 Elasticsearch 中删除文档? 下图显示了删除单个文档的幕后数据流。

1)步骤1:客户端发出从集群中删除文档的请求,集群中的协调节点接受请求进行处理。
2)第 2 步:基于分片信息和文档 ID,协调节点将删除请求路由到包含存储文档的主分片的数据节点。
3)第 3 步:数据节点不会立即删除文档,它会将文档标记为已删除,然后将其添加到内存缓冲区并将其追加到事务日志(translog)中。 此时,文档是不可搜索的。
当缓冲区填满时,changes 将写入段并且缓冲区被清除。 同时,事务日志仍然保留已删除的文档,直到它变得太大,执行完整提交。 更改被刷新到磁盘,文档被永久删除。
如果为索引启用了复制,则复制数据进程开始。 该数据节点将删除请求发送到包含索引副本分片的数据节点。 此处的整个删除过程将在该节点上完成,以将文档从副本分片中完全删除。
Elasticsearch 中的文档是不可变的。 当 Elasticsearch 更新文档时,它会删除原始文档并为新的、更新的文档编制索引。 这两个操作在每个 Lucene 分片中以原子方式执行。这会产生 delete 和 index 操作的成本,但它不会调用任何摄取管道。
我们可以描述 update 数据流为如下的操作:
Update = Delete + (Index - Ingest Pipeline)
好了,今天的文章就写到这里。希望你对 Elasticsearch 的数据操作有一个基本的了解。 这对以后如何提高索引速度,提高搜索速度提供一个良好的理解基础。更多关于如何优化这方面的文章,请详细阅读文章
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
文章目录1.开发板选择*用到的资源2.串口通信(个人理解)3.代码分析(注释比较详细)1.主函数2.串口1配置3.串口2配置以及中断函数4.注意问题5.源码链接1.开发板选择我用的是STM32F103RCT6的板子,不过代码大概在F103系列的板子上都可以运行,我试过在野火103的霸道板上也可以,主要看一下串口对应的引脚一不一样就行了,不一样的就更改一下。*用到的资源keil5软件这里用到了两个串口资源,采集数据一个,串口通信一个,板子对应引脚如下:串口1,TX:PA9,RX:PA10串口2,TX:PA2,RX:PA32.串口通信(个人理解)我就从串口采集传感器数据这个过程说一下我自己的理解,
SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总