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的删除功能。