Indri 动态文档索引技术

解决Unity与3DMax模型单位与中心点偏差的完整指南 本文详细解析了Unity与3DMax模型导入时常见的单位与中心点偏差问题,提供了从3DMax单位设置、FBX导出到Unity接收调整的完整解决方案。通过实战案例和高效工作流建议,帮助开发者实现unity与3dmax的单位统一,避免尺寸错误和轴心偏移,提升3D资源导入效率。 阅读详情

Indri中的动态文档索引技术

戴维 译

 

摘要: Indri 动态文档索引的实现技术,支持在更新索引的同时处理用户在线查询请求。 文本搜索引擎曾被设计为针对固定的文档集合进行查询,对不少应用来说,这种机制工作得很好,然而对于诸于新闻,财经和桌面搜索而言,需要的是高效、经常性的更新索引。 以往支持动态文档集合的研究主要围绕增量索引方法,增量系统通过往已有的索引中追加大的文档集合来优化索引性能,但是不允许在增量索引的同时处理用户查询。 与以往的增量系统不同,Indri搜索引擎的最新版本支持动态文档集合,不需要通过加大文档集合大小来获取索引性能,同时Indri支持索引和查询的并发,允许用户在增量索引的同时进行查询。

 

1.介绍

尽管全文索引技术已经出现了几十年之久,但是直到互联网的出现,它才真正得到普及。现在,几乎每个互联网使用者都是搜索引擎用户,全文搜索技术被广泛地用于各种应用领域,如Web搜索,新闻搜索,以及时下流行的桌面搜索等。

       搜索桌面(或硬盘)文件和e-mails对大多数信息检索系统而言是一个新的挑战。用户期望他们的e-mails即到即索引,文件在保存到磁盘的顷刻便被索引好。永远不要期望桌面搜索用户能忍受由于索引更新所带来的存储消耗。不管是祈祷还是咒骂,用户看到了全文搜索的好处,更为普遍的事实是人们越来越发现自己离不开搜索。

       然后,更新一个全文索引是一个耗时的过程,现在的搜索引擎通过建立大量文档的倒排索引表来创建索引,一个倒排索引项包含一篇文章的无重复词语列表,以及这些词语的附加信息(如词语在文档中的位置,词性等)。一篇短小的包含100个左右不重复词语的文章,索引的时候需要更新100个倒排索引项。如果这些倒排索引是存储在磁盘上的话,更新操作将需要100次的磁盘寻址,在现有的硬件配置下,这需要一秒或更长的时间。当然,长文章耗时也越长。另外,一个随之而来的问题是,在更新索引的时候,搜索引擎是该让用户等待更新完成还是继续处理用户的查询请求呢?

       Indri搜索引擎新的版本突破了上述限制。作为Lemur[1]项目研发的一部分,Indri支持结构化查询语言,采用语言建模方法[2],同时为了满足问答系统的需要,Indri还支持对结构化文档不同域进行查询。Indri第一个版本没有加入对增量索引的支持,但在最新的版本中允许对单个文档进行真正的实时索引。

       一个信息检索系统要处理动态的文档集合,需要解决三个关键问题。首先,要能快速地添加和删除集合中的文档,这里的快速取决于一个桌面搜索用户愿意花多长的时间来等待索引的完成,也就是说对于单个文档而言响应应该是瞬时的。其次,系统要允许查询在任何时候都能得到响应,即使是在新文档添加进文档集合的同时。另外,系统要实用,在索引和检索性能上比不支持动态文档集合的检索系统更具有竞争性。

在Indri最新版本中,我们通过引入如下设计原则来实现上述目标:

内存结构—为了避免读写磁盘,尽可能长地把数据调入内存。

加锁机制—系统在尽可能小的时间段内对数据进行加锁互斥。

只读结构—为了减少对互斥锁的依赖,系统引入只读数据结构。

后台I/O—系统采用后台线程来和低速设备进行交互,以提高索引操作性能。

多版本结构—如果一个耗时长的操作需要获取可能已经更新的数据,系统将维持此数据的多个版本来减少互斥锁的使用。

