快捷搜索:  as  2018  FtCWSyGV  С˵  test  xxx  Ψһ  w3viyKQx

和记娱最好h88285愽娱:Lucene中创建索引的效率和删除索引的实现



越来越多的人使用开源组件 Lucene来开拓自己的搜索引擎。在数据量不大年夜的环境下,我们不会太关注创建索引的效率;然则,但数据达到必然的数量是,我们就不得不斟酌若何前进创建索引的机能,以缩短索引创建的光阴。

我们是用Lucene中供给的类IndexWriter来创建索引的,以是我们不妨先看一看IndexWriter类中关系到索引创建效率的几个措施。

一、SetMergeFactor(合并因子)

SetMergeFactor是节制segment合并频率的,其抉择了一个索引块中包括若干个文档,当硬盘上的索引块达到若干时,将它们合并成一个较大年夜的索引块。当MergeFactor值较大年夜时,天生索引的速率较快。MergeFactor的默认值是10,建议在建立索引前将其设置的大年夜一些。

二、SetMaxBufferedDocs(最大年夜缓存文档数)

SetMaxBufferedDocs是节制写入一个新的segme和记娱最好h88285愽娱和记娱最好h88285愽娱nt前内存中保存的document的数目,设置较大年夜的数目可以加快建索引速率,默觉得10。

三、SetMaxMergeDocs(最大年夜合并文档数)

SetMaxMergeDocs是节制一个segment中可以保存的最大年夜document数目,值较小有利于追加索引的速率,默认Integer.MAX_VALUE,无需改动。

在创建大年夜量数据的索引时,我们会发明索引历程的瓶颈在于大年夜量的磁盘操作,假如内存足够大年夜的话,我们该当只管即便应用内存,而非硬盘。可以经由过程SetMaxBufferedDocs来调剂,增大年夜Lucene应用内存的次数。

假如内存足够大年夜的话,我们也可以在索引历程中完全避免应用硬盘。Lucene支和记娱最好h88285愽娱持应用文件系统和内存两种要领创建和记娱最好h88285愽娱索和记娱最好h88285愽娱引,我们可以先把索引写入到RAMDirectory,达到必然数量时再批量写进FSDirectory,削减磁盘操作次数。相关的代码如下:

RAMDirectory rmd = new RAMDirectory();

IndexWriter writer = new IndexWriter(rmd, new StandardAnalyzer(), true);

while (not eof)//遍历

{

Document doc = new Document();

doc.Add(…); //Add Fields

writer.AddDocument(doc);

}

writer.SetUseCompoundFile(true);

writer.Optimize();

writer.Close();

别的,SetUseCompoundFile这个措施可以使Lucene在创建索引库时,会集并多个 Segments 文件到一个 .cfs 中。此要领有助于削减索引文件数量,对付将来搜索的效率有较大年夜影响。

若必要从索引中删除某一个或者某一类文档,IndexReader供给了两种措施:

reader.DeleteDocument(int docNum)

reader.DeleteDocuments(Term term)。

前者是根据文档的编号来删除该文档,docNum是该文档进入索引时Lucene的编号,是按照顺序编的;后者是删除满意某一个前提的多个文档。

在履行了DeleteDocument或者DeleteDocuments措施后,系统会天生一个*.del的文件,该文件中记录了删除的文档,但并未从物理上删除这些文档。此时,这些文档是受保护的,当应用Document doc = reader.Document(i)来造访这些受保护的文档时,Lucene会报“Attempt to access a deleted document”非常。假如一次必要删除多个文档时,可以用两种措施来办理:

1.删除一个文档后,用IndexWriter的Optimize措施来优化索引,这样我们就可以继承删除另一个文档;

2.先扫描全部索引文件,记录下必要删除的文档在索引中的编号。然后,一次性调用DeleteDocument删除这些文档,再调用IndexWriter的Optimize措施来优化索引。

您可能还会对下面的文章感兴趣: