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的评分公式由多个因子组成,加权因子是其中的一个。
分享到:
相关推荐
**Lucene文档笔记详解** Lucene,源自Apache软件基金会4 Jakarta项目组,是一个备受开发者青睐的开源全文检索引擎工具包。它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的...
在Lucene中,权重设置是优化搜索结果的关键因素,它直接影响到文档的排序和相关性。权重主要体现在以下几个方面: 1. **文档权重(Document Boost)**:在Lucene中,可以通过`Document.SetBoost(float boost)`方法...
本篇文章将深入探讨Lucene的高级应用,结合提供的两个文档《lucene的优化2.doc》和《lucene的优化1.doc》,我们将探讨Lucene的索引优化、查询优化以及一些高级特性的应用。 一、索引优化 1. 多字段索引:Lucene...
例如,下面的代码演示如何使用 Lucene.Net 对文档进行索引: ```csharp private void Index() { IndexWriter writer = new IndexWriter(directory, analyzer, true); writer.maxFieldLength = 1000; for (int i ...
接着,书中详细阐述了如何利用Lucene建立索引,包括创建索引、更新索引和删除索引的过程。这部分内容会涵盖到Document、Field、Analyzer等核心类的使用,以及如何优化索引性能,例如使用多线程并行索引和优化存储...
- 删除索引库中的索引文档 - 更新索引库中的索引文档 - 索引的合并 - 索引的定时更新 - 索引的备份和恢复 - 修复索引 **6.3 读写并发控制** - **并发控制机制:** 确保多个用户同时访问时索引库的一致性和...
Lucene默认使用TF-IDF算法来计算评分,但也可以自定义Scorer实现更复杂的评分策略,如BM25或相关性加权。 此外,章节还可能包含多字段搜索,即在多个字段中同时进行搜索。这可以通过创建多字段分析器或者使用...
此外,Lucene提供了一些工具,如Luke,它是一个强大的Lucene索引浏览器,可以帮助我们观察评分细节,包括每个文档的字段、TF-IDF值等。通过这些工具,我们可以直观地看到评分结果,并进行调整优化。 总之,Lucene5...
5. **长度因子**:基于索引词汇在文档域中的总体长度,文档中实际索引项的占比越大,长度因子值越高。 **Lucene 相关排序操作** Lucene的排序流程包括以下关键步骤和类: 1. **Query 类**:是检索结果评分的中心...
2. **索引文档**:将Clojure映射转换为Lucene文档,指定每个字段的类型和分析器。 3. **查询索引**:构建查询对象,执行查询并获取匹配的文档。 4. **更新和删除文档**:通过文档ID来更新或删除已索引的文档。 5. **...
TF-IDF是一种常用的加权策略,它结合了关键词在文档中的出现次数和在整个文集中出现的稀有程度,用于评估关键词的重要性。 最后,"IndexerDemo"可能会包含索引的保存和加载功能,以便持久化数据并供后续使用。这...
BM25的核心思想是,对于每个查询词`qi`,计算它在文档`d`中的相关性得分,然后将这些得分加权求和得到整个查询`Q`与文档`d`的相关性。相关性得分的计算公式可以表示为: \[ \text{score}(Q, d) = \sum_{qi \in Q}...
9. **索引构建与查询执行**: 在实现BM25时,需要构建倒排索引,将每个词对应的所有文档位置记录下来。查询执行阶段,系统会计算查询中每个词在每个文档中的BM25得分,然后综合所有词的得分给出最终的文档排名。 10....
总结来说,使用Java实现TFIDF进行文本聚类,涉及到文本预处理、TF-IDF值计算、构建倒排索引、选择合适的聚类算法及优化策略等多个步骤。理解并熟练掌握这些步骤,对于处理大规模文本数据和挖掘隐藏信息具有重要意义...
本文档是一个关于如何应用Apache Solr的企业教程,涵盖了安装配置、应用模式、定制索引和搜索服务、性能调优以及故障排查等多个方面。 首先,文档介绍了Solr的基本概念和特性,强调了Solr对Lucene的扩展以及支持的...
该算法的主要思想是将查询语句分解成多个语素,然后计算每个语素与文档之间的相关性得分,最后将所有语素的相关性得分进行加权求和,以获取查询语句与文档之间的总体相关性得分。 BM25 算法的核心公式如下: 其中...