上述原则的具体运用将在文章后续部分进行详细介绍。

 

2.相关工作

       数据库研究团体已经花了几十年时间来研究数据获取并发技术。Ramakrishnan和Gehrke提出了一个通用的数据库原则[3],Gray和Reuter则进一步深入探讨了事务处理系统[4]。

       尽管访问文档数据和访问数据库数据所遇到的问题类似,但它们之间仍然存在着显著的差别。在数据库系统中,用户特别关心的是数据的原子性,有一个经典得例子,一位银行顾客把d美元钱从一个储蓄户头转到一个支票账号,如果d美元先从储蓄户头减掉,那么这位顾客的总钱数就少了d美元;如果先往支票账号加入d美元,那么他的钱就凭空多了d美元。不管怎么样,在第一个账号改变的同时就会出现金额不一致的情况。于是,数据库中事件并发研究的一个主要任务就是确保数据库的一致性,即使是在系统操作失败的情况下也要如此。

       在我们系统中可以确保文档的插入和删除是原子操作,没有用户会看到一个文档是部分被删除或者插入的。但我们不允许多个文档的插入和删除是原子的。既然文档之间很少像数据库中记录那样相互依赖,这就不会成为我们系统的主要限制。

       虽然有上述的差异,我们仍然可以从数据库中得到借鉴。异步I/O和互斥技术被现代数据库系统广泛使用,我们也在索引系统中采用类似的多版本并发技术[5]。

       信息检索研究团体没有忽略动态文档集合,他们把研究重点放在了增量系统上,这种系统通过一次性添加大批量文档到已有索引上来代替单个文档的高效添加。这种研究并没有考虑当更新索引时系统能否继续处理查询的问题。

       Brown,Callan和Croft[6]研究了一种高效增量索引的方法。他们区别对待小于8k和大于8k的索引,当一个小的索引需要增大时,它将被拷贝到一个大的连续的倒排索引文件中。然而对于一个大的索引项则不需要移动,只需添加一个前向指针到新的存储段(segment)里面。这也使得倒排索引可以通过倒排索引文件串连起来。他们发现,当在7个簇中创建一个索引的时候,查询性能降低了6%。使用小的簇时代价偏高,在他们的模型中索引每簇大小为64M的文本所花的时间是索引每簇大小为1M的文本的8倍。

       在最近的研究中,Lester,Zobel以及Williams[7]比较了三种索引策略:占位(in-place),合并(re-merge)以及重构(rebuild)。除了没有对连接链表进行优化外,in-place策略类似Brown所采用的方法。所有的倒排索引连续存放,如果没有足够的空间写入新数据的时候,已有数据必须被拷贝到别的地方。在re-merge策略中,新的文档簇被创建到单独的索引中,然后和已经存在的索引进行合并。rebuild策略则对已经构建的索引弃之不顾,在原始文档的基础上重新构建索引。他们研究发现,re-merge策略是最高效的更新索引的方法。但是,他们没有像Brow,Callan和Croft所作的那样,对预分配(pre-allocation)策略之间和处理大索引策略之间的差异进行比较。

       Lester,Zobel和Williams提到,在使用最小的文档簇(10个文档)的情况下,表现最好的索引策略(in-place策略)在大约7秒的时间内更新了1G的索引。相对于别的策略而言,这已经是非常快了,但是,对于单个文档的索引更新来说,这并不是个理想的策略。

       本文描述的方法类似Lucene搜索引擎,正常情况下,就像传统的批量索引一样,Lucene以分段(segment)的方式把数据写入磁盘。一旦数据被写入段中,他们就可以被查询到,并且不需要进行段的合并。这和Brown,Callan和Croft的连接链表方法有点类似,只是,把数据写入簇(batch)中需要更多的开销。为了获得更好的性能,许多文档必须被写入磁盘的一个簇(batch)中。

       如果需要快速的响应,Lucene提供一个RAMDirectory类在内存中创建索引。添加一个文档到RAMDirectory很快,因为不需要进行磁盘I/O操作。一个文档一加入RAMDirectory便可以通过一个叫做IndexWriter的对象进行查询。这也解决了文档簇对于小文档集合的问题。然而,对于大小大于机器内存的文档集合,内存索引方式将不再可用,数据必须被写入磁盘,并根据用户对索引数据的定位方式来决定,哪些数据需要驻留内存,哪些数据应该写入磁盘。

       在我们的工作中,当需要对文档进行快速存取时,Indri使用内存索引而不是批量索引。当需要同时处理查询请求的时候,Indri会立即决定什么时候该合并索引,而什么时候该把数据写入磁盘。

 

