IndexWriter 提供一个接口
帮助开发者合并不同的索引。这并不是合并具体的目录,而是合并不同的Directory类型的对象。这样我们可以就将不同文件系统路径下的索引合并,还可以将内存中的索引与文件系统中的索引进行合并。
RAMDirectory ramDir=new RAMDirectory();
FSDirectory fsdir=new FSDirectory();
IndexWriter ramWriter=new IndexWriter()...
IndexWriter fsWriter=new IndexWriter()...
ramWriter.addDocument........
ramWriter.close();//必须先关闭。将缓存中的文档刷入RAMDirectory
fsWriter.addIndexes(new Directory[]{ramDir});
fsWriter.close;
引用
IndexWriter.optimize
对所有segment 做优化。使所有的segments合并为一个。即整个目录只出现一种文件前缀。原因是如果太多的文件,打开文件对系统资源消耗是致命的。很多系统都有最大打开文件数量限制。超过,操作系统会禁止打开最后的文件,导致检索失败。
当然优化的消耗也很大,Lucene在索引优化时,采用的策略是建立新的segment来取代那些被合并的segments,所以旧的segment还未被删除前,索引内的磁盘空间消耗会非常大,甚至2倍。IO也会非常高,优化只能在需要时进行,而非任意时刻。
引用
删除索引中的文档
IndexReader 负责对索引的各种读取和维护工作。打开索引,获得索引中文档,获得索引中总文档数量,删除某个文档。
//显示索引内所有的Document
IndexReader reader=IndexReader.open(..)
for(int i=0;i<reader.numDocs();i++){
reader.document(i);
}
//输出当前索引的版本信息
reader.getVersion();
//输出当前索引文档数量
reader.numDocs();
Term term1=new Term("bookname","女");
TermDocs docs=reader.termDocs(term1);
while(docs.next()){
docs.doc();//查找的term1的Document的编号
docs.freq();//term在文档中出现的次数
}
reader.close();
引用
使用ID来删除文档
reader.deleteDocument(0);
reader.close();//必须要关闭,以便将删除信息写入磁盘。
//如果未删除即开始读取
for(int i=0;i<reader.numDocs;i++){
reader.document(i);
}
//如果不关闭,直接执行上门的代码会发生错误。
//反删除,恢复刚才删除的内容
reader.undeleteAll();
reader.close();
//真正删除,只需要运行一下optimize(),就会重新分配ID.那就再也无法恢复了。
引用
用Field信息来删除
Term term=new Term("field","value");
reader.deleteDocuments(term);//批量删除
reader.close();
引用
同步问题
处理并发问题,索引是一个关键资源。
1.同一时刻,只允许一个线程进行加入,删除,更新操作
2.任一时刻,系统只能有一个indexWriter实例对索引进行操作
3.任一时刻,只有一个indexReader对索引进行删除操作。删除后需要close后再启用新的reader
4.在写入时,必须先关闭删除操作。
5.在删除前,必须关闭indexWriter
引用
lucene lock
锁存放于临时文件夹。位置由 java.io.tempdir 属性定义
1.write.lock
添加文档,或者删除文档时。在IndexWriter初始化时创建,在close()时释放。
在IndexReader.delete时创建,在IndexWriter.close()时释放。
2.commit.lock
与segment合并和读取相关操作时出现。出现在IndexWriter初始化时候,但一旦segment信息被读取完毕,就立刻被释放。当调用IndexWriter.addIndexes()或mergeSegments()方法时,生成这个锁。
不能仅仅依赖Lucene锁机制来防止非法操作,需要编写具有良好同步特性的代码来实现高效
引用
IndexModifier
集成IndexWriter 添加功能,同时还提供了IndexReader的删除功能。
分享到:
相关推荐
为了更高效地利用内存资源,可以分批合并索引: ```java while (conditionForFlushingMemoryToDiskHasBeenMet) { fsWriter.addIndexes(new Directory[]{ramDir}); ramWriter.close(); ramWriter = new ...
通过定期合并索引,可以将这些小索引文件整合为一个或少数几个大文件,从而提高查询速度。 在上述代码中,`mergeIndex` 方法展示了如何在Lucene中进行索引合并。首先,我们创建了一个`IndexWriter`实例,传入了目标...
5. **合并索引**:所有线程完成索引后,使用IndexWriter的`addIndexes()`方法将所有子索引合并到一个主索引中。 这个过程需要注意线程同步问题,确保在合并索引之前,所有线程已经完成了它们的工作,避免并发冲突。...
3. **优化索引**:如果你想立即删除文档并释放磁盘空间,你可以调用`IndexWriter.optimize()`方法,这会强制进行段合并,但是请注意,这个操作可能会消耗大量资源且耗时较长,因此通常不推荐在高并发环境中频繁使用...
8. **优化索引**:`IndexWriter.optimize()`可以合并索引段,提高查询性能。 9. **关闭索引写入器**:完成所有操作后,记得关闭`IndexWriter`以释放资源。 ### 二、查询索引 查询索引包括以下步骤: 1. **打开...
- **优化索引**:定期执行索引优化(`IndexWriter.optimize()`)可以合并较小的段,提高搜索效率,但需要注意这是一项耗时操作,应谨慎使用。 - **恢复机制**:应建立备份策略,以防数据丢失或系统故障。Lucene提供...
- 如果发现`indexmerge`命令执行后的问题未能解决,可以尝试使用`MergeLuceneIndex`工具来强制合并索引文件: ``` java org.apache.lucene.index.MergeLuceneIndex [索引目录] [输出目录] ``` - 执行该命令后,...
在创建索引时,需要实例化IndexWriter对象,并指定索引目录、Analyzer、合并策略等参数。合并策略影响着索引的更新和优化,例如MergePolicy决定何时合并段。 2.2 添加Document Document是索引的基本单元,由一系列...
lucene 建索引的基本实例 Lucene 是一个高性能的、基于 Java 的全文搜索引擎,广泛应用于搜索引擎、文档管理系统、... Index 包含了索引的读写类,例如对索引文件的 Segment 进行写、合并、优化的 IndexWriter 等。
IndexWriter负责管理写入过程,包括合并段(Segment)以优化空间和性能。 5. 关闭资源:完成索引后,记得关闭IndexWriter,释放资源。 三、Lucene搜索步骤 1. 打开索引:使用Directory对象和IndexReader打开已...
lucene索引入门 Lucene 是一个基于 Java 的全文搜索引擎库,提供了一个简单、灵活、可扩展的搜索解决...对于大批量的数据索引,还可以通过调整 IndexerWrite 的文件合并频率属性(mergeFactor)来提高批量索引性能。
- **优化**:定期合并小段以提高搜索效率,可以使用IndexWriter的optimize方法。 总的来说,通过使用Lucene,开发者可以构建一个能够快速查找本地文件系统中多个目录内文件的搜索引擎,结合IKAnalyzer等工具,还能...
- 最后,关闭 `IndexWriter` 来完成索引的写入。 3. **搜索索引** - 搜索阶段,通常有一个名为 `Searcher` 的类,它负责执行查询并返回结果。在这个示例中,可能会用到 `IndexReader` 和 `IndexSearcher`。 - ...
在实际应用中,为了提高性能,通常会定期进行索引合并,以减少segment的数量,同时清除已删除的文档。这个过程由`IndexWriter`类管理,通过调用`commit()`方法完成。 总的来说,Lucene通过精心设计的索引结构和高效...
- IndexWriter:对索引文件的segment进行写入、合并和优化操作,负责索引的构建和更新。 - IndexReader:读取和删除索引文件中的文档,理解文档的组织形式,而非仅用于读取。 4. **QueryParser**: - 解析查询...
为了实现多线程并行处理,我们可以使用`IndexWriterConfig`的`setMergedSegmentWarmer`方法来设置一个合并监听器,这样在合并段时,我们可以执行自定义的任务,比如启动新的`IndexWriter`实例进行更多的索引操作。...
IndexWriter 在构建索引时需要一个Analyzer,因为Analyzer负责将文本分解为索引时使用的标记。 Analyzer在Lucene中扮演着重要的角色,它用于文本的预处理。它将文本拆分成独立的标记,过滤掉不需要索引的词,比如...
同时,为了提高搜索速度,还可以进行合并索引(Merge Indexes)操作。 5. **搜索服务**:当用户输入查询请求时,使用`IndexSearcher`进行搜索。查询结果基于查询分析器和评分算法,返回最相关的结果。 6. **结果...
- **合并段(Merge Segments)**: `IndexWriter`会在索引中创建多个段,定期合并小段可以提高搜索效率。 - **缓存(Cache)**: 使用`BitSet`缓存和`FilterCache`可以加快查询速度,特别是对于经常查询的过滤条件。...