搜索引擎索引之如何更新索引

深耕ElasticSearch - 动态更新索引 ##1.建立索引原理 给定一个文档集合(这个集合中的文档是不变的),索引是如何建立起来的呢? 首先在内存里维护一个倒排索引,当内存占满后,将内存数据写入磁盘临时文件,第二阶段对临时文件进行合并形成最终索引。 ① 从磁盘读取文档,对文档内容进行解析,并在内存中建立一个倒排索引,相当于对目前处理的文档子集单独在内存中建立起了一整套倒排索引,和最终索引相比,其结构和形式是相同的,区别只是这个索引只是部分文档的索引而非全部文档的索引。 ② 当内存占满后,为了腾出内存空间,将整个内存中建立的倒排索引写入磁盘临时文 阅读详情

                                         本文节选自《这就是搜索引擎:核心技术详解》第三章

     动态索引通过在内存中维护临时索引,可以实现对动态文档和实时搜索的支持。但是服务器内存总是有限的,随着新加入系统的文档越来越多,临时索引消耗的内存也会随之增加。当最初分配的内存将被使用完时,要考虑将临时索引的内容更新到磁盘索引中,以释放内存空间来容纳后续的新进文档,此时要考虑合理有效的索引更新策略。

常用的索引更新策略有四种:完全重建策略,再合并策略,就地更新策略以及混合策略。

3.6.1完全重建策略(CompleteRe-Build)

    完全重建策略是一个相当直观的方法,当新增文档达到一定数量,将新增文档和原先的老文档进行合并,然后利用前述章节提到的建立索引的方式,对所有文档重新建立索引。新索引建立完成后,老的索引被遗弃释放,之后对用户查询的响应完全由新的索引负责。图3-16是这种策略的说明示意图。

                    


                            图3-16完全重建策略

      因为重建索引需要较长时间,在进行索引重建的过程中,内存中仍然需要维护老的索引,来对用户的查询做出响应,只有当新索引完全建立完成后,才能释放旧的索引,将用户查询响应切换到新索引上。

这种重建策略比较适合小文档集合,因为完全重建索引的代价较高,但是目前主流商业搜索引擎一般是采用此种方式来维护索引的更新,这与互联网本身的特性有关。


3.6.2再合并策略(Re-Merge)

  

    有新增文档进入搜索系统时,搜索系统在内存维护临时倒排索引来记录其信息,当新增文档达到一定数量,或者指定大小的内存被消耗完,则把临时索引和老文档的倒排索引进行合并,以生成新的索引。图3-17是这种策略的一种图示。

                      

  

                              图3-17 再合并策略

     在实际的搜索系统中,“再合并策略”按照以下步骤进行索引内容的更新:

    当新文档进入系统,解析文档,之后更新内存中维护的临时索引,文档中出现的每个单词,在其倒排列表末尾追加倒排列表项,这个临时索引可称之为“增量索引”;

    一旦“增量索引”将指定的内存消耗光,此时需要进行一次索引合并,即将“增量索引”和老的倒排索引内容进行合并。图3-18是合并过程示意图,这里需要注意的是:倒排文件里的倒排列表存放顺序,已经按照索引单词字典顺序由低到高进行了排序,增量索引在遍历词典的时候也按照字典序由低到高排列,这样对老的倒排文件只需进行一遍扫描,并可顺序读取,减少了文件操作中比较耗时的磁盘寻道时间,可以有效地增加合并效率。

 

 

 

                         图3-18 合并增量索引与倒排索引

 

      在合并过程中,需要依次遍历“增量索引”和老索引单词词典中包含的单词及其对应的倒排列表,可以用两个指针分别指向两套索引中目前需要合并的单词(参考图3-18中箭头所指),按照如下方式进行倒排列表的合并:

      考虑“增量索引”的单词指针指向的单词,如果这个单词在词典序中小于老索引的单词指针指向的单词,说明这个单词在老索引中没有出现过,则直接将这个单词对应的倒排列表写入新索引的倒排文件中,同时“增量索引”单词指针后移指向下一个单词。

     如果两个“单词指针”指向的单词相同,说明这个单词在“增量索引”和老索引中同时出现,则将老索引中这个单词对应的倒排列表写入新索引的倒排列表,然后把“增量索引”中这个单词对应的倒排列表追加到其后,这样就完成了这个单词所有倒排列表的合并。图3-18中箭头所指单词是“搜索”,说明此时合并到了该单词,因为在老的索引系统和增量索引中都包含这个单词,所以首先将老索引对应的倒排列表追加到新索引倒排文件末尾,之后将增量索引中“搜索”这个单词对应的倒排列表追加在其后,这样就完成了这个单词索引项的合并。两个索引的单词指针都移动到下一个单词继续进行合并。

     如果某个单词只在老索引中出现过,即发现老索引的“单词指针”指向的单词,其词典序小于“增量索引”单词指针指向的单词,则直接将老索引中对应的倒排列表写入新索引倒排文件中。老索引的单词指针后移指向下一个单词,继续进行合并。

      当两个索引的所有单词都遍历完成后,新索引建成,此时可以遗弃释放老索引,使用新索引来响应用户查询请求。

      同样的,在按照这个策略进行索引合并的过程中,为了能够响应用户查询,在合并索引期间,需要使用老索引响应用户查询请求。

       “再合并策略”是效率非常高的一种索引更新策略,主要原因在于:在对老的倒排索引进行遍历时,因为已经按照索引单词的词典序由低到高排好顺序,所以可以顺序读取文件内容,减少了磁盘寻道时间,这是其高效的根本原因。但是这种方法也有其缺点,因为要生成新的倒排索引文件,所以对于老索引中的很多单词来说,尽管其倒排列表并未发生任何变化,但是也需要将其从老索引中读取出来并写入新索引中,这种对磁盘输入输出的消耗是没有太大必要且非常耗时的。


3.6.3原地更新策略(In-Place)

      原地更新策略的基本出发点,可以认为是试图改进“再合并策略”的缺点。就是说,在索引更新过程中,如果老索引的倒排列表没有变化,可以不需要读取这些信息,而只对那些倒排列表变化的单词进行处理。甚至希望能更进一步:即使老索引的倒排列表发生变化,是否可以只在其末尾进行追加操作,而不需要读取原先的倒排列表并重写到磁盘另外一个位置? 如果能够达到这个目标,明显可以大量减少磁盘读写操作,提升系统执行效率。

     为了达到上述目标,原地更新策略在索引合并时,并不生成新的索引文件,而是直接在原先老的索引文件里进行追加操作(参考图3-19),将增量索引里单词的倒排列表项追加到老索引相应位置的末尾,这样就可达到上述目标,即只更新增量索引里出现的单词相关信息,其它单词相关信息不做变动。


                            图3-19 原地更新策略

 

     但是这里存在一个问题:对于倒排文件中的两个相邻单词,为了在查询时加快读取速度,其倒排列表一般是顺序序列存储的,这导致没有空余位置用来追加新信息。为了能够支持追加操作,“原地更新策略”在初始建立的索引中,会在每个单词的倒排列表末尾预留出一定的磁盘空间,这样,在进行索引合并时,可以将增量索引追加到预留空间中。

    图3-20是这种合并策略的一个说明。在图中,老索引中每个单词的倒排列表末尾都预留出空余磁盘空间,以作为信息追加时的存储区域。在对“新增索引”进行合并时,按照词典序,依次遍历“新增索引”中包含的单词,并对新增倒排列表的大小和老索引中相应预留空间大小进行比较,如果预留空间足够大,则将新增列表追加到老索引即可,如果预留空间不足以容纳新增倒排列表,那么此时需要在磁盘中找到一块完整的连续存储区,这个存储区足以容纳这个单词的倒排列表,之后将老索引中的倒排列表读出并写入新的磁盘位置,并将“增量索引”对应的倒排列表追加到其之后,这样就完成了一次倒排列表的“迁移”工作。

      

      

                            图3-20原地更新策略索引合并

     在图3-20所示的例子中,可以看出,单词“技术”和“引擎”在老索引中的预留空间足够大,所以对“增量索引”只需做追加写入即可,但是对于单词“搜索”来说,其预留空间不足以容纳新增倒排列表,所以这个单词的倒排列表需要迁移到磁盘另外一个连续存储区中。