3.策略

3.1 内存结构

       Indri采用两种类型的索引:内存索引和磁盘索引。内存索引驻留内存,而磁盘索引则存储在磁盘上。两种索引都能够处理查询,但只有内存索引能添加新的文档。Indri的磁盘索引结构是固定不变的,可以删除,但不能修改。

       大多数的信息检索系统在磁盘上为所有文档创建一个单独的索引,而Indri在创建索引的同时还会生成不同用途的索引文件,这里我们使用“索引库repository”来指代一个文档集合对应的索引及其相关数据结构。

       当在文本集合上创建索引库的时候,Indri把当前文档索引到活动的内存索引中。只要一个索引库处在打开写模式,就存在一个活动的内存索引准备接收文档。对于小的文档集合,索引数据直到索引库需要关闭的时候才写入磁盘。数据写入的同时,一个新的内存索引被创建,作为新的活动索引使用。

       用上述方法构建一个索引相当于多个检索系统同时工作。文档通常一次性加入内存索引结构,只有当达到了内存限制时才被写入磁盘。在批量系统中,磁盘和内存结构不能独立工作,索引需要经过后续处理才能用于系统查询。

       因为构建许多小的索引比构建一个单独的大索引更加高效,所以在磁盘上维持许多单独的小索引要更加有利。大的索引只有在需要合并小索引的时候才会出现,为了尽可能快地向系统中添加文档,简单地生成小的索引更有优势[7]。

       然而,从一个单独的大索引中查询比在众多小索引中寻觅要快的多,主要的原因在于磁盘寻址时间,查询所需要的大量的磁盘寻址和索引数目之间具有线性的关系。因此,重查询负载的情况下,Indri将通过合并索引的方式来减少磁盘索引数目。

3.2 加锁机制

       为了满足系统快速响应的需求,Indri必须快速地处理查询和加入文档。Indri以前的版本已经是一个有效的批量系统,可以很容易地对数据结构进行加锁,但是这也容易使查询或文档插入被长时间阻塞。为了保持快速的响应,必须确保系统中互斥锁的使用是在很短的时间内。

       我们通过只允许活动内存索引可变来减少互斥锁的加锁时间。除了一些caches外,内存索引是系统加锁时需要处理的唯一结构。而内存索引的大小是受可用内存大小限制的,它的全部内容都驻留在内存中,即算对于复杂的查询,内存索引的响应也相当快。当然,加锁时间也可以通过减少内存限制来降低。

       互斥锁也需要向内存索引中添加新的文档,为了减少加锁时间,我们确保每个文档在上锁前是被解析过的,只有当单个文档被索引的时候才加锁,然后开锁以处理查询。大多数的网页和新闻文档可以在小于1/100秒的时间内索引好,查询处理需要等待的时间相应也就很短。

       当处理查询的时候有新文档到来,系统又正好处于加锁状态,此时,系统将禁止磁盘I/O操作。这样可以显著减少主线程在持有互斥锁的情形下任务调度混乱。

3.3 只读结构

       为了减少系统在处理大卷数据时互斥锁加锁的时间,我们设法让大部分数据保持不变,对于磁盘数据来说这是基本准则。如果磁盘数据不是只读的,那么线程之间就需要在进行磁盘I/O读写时进行加锁,这可能导致加锁时数据的高度不一致。

       既然磁盘数据在写入后便不允许更改,对于读取数据来说就不用加锁。加锁策略让Indri可以充分利用多处理器系统来提高性能。大部分的查询代码路径(query code path)仅仅需要只读锁就可以了,也就是说查询处理是高度并行的,尽管它看起来似乎受到磁盘子系统的并行限制。另外,由于文本解析和索引可以同时进行,索引过程也具有可并行性。

