`
deepfuture
  • 浏览: 4400521 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:80078
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:70048
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:103358
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:285816
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:15014
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:67566
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:32153
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45991
社区版块
存档分类
最新评论

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的评分公式由多个因子组成,加权因子是其中的一个。

分享到:
评论
1 楼 showtimes52007 2012-12-12  
看过这篇文章之后:http://www.sujunqiang.com/archives/149.html,对楼主所说的"当IndexReader执行了close方法之后才真正的删除"产生了一点疑问,求解?

相关推荐

    lucene文档笔记详解

    **Lucene文档笔记详解** Lucene,源自Apache软件基金会4 Jakarta项目组,是一个备受开发者青睐的开源全文检索引擎工具包。它提供了强大的文本分析、索引构建和搜索功能,但值得注意的是,Lucene本身并不包含完整的...

    lucene 权重设置

    在Lucene中,权重设置是优化搜索结果的关键因素,它直接影响到文档的排序和相关性。权重主要体现在以下几个方面: 1. **文档权重(Document Boost)**:在Lucene中,可以通过`Document.SetBoost(float boost)`方法...

    lucene高级应用

    本篇文章将深入探讨Lucene的高级应用,结合提供的两个文档《lucene的优化2.doc》和《lucene的优化1.doc》,我们将探讨Lucene的索引优化、查询优化以及一些高级特性的应用。 一、索引优化 1. 多字段索引:Lucene...

    lucene排序、设置权重、优化、分布式搜索.pdf

    例如,下面的代码演示如何使用 Lucene.Net 对文档进行索引: ```csharp private void Index() { IndexWriter writer = new IndexWriter(directory, analyzer, true); writer.maxFieldLength = 1000; for (int i ...

    lucene in Action

    接着,书中详细阐述了如何利用Lucene建立索引,包括创建索引、更新索引和删除索引的过程。这部分内容会涵盖到Document、Field、Analyzer等核心类的使用,以及如何优化索引性能,例如使用多线程并行索引和优化存储...

    自己动手写网络爬虫(基本全)

    - 删除索引库中的索引文档 - 更新索引库中的索引文档 - 索引的合并 - 索引的定时更新 - 索引的备份和恢复 - 修复索引 **6.3 读写并发控制** - **并发控制机制:** 确保多个用户同时访问时索引库的一致性和...

    Lucene In Action ch 5 笔记 --高级搜索技术

    Lucene默认使用TF-IDF算法来计算评分,但也可以自定义Scorer实现更复杂的评分策略,如BM25或相关性加权。 此外,章节还可能包含多字段搜索,即在多个字段中同时进行搜索。这可以通过创建多字段分析器或者使用...

    Lucene5学习之评分Scoring

    此外,Lucene提供了一些工具,如Luke,它是一个强大的Lucene索引浏览器,可以帮助我们观察评分细节,包括每个文档的字段、TF-IDF值等。通过这些工具,我们可以直观地看到评分结果,并进行调整优化。 总之,Lucene5...

    Lucene0之结果排序.pdf

    5. **长度因子**:基于索引词汇在文档域中的总体长度,文档中实际索引项的占比越大,长度因子值越高。 **Lucene 相关排序操作** Lucene的排序流程包括以下关键步骤和类: 1. **Query 类**:是检索结果评分的中心...

    clucie:Lucene的Clojure

    2. **索引文档**:将Clojure映射转换为Lucene文档,指定每个字段的类型和分析器。 3. **查询索引**:构建查询对象,执行查询并获取匹配的文档。 4. **更新和删除文档**:通过文档ID来更新或删除已索引的文档。 5. **...

    开源企业搜索引擎SOLR的应用教程

    - **过程**: 一般的应用过程包括索引文档、执行查询、处理查询结果等。 ##### 2. 一个简单的例子 - **设计**: 设计索引结构,包括字段定义、数据类型等。 - **构建索引**: 使用Solr API向Solr发送文档进行索引。 - ...

    IndexerDemo:用于处理反向索引的 Java 代码

    TF-IDF是一种常用的加权策略,它结合了关键词在文档中的出现次数和在整个文集中出现的稀有程度,用于评估关键词的重要性。 最后,"IndexerDemo"可能会包含索引的保存和加载功能,以便持久化数据并供后续使用。这...

    BM25算法浅析.doc

    BM25的核心思想是,对于每个查询词`qi`,计算它在文档`d`中的相关性得分,然后将这些得分加权求和得到整个查询`Q`与文档`d`的相关性。相关性得分的计算公式可以表示为: \[ \text{score}(Q, d) = \sum_{qi \in Q}...

    JAVA版BM25排序模型

    9. **索引构建与查询执行**: 在实现BM25时,需要构建倒排索引,将每个词对应的所有文档位置记录下来。查询执行阶段,系统会计算查询中每个词在每个文档中的BM25得分,然后综合所有词的得分给出最终的文档排名。 10....

    TFIDF文本聚类

    总结来说,使用Java实现TFIDF进行文本聚类,涉及到文本预处理、TF-IDF值计算、构建倒排索引、选择合适的聚类算法及优化策略等多个步骤。理解并熟练掌握这些步骤,对于处理大规模文本数据和挖掘隐藏信息具有重要意义...

    开源企业搜索引擎SOLR的应用教程.pdf

    本文档是一个关于如何应用Apache Solr的企业教程,涵盖了安装配置、应用模式、定制索引和搜索服务、性能调优以及故障排查等多个方面。 首先,文档介绍了Solr的基本概念和特性,强调了Solr对Lucene的扩展以及支持的...

    BM25算法浅析

    该算法的主要思想是将查询语句分解成多个语素,然后计算每个语素与文档之间的相关性得分,最后将所有语素的相关性得分进行加权求和,以获取查询语句与文档之间的总体相关性得分。 BM25 算法的核心公式如下: 其中...

Global site tag (gtag.js) - Google Analytics