“原地更新策略”的出发点很好,但是实验数据证明其索引更新效率比“再合并策略”要低,主要是出于以下两个原因:

       在这种方法中,对倒排列表进行“迁移”是比较常见的操作,为了能够进行快速迁移,需要找到足够大的磁盘连续存储区,所以这个策略需要对磁盘可用空间进行维护和管理,而这种维护和查找成本非常高,这成为该方法效率的一个瓶颈。

     对于倒排文件中的相邻索引单词,其倒排列表顺序一般是按照相邻单词的词典序存储的,但是由于“原地更新策略”对单词的倒排列表做数据迁移,某些单词及其对应倒排列表会从老索引中移出,这样就破坏了这种单词连续性,导致在进行索引合并时不能顺序进行读取,必须维护一个单词到其倒排文件相应位置的映射表,而这样做,一方面降低了磁盘读取速度,另外一方面需要大量的内存来存储这种映射信息。

 

3.6.4混合策略(Hybrid)

     混合策略的出发点是能够结合不同索引更新策略的长处,将不同的索引更新策略混合,以形成更高效的方法。

混合策略一般会将单词根据其不同性质进行分类,不同类别的单词,对其索引采取不同的索引更新策略。常见的做法是根据单词的倒排列表长度进行区分,因为有些单词经常在不同文档中出现,所以其对应的倒排列表较长,而有些单词很少见,则其倒排列表就较短。根据这一性质将单词划分为“长倒排列表单词”和“短倒排列表单词”。“长倒排列表单词”采取“原地更新策略”,而“短倒排列表单词”则采取“再合并策略”。

之所以这样做,是由于“原地更新策略”更适合“长倒排列表单词”,因为这种策略能够节省磁盘读写次数,而“长倒排列表单词”的读写开销明显要比“短倒排列表单词”大很多,所以如果采用“原地更新策略”,效果体现得比较显著。而大量“短倒排列表单词”读写开销相对而言不算太大,所以利用“再合并策略”来处理,则其顺序读写优势也能被充分利用。


ElasticSearch 动态更新索引 通过增加一个新的补充索引来反映最近的修改,而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询--从最旧的开始--再对各个索引的查询结果进行合并。 阅读详情

相关推荐

RabbitMQ与大数据搜索引擎:实时索引更新

本文旨在为开发者和架构师提供一套完整的解决方案,用于实现大数据环境下搜索引擎索引的实时更新机制。我们将重点讨论如何利用RabbitMQ消息队列作为数据变更的传输层,确保搜索引擎索引能够及时反映源数据的变化。本文首先介绍相关背景和核心概念,然后深入探讨技术实现细节,包括算法原理、数学模型和实际代码实现。最后我们将讨论应用场景、工具推荐以及未来发展趋势。RabbitMQ:开源消息代理软件,实现了高级消息队列协议(AMQP)实时索引:在数据变更后立即或几乎立即更新的搜索索引消息队列。

AI智能探索者的博客 672

如何更新索引

需要注意的是,索引并不是万能的,不是所有的查询都能够充分利用索引。在数据库中,更新索引通常是指对现有索引进行修改或重建,以改善查询性能或适应新的数据需求。需要注意的是,在更新索引时应该谨慎操作,因为对索引的增加、删除和重建会影响数据库性能和可用性。在生产环境中,最好在非高峰期进行索引的更新操作,并且要对更新前后的性能进行充分测试和评估。对于范围查询,如果使用了合适的索引,数据库系统可以利用索引的有序性进行快速定位。在连接查询中,如果连接的字段上有索引,数据库可以使用索引来加速连接操作。

m0_57021623的博客 1435

Veritas NetBackup 10.1 Windows安装指南:从账户配置到完整部署

本文详细介绍了Veritas NetBackup 10.1在Windows系统上的完整安装流程,从账户配置到部署验证。重点讲解了创建专用服务账户、安装组件选择、许可证输入等关键步骤,并提供了常见问题排查和进阶配置建议,帮助用户顺利完成企业级备份解决方案的部署。

weixin_26765287的博客 453

MySQL索引的更新策略