3.4 后台I/O

如果I/O操作在查询和索引时候不能执行,就需要引入异步I /O。Indri通过一直运行如下两个线程来实现异步I/O操作:

RepositoryMaintenanceThread

RepositoryLoadThread

       这两个线程和特定的Repository相关联,如果多于一个Repository被打开,每个repository均需要对应的这样一对线程相关联。

       RepositoryLoadThread执行两项任务。一是为查询和新加入的文档载入统计数据,这种数据载入和Unix进程载入有些类似,线程标明在过去的1,5以及15分钟内处理的查询和添加的文档数目,以帮助系统决定何时该把内存数据写入磁盘。

       RepositoryLoadThread的另一项任务是检查系统的内存使用情况。如果系统使用的内存超过用户限制的25%,RepositoryLoadThread将挂起所有文档索引线程直到内存占用降下来为止,这可以防止系统在大批量文档加入的时候崩溃。对于多数可能的实时程序,如新闻播报,系统的运行决不能超出内存限制。

       RepositoryMaintenanceThread把索引写入磁盘,它是唯一能把索引数据写入磁盘,并可以从磁盘删除数据的线程,在这个线程中不需要复杂的加锁机制。该线程每分钟激活5次以检查系统当前内存占用量,如果系统使用了过多的内存,它就开始把内存数据写入磁盘。

       如上所述,创建新的磁盘索引并不是总有好处,因为许多小的磁盘索引结构对于大的磁盘索引结构来说需要更多的查询时间。为此,索引库维护线程RepositoryMaintenaceThread在写磁盘之前检查查询和文档的载入情况,如果查询相对于文档载入量更大的话,维护线程将进行索引合并而不是往磁盘中写入一个新的索引。

3.5 多版本结构

       Indri Repository可能包含多个索引,Indri维护一个称之为index_state的结构,这个结构持有指向当前索引库中所有索引的指针。索引数据在两种情况下被写入磁盘:

       内存索引MemoryIndex已经达到了它的内存限制;

       存在过多的内存索引MemoryIndex,他们需要进行合并。

在上述两种情况下,Indri把数据写入磁盘,这些数据可能已经以别的形式存在于系统中,因此index_state需要进行修改以反映数据是否被删除。

       一个解决办法是对index_state结构的读写进行互斥,然而,这种方法也可能导致在重负载情况下系统性能低下。

考虑Indri是运行在一个并行系统中,并且用户正在进行复杂的查询,这些查询每个都需要10分钟的处理时间。假如用户在两个独立的线程中提交查询,系统中就总是有两份同样的查询在运行。如果这些查询以5分钟为时间片轮流执行,A线程分别在一个小时的0,10,20,30,40和50分钟时开始运行,而B线程则分别在5,15,25,35,45和55分钟时开始执行。在一个小时开始的时候,我们对index_state的写进行加锁,当在B线程处理完一个查询前,A线程不允许处理它的下一个的查询,于是一个处理器将有5分钟的空闲时间,这是我们不希望看到的。

为了避免上述情况的出现,Indri在同一时间维持多个index_state结构,所有新的任务(如新的查询,文档的加入)使用新的index_state结构,而旧的任务继续使用旧的index_state结构,当没有用户需要使用index_state的时候,它将被删除。

在上面的例子中,这意味着线程B在使用它旧的index_state结构完成它的查询处理的同时,线程A使用新的index_state结构开始处理它的下一个查询。当线程B处理完毕当前查询,旧的index_state将不在有用户使用,从而被删除掉。

 

