lucene-索引文档的删除、更新及增强加权
1、删除
1)使用IndexReader类实现,这个类并没有立即从索引中删除文档,而只是在这些文档上加一个删除标记,直到IndexReader调用close()后才真正将它们删除。
2)
maxDoc()返回下一个可得到的文档的内部编号。
numDocs()返回索引中的文档数量。
文档编号从0开始
3)
public class DocumentDeleteTest extendsBaseIndexingTestCase{
public voidtestDeleteBeforeIndexMerge() throws IOException{
IndexReader reader=IndexReader.open(dir);
assertEquals(2,reader.maxDoc());//下一个Document对象的编号是2
assertEquals(2,reader.numDocs());//索引了2个文档
reader.delete(1);//删除ID为1的文档
assertTrue(reader.isDeleted(1));//文档已经被删除
assertTrue(reader.hasDeletions());//索引包含被删掉的部分
assertEquals(2,reader.maxDoc()); //一个文档被索引,下个文档编号为2
assertEquals(1,reader.numDocs());//一个文档被索引,下个文档编号为2
reader.close();
reader=IndexReader.open(dir);
assertEquals(2,reader.maxDoc());
assertEquals(1,reader.numDocs());
reader.close();
}
public voidtestDeleteAfterIndexMerge() throws IOException{
IndexReader reader=IndexReader.open(dir);
assertEquals(2,reader.maxDoc());//maxDoc不能立即发现文档被删除,而numDocs可以
assertEquals(2,reader.numDocs());
reader.delete(1);
reader.close();
IndexWriter writer=new IndexWriter(dir,getAnalyzer(),false);
writer.optimize();//优化索引
writer.close();
reader=IndexReader.open(dir);
assertFalse(reader.isDeleted(1));//用于检查一个特定编号的文档的状态
assertFalse(reader.hasDeletions());//检查一个索引是否包含了带有删除标记的文档
assertEquals(1,reader.maxDoc());
assertEquals(1,reader.numDocs());
reader.close();
}
}
4)除了可以按照我们刚刚介绍的方法通过指定文档的编号删除单个文档以外,还可以用IndexReader的delete(Term)方法删除多个文档。
当需要删除city域中包含了单词xyz的所有文档时,可这样编写程序:
IndexReader reader=IndexReader.open(dir);
reader.delete(new Term("city","xyz"));
reader.close();
要格外小心,原因是如果索引中的所有文档包含了指定项,这个操作将会删除整个索引。
2、恢复被删除的文档
可通过调用undelete()方法移除索引目录中的.del文件来恢复被删除的文件。关闭IndexReader实例,这样就保留了索引中所有标记为删除的文档。如果用IndexReader实例标记了删除文档,那么只有调用同一个IndexReader实例的undeleteAll()方法,才能在最初的位置恢复各个被标记为删除的文档。
3、更新索引中的文档
首先我们从索引中移除在city域中包含"xyz"的所有文档,然后增加一个新的文档,这个文档域与删除的文档域名是相同的,只是值不同。通过先删除再完成更新。
4、增加和加权
1)Document文档和Field域的对象并不是同等地被创建的,需要对文档进行加权处理,默认情况下,它们的加权因子为1。0
2)通过setBoost(float)设置加权因子
3)lucene的搜索结果是根据文档对象和查询的匹配相关度来排序的,每个匹配的文档对象都会有个评分。
4)lucene的评分公式由多个因子组成,加权因子是其中的一个。