对于数据的每一次更新,MySQL并不会每次都会更新索引(针对非唯一性索引而言),索引的更新策略是这样的: 在InnoDB中,增删改都会立刻修改主键or唯一索引,但是不会rebuild全局索引,而是对这些索引增加值(或移除值)。 对于非唯一性索引,InnoDB会进行change buffering操作。将更改排入队列,之后再在后台将其合并到索引中。甚至,为了后续物理更新更加高效,会将变更进行合并。...

淡然坊 1万+

大数据架构中的数据血缘追踪技术解析

数据血缘(Data Lineage)是指数据从源头到目标的完整流转路径,它记录了数据在整个生命周期中的变化过程。在大数据架构中,数据血缘追踪技术已经成为数据治理的核心组成部分。本文旨在全面解析数据血缘追踪的技术原理、实现方法和应用实践,帮助读者深入理解这一关键技术。本文将从基础概念入手,逐步深入到技术实现细节,最后探讨实际应用和未来趋势。数据血缘的核心概念和技术原理数据血缘的数学模型和算法实现实际项目案例和代码解析主流工具和解决方案比较未来发展方向和技术挑战。

架构师的AI之路,分享AI应用开发架构的学习与实践。 688

打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1 minimal

编译打包可以在Hadoop 3.3.1和Hive 3.1.2上使用的Tez 0.10.1

qq_42013533的博客 2616

mysql索引更新

数据库相关视频讲解:用python编程Excel有没有用处?MySQL 索引更新详解 在MySQL数据库中,索引起着非常重要的作用,能够提高查询效率并加快数据检索速度。然而,在进行更新操作时,索引也会发生变化,因此我们需要了解索引更新的机制以及如何有效地管理索引,提高数据库的性能。 索引更新的原理 在MySQL中,当我们...

weixin_26717737的博客 373

【车载以太网测试从入门到精通】系列文章目录汇总

物理层测试、数据链路层测试、以太网交换机测试、网络层测试、传输层测试、以太网TCP/IP协议自动化测试、以太网网络管理测试、以太网网络管理自动化测试、鲁棒性测试、SOME/IP测试、SOMEI/IP服务接口自动化测试、DoIP诊断测试、DoIP诊断自动化测试、DoIP BootLoader刷写、以太网网关路由测试、以太网网关路由自动化测试、AVB测试。

测试领域技术分享 3158

sql优化总结

sql优化总结 一、大的架构方面: 分库分表、主从读写分离 二索引(查询) 接下来说一下索引: 哪些场景会造成索引生效 1、应尽量避免在 where 子句中使用 != 或 <> 操作符 否则引擎将放弃使用索引而进行全表扫描; 2、尽量避免在 where 子句中使用 or 来连接条件 否则将导致引擎放弃使用索引而进行全表扫描,即使其中有条件带索引也不会使用,这也是为什么尽量少用 or 的原因; 3、对于多列组合索引,不是使用的第一部分,则不会使用索引; 组合索引最左前缀原则 4、如果列类型是字符串

qq_35347718的博客 736

Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

yocto quick start up带大家快速上手

fulinux的博客 5万+

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1694

有关索引建立的一些注意事项

在创建索引以后,频繁的对数据库表进行delete 、update、insert 操作,那么索引的效率会变慢,比如一天内表数据增加百万条,并且是在含有索引的情况下,处理这种问题就要考虑索引建立与否,以及索引的管理 索引建立的类型,一般会建B-tree索引 可以在数据量少的情况下不建索引,当数据量达到一定程度的时候再建索引 索引进建立以后需要维护,可以定期重建索引,重新reindex索引速率会明...

非衣鲲化的博客 330

PCL RANSAC拟合空间圆【2026最新版】

RANSAC三维点云空间3D圆拟合。博客长期更新,本文最新更新时间为:2026年4月13日。代码在PCL1.15.0中测试通过

点云侠的博客 7454

[ES7版本系列(三)] Java连接ElasticSearch向索引中更新数据

1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 来创建高级别的客户端 <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifac..

寒夜二十五 2245

基于Python的FTA协定内容爬虫实战:从数据抓取到智能分析