4.删除文档

       Indri支持删除标记。删除标记是一种弱删除方式,只是简单地隐藏文档对于用户的可见性,而不是真正的删除。文档对应的索引数据并不会真正从倒排链表,有向链表或者压缩集合中删除掉,也就是说文档中词语的计数仍然保留在语料统计数据库中。

       假设我们有一个文档集合A,以及它的一个子集B,首先创建A的索引I,然后从I中删除B对应的索引。我们只是通过把文档集合A-B添加到I’来创建一个相似的索引I’。由于包含了文档集B的数据,索引I比索引I’需要占用更多的磁盘空间。进一步,因为I和I’对应的语料统计库稍有差别,当在这两个索引上进行查询时,查询结果也会有所不同。基于如上原因,当使用Indri进行搜索的时候要谨慎地使用文档删除特性。

       尽管实际应用中,删除是个很有用的特性,但单纯的删除用处不大。删除往往被用于进行文档更新(删除旧的版本,插入新的版本)。对于桌面搜索或新闻搜索而言,经常需要更新已有文档的错误(或者过时)版本,这就显得尤为重要。

       我们采用一个简单的位图来标记文档的删除,当一个文档需要删除,就为其设置对应的比特位,任何不在位图中的比特位均假设没有被设置。因此,如果没有文档被删除,位图文件将是一个空文件。这个文件会一直扩充直到最后一个比特位被设置为非0。

       查询时,每个文档均要在打分前对照位图进行检查,只有没有被标记为删除的文档才能进行查询计分。

 

5.总结

       Indri现在可以在小于1秒的短时间片内完成文档索引并立即用于查询,这使得高速、并发访问新索引的文档所付出的代价足够小,以至Indri不需要采用特殊的批量和增量模式。Indri可以每小时索引约15G的Web数据,包括压缩和存储每个原始文档。

       在这种性能下,我们已经实现了适合新闻过滤以及桌面搜索应用的检索系统,我们相信这是第一个具有如此高性能的开源系统。

Copyright@戴维 2005.8  于北京

参考文献:

[1] Trevor Strohman, Donald Metzler, Howard Turtle, and W. Bruce Croft, Indri: A language model-based serach engine for complex queries, IA 2005: Proceedings of the 2nd International Conference on Intelligence Analysis (to appear), 2005.

[2] Donald Metzler, Victor Lavrenko, and W. Bruce Croft, Formal multiple-bernoulli models for language modeling, Proceedings of ACM SIGIR 2004, 2004, pp. 540–541.

[3] Raghu Ramakrishnan and Johannes Gehrke, Database management systems, McGraw-Hill Higher Education, 2000.

[4] Jim Gray and Andreas Reuter, Transaction processing: Concepts and techniques, Morgan Kaufmann, 1993.

[5] Philip A. Bernstein and Nathan Goodman, Multiversion concurrency control˙theory and algorithms, ACM Trans. Database Syst. 8 (1983), no. 4, 465–483.

[6] Eric W. Brown, Fast evaluation of structured queries for information retrieval, SIGIR’95: Proceedings of the 18th annual international ACM SIGIR conference on Research and development in information retrieval (New York, NY, USA), ACM Press, 1995, pp. 30–38.

[7] Nicholas Lester, Justin Zobel, and Hugh E. Williams, In-place versus re-build versus re-merge: index maintenance strategies for text retrieval systems, Proceedings of the 27th conference on Australasian computer science, Australian Computer Society, Inc., 2004, pp. 15–23.

 

来源:Trevor Strohman    Dynamic Collections in Indri

相关链接:
http://newhaven.lti.cs.cmu.edu/indri/

 

 

 

 

 
多无人车协同探索开源包部署教程及常见报错解决方式 本博客将介绍项目的基本概念、部署步骤以及常见问题的解决方案。该项目利用 RRT(Rapidly-exploring Random Tree)算法,通过多机器人协作进行高效的环境探索,适用于自动化与自主导航任务。项目简介:介绍该项目的核心算法、特点及应用场景,展示如何通过多个机器人共同工作来提升探索效率。部署教程:详细讲解如何在 ROS Noetic 环境中部署该项目,安装依赖、创建工作空间、克隆代码并编译项目。项目运行:包括单机器人与多机器人自主探索的示例,帮助读者快速理解和实践项目。 阅读详情

相关推荐

INCA软件操作指南:手把手教你生成和解析DCM标定数据文件

本文详细介绍了INCA软件在汽车ECU开发中生成和解析DCM标定数据文件的全流程。从A2L文件导入到DCM文件生成,再到HEX文件导出,手把手教你掌握标定数据处理的实用技巧,包括参数标定、曲线标定和常见问题排查,帮助工程师提升工作效率。

weixin_29271053的博客 1052

文件管理---索引文件结构、位示图、树形目录结构

15号磁盘块:因为磁盘块从第0号字的第0号位开始,序号和实际位置相差:1 - 0 ,实际位置:16,且一个字占16位,1516,33/16 = 2 余 1,所以在2号字的1号位上;图中有16个字,每个字占16位,且磁盘序号是从0开始的,如果要分配15号、32号磁盘,它们在第几个字的第几位了?

qq_37432174的博客 6630

【Ubuntu2404】Ubuntu24.04安装NVIDIA驱动/CUDA/cuDNN搭建神经网络训练环境

NVIDIA 驱动、CUDA和cuDNN是紧密相关但各自具有独特功能的技术,它们共同为图形处理单元(GPU)加速的应用程序提供了强大的支持。本文主要介绍如何安装 `NVIDIA` 驱动、CUDA及cuDNN,为后续神经网络训练提供支持。本文主要介绍Ubuntu24.04安装NVIDIA驱动、CUDA和cuDNN的流程。

王阿巴和王咕噜 1万+

文件系统中有四种索引方式,分别是目录索引、文件内容索引、文件逻辑结构中的索引文件和文件物理结构中的索引分配

索引对于查询性能的影响是非常显著的。例如,在表的记录较少时,使用索引操作可能比直接扫描数据更慢,因为索引本身也需要进行一些操作,导致额外的开销。而且建立的索引并不是越多越好,因为索引虽然能够提高查询效率,但是会大大得影响插入、删除和修改的效率,因为每一次数据的更新都会牵涉到对索引的修改。与聚集索引不同的是,非聚集索引不会改变表的物理顺序,而是将索引存储在一个独立的数据结构中。但是,需要注意的是,虽然索引对于查询效率的提升很大,但它也会带来一些额外的开销,如索引维护和存储开销,因此需要权衡索引的创建和使用。

[Blog][Domain] programb.blog.youkuaiyun.com 2698

基于决策树的英雄联盟比赛胜负预测(含完整代码)

在代码中设置随机种子(例如 RANDOM_SEED = 2024)的主要目的是为了确保每次运行代码时,随机过程的结果是一致的。通过绘制不同参数组合下的准确率图,直观地展示了参数对模型性能的影响,帮助读者更好地理解和选择合适的参数。通过设置相同的随机种子(伪随机数),可以确保每次运行代码时,随机数生成器生成的随机数序列是相同的。如果在开发过程中遇到问题,设置固定的随机种子可以帮助你更容易地定位问题,因为每次运行代码时的数据和结果都是一样的。在科学研究和实验中,结果的可重复性是非常重要的。

oisflo的博客 1919

Claude Code Router 401错误修复

claude code router配置相关环境变量问题

如沐春风 6358

Indri和Terrier搜索引擎的使用

Indri和Terrier都是开源的搜索引擎,其中Indri作为Lemur项目的一个重要部分,具有强大的查询接口,易建索引,可扩展,高效率等优点。可以在SourceForge Lemur Project Page中下载。Terrier也是IR领域非常有影响力的开源搜索引擎,Terrier是Glasgow大学用Java语言编写的,具有高效灵活及易于部署等特点,目前最新的版本为Terrier 4.

Wallace 5225

cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用

Symbol: vcvs (Voltage Controlled Voltage Source) Vop−Von=egain⋅(Vip−Vin)V_{op}-V_{on}=egain\cdot(V_{ip}-V_{in})Vop​−Von​=egain⋅(Vip​−Vin​) 所以可以得出 ⟹Vop=egain⋅(Vip−Vin)+Von\Longrightarrow V_{op}=egain\cdot(V_{ip}-V_{in})+V_{on}⟹Vop​=egain⋅(Vip​−Vin​)+Von​ 使

大学生视野 2万+

数据库索引中包含的数据结构有哪些

1 索引介绍   MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。   我们知道,数据库查询是数据库的最主要功能之一,例如下面的SQL语句: SELECT * FROM my_table WHERE col2 = '77'  可以从表“my_table”中获得“col2”为“77”的数据记录。   我们

无鞋童鞋的博客 9854

VM虚拟机下,通过无线,有线两种方式连接PLC的设置方法

1,VMware软件:编辑>虚拟网络编辑器。 2.右下角:更改设置(如果可以选中“添加网络”选项,则可考虑略过此步) 3.选中VMnet0,点击桥接模式,选中你的物理机有线网卡。点击确定。 4.点击添加网络,我的添加完是VMnet2,然后选中,像上一步样,点击桥接模式,在下拉菜单中选中笔记本的【无线网卡】,然后点击确定。 5.VMware软件:虚拟机>设置。 6.点击 添加>网络...

weixin_46441715的博客 2万+

华为OD机考真题 新系统 - 数列求值(Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【数列求值】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【数列求值】多语言题解。

qq_45776114的博客 664

Indri中的动态文档索引技术

Indri中的动态文档索引技术 戴维 译 摘要: Indri 动态文档索引的实现技术,支持在更新索引的同时处理用户在线查询请求。 文本搜索引擎曾被设计为针对固定的文档集合进行查询,对不少应用来说,这种机制工作得很好,然而对于诸于新闻,财经和桌面搜索而言,需要的是高效、经常性的更新索引。 以往支持动态文档集合的研究主要围绕增量索引方法,增量系统通过往已有的索引中追加大的文档集合来优化索引性...

weixin_33963189的博客 111

【DeepSeek实战】1、DeepSeek民用级开发全指南:从0到1掌握AI应用开发与模型蒸馏实战

DeepSeek创新性地打破了传统AI开发的技术壁垒,通过双模型架构(DeepSeek-V3和R1)实现普惠化与专业化并重。其核心优势包括:零代码操作、浏览器直接使用、中文提示词控制及低成本(2元/百万token)。用户通过简单三步(注册-配置-使用)即可快速开启AI之旅,平台提供$50免费额度支持2个月高频使用。 四大核心应用场景: 办公自动化:周报撰写、PPT生成、数据分析一键完成 内容创作:提供爆款标题生成、垂直领域写作模板 学习辅助:支持文档解析、错题讲解、知识图谱构建 生活服务:个性化行程规划

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 1735

Indri 开源搜索引擎

    一直对Lemur有所熟悉,有感于国外大学在研究和实践上的并驾齐驱,特翻译并撰写Indri开源搜索引擎的相关文章,以供志趣相同者共同参考。    Indri是一个完整的开源搜索引擎,由卡耐基-梅隆大学Lemur项目组维护并持续开发。尽管只是Lemur信息获取工具系列的一部分,然而由于其使用最新的语言模型,高效的索引技术,完整的搜索引擎解决方案,不乏为搜索相关专业及爱好者研究之典范。    支

搜索如风 7946

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

与搜索引擎相关的资源

一, 开源项目(1)Lucene地址:http://lucene.apache.org/Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具...

banyi4389的博客 150

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

与搜索引擎相关的东东

一, 开源项目(1)Lucene地址: http://lucene.apache.org/Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便

蓝色衬衫 611

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

开源搜索引擎的比较

为解决全站搜索问题。对开源搜索引擎的一个比较。在我的项目中,是ssh+jsp结构。选择solr是最佳的。 1. Lucene及其变种 Luncene Lucene的开发语言是Java,也是Java家族中最为出名的一个开源搜索引擎,在Java世界中已经是标准的全文检索程序,它提供了完整的查询引擎和索引引擎,没有中文分词引擎,需要自己去实现,因此用Lucene去做一个搜素引擎需要自己去...

LZ82091688的博客 283

UNIX索引技术访问文件初阶

背景: 软考里面,多次碰到一道题: 过程 以前对于这样的题,仅仅知道: 在文件系统中,文件的存储设备通常划分为若干个大小相等的物理块,每块长为512或1024字节。文件的理结构是指文件在存储设备上的存储方法,常用的文件物理结构有:连续文件、串联文件和索引文件三种。 (1)连续文件(顺序文件)连续...

416

文件系统中的索引与目录

文件系统操作居于高速缓冲算法之上。 1. 索引节点 UNIX系统中每个文件有一个唯一的索引节点,包含为进程存取文件所必须的信息。 inode以静态形式存在于磁盘上,内核把他们镀金内存索引节点表中以便操纵它们。包含内容:文件所有者、类型、时间、文件数据磁盘地址明细表,文件大小(偏移量表示)。 把索引节点的内容写入磁盘,和把文件内容写入磁盘不同,要注意区别。 内存中的索引

计算机技术博客 6725

文件索引

索引的作用(为什么要有索引?): 当要对大数据文件进行随机 读取时,一种方法是先全部读入内存,以数组形式存储,通过数组索引下标形式进行访问, 缺点是要占用大量的内存,我们知道对计算机而言内存是相当宝贵的。 另一种方法就是建立文件索引,通过文件索引查找数据。思路:把每一行字符串的数据首地址记录下来,存入数组,再通过文件指针访问数组中的存储地址所指向的数据。  程序步骤 1.读取文件中一共有

大力挥拳的专栏 4646

Indri 建立索引及检索

Indri 搜索引擎,为文本集合提供最先进文本搜索和丰富的结构化查询语言。 Lemur 项目 Wiki(重点!) 、官网 蒙特利尔大学 Jing He 的 PDF 1-Windows 版 安装完成后,启动根目录 lib 中的 IndexUI.jar 和 RetUI.jar,Help 中有相关说明。可参考 Youtube 的指南(西班牙语)。 2-Lunix 版 需要 Build-Essential 、g++(5.4 或更早版本)、make、zlib1g-dev,安装过程参考 文章 执行 bi

attribute47的博客 638

java运行的结果保存下来_Indri查询命令及Java调用并保存结果

查询参数indexIndri索引库路径。在参数文件中像/path/to/repository这样指定,在命令行中像-index=/path/to/repository这样指定。该参数可以设置多次来组合多个索引库。server运行Indri的服务器主机名(IndriDaemon)。在参数文件中如hostname方式指定,在命令行中像-server=hostname这样来指定。主机名可以指定一个可选的...

weixin_28713299的博客 337

数据库进阶(文件的组织方式和索引)

数据库中文件的组织方式数据库的组织要考率更新和检索的需求,更新涉及到数据的存储空间的扩展和回收的问题,检索涉及到扫描整个数据库,和大批量处理数据的问题,不同的需求要求不同的数据组织方式和存取方式。数据的组织方法是指数据组成记录,块,和访问结构的方式,包括把记录和块存储在磁盘上的方式,以及块和记录之间的相互联系。 存取方法是指对文件所采取的存取操作方法。 一种文件组织可以采取多种存取方法进行访问无

各种西瓜的博客 1万+

计算机网络原理(8)——P2P(文件收发、索引技术)

计算机网络原理(8)——P2P(文件收发、索引技术) 一、文件收发 Peer-to-peer 没有服务器 任意端系统之间直接通信 节点阶段性接入Internet 节点可能更换IP地址 问题:从一个服务器向N个节点分发一个文件需要多长时间? us:服务器上传带宽 ui:节点i的上传带宽 di:节点i的下载带宽 文件分发:客户机/服务器 服务器串行的发送N个副本 时间:NF/Us 客户...

Allure_07的博客 1184
上一篇: Indri 开源搜索引擎
下一篇: 搜索引擎中几种语言模型的性能比较
sharpdew
博客等级 码龄23年 76粉丝 35原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值