本文将详细介绍如何使用Python构建一个高效的FTA(自由贸易协定)内容爬虫,涵盖最新技术如Playwright、异步IO、智能解析等。通过本教程,您将学会如何从各类政府网站和国际组织平台抓取结构化FTA数据,并对其进行清洗、存储和分析。文章包含完整的代码实现和最佳实践指南,适合中高级Python开发者学习网络爬虫开发。

2201_76125261的博客 992

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

es elasticsearch 新增更新索引,新增更新文档

局部更新是:若更新数据为{"a":111},则get整个文档变为{"a":111,"b":2}全量更新是:若更新数据为{"a":111},则get整个文档变为{"a":111}创建一个全新的索引,映射包含调整后的字段或类型。将新的索引的别名设置为原来索引相同名称。若原文档为{"a":1,"b":2}将原有索引的数据迁移到新的索引。只能增加原有不存在的字段。

FREEDOM 1799

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【ElasticSearch】更新es索引生命周期策略,策略何时对索引生效

更新后的es索引生命周期策略对原来已经应用该策略的索引,立即生效

好学的小师弟的博客;华为云社区月度积极博主 2021

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

es中向量索引的增量更新

过程,通过牺牲部分即时性换取吞吐量,适用于标题向量等中低频更新场景。API同时修改标题文本和预计算的向量值(假设向量字段为。通过上述方法,可高效实现标题变更与向量索引的联动更新。

仅做个人笔记 1059

ElasticSearch搜索引擎详解-持续更新中

微服务 ElasticSearch搜索引擎1. ElasticSearch概述1.1 elasticsearch是什么1.2 全文搜索引擎1.3 elasticsearch and solr1.4 elasticsearch or solr1.5 elasticsearch应用案例2. ElasticSearch入门3. ElasticSearch环境4. ElasticSearch进阶5. ElasticSearch集成6. ElasticSearch优化7. ElasticSearch总结 1. Ela

靖节先生的博客 2462

ElasticSearch 更新不是即时的,你如何等待 ElasticSearch 完成更新它的索引?

在上述代码中,我们首先创建了一个Elasticsearch的连接,然后定义了要更新的文档和新的数据。在这个过程中,我们没有立即获取到更新后的状态,而是通过一个while循环来等待直到更新完成。在Python中,我们可以使用Elasticsearch的官方客户端库`elasticsearch-py`来更新索引并在更新完成后获取更新的状态。在这个示例中,我们使用了一个GET请求来获取更新后的状态。此外,我们还可以使用Elasticsearch的官方REST API来获取更新的状态。# 打印更新后的数据。

484

ElasticSearch:不停机更新索引类型

ElasticSearch 是一个基于 Lucene 的分布式搜索和分析引擎,它提供了近实时的数据索引和搜索能力。

Made In SQL 1163

elasticsearch使用es-head在已有索引中新增字段以及更新记录

elasticsearch版本7.0,7.0版本有默认的type,8.0会彻底废弃 1、向索引idx_resource添加image_analyse字段,类型为text 语句: { “properties”:{ "image_analyse":{ "type":"text" } } } 2、向索引中更新某条数据的某个字段 :http://localhost:9200/index/type/id 其中index

目标检测专栏持续更新中,改进YOLO系列通用,适用v5、v7、v8、所有博客均是团队原创博客,所有文章禁止转载,违者必究。 1606

Elasticsearch 索引的全量/增量更新

当你的es 索引数据从mysql 全量导入之后,如何根据其他客户端改变索引数据源带来的变动来更新 es 索引数据呢。 首先用 Python 全量生成 Elasticsearch 和 ik 初始的分词索引数据,增量更新索引实现如下: 服务端(Python+redis-sub) # Python-redis 开启监听 'leon' 等待客户端推送消息,来增量更新es文档 #-*-

Leon的博客 1万+

[ES7版本系列(四)] Java连接ElasticSearch向索引中(bulk)批量更新数据

1.引入依赖,这里使用的是es的7以上的版本,使用elasticsearch-rest-high-level-client 来创建高级别的客户端 <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifact.

寒夜二十五 6481
上一篇: 搜索引擎索引之如何建立索引
下一篇: 搜索引擎反作弊之内容作弊
张俊林博客
张俊林博客 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄22年 6033粉丝 116原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值