除了IndexWriter外,IndexReader也可以用来删除文档。那么两者之间有什么区别呢?
A. IndexReader可以按文档id删除一个文档。
IndexReader用来删除文档的核心方法为:
public synchronized void deleteDocument(int docNum) throws StaleReaderException, CorruptIndexException, LockObtainFailedException, IOException {
ensureOpen();
acquireWriteLock();
hasChanges = true;
doDelete(docNum);
}
很显然,这是一个模板方法,其中acquireWriteLock默认为空实现,doDelete方法强制子类实现。
这个方法可以让你通过IndexReader方便的查出结果集,然后删掉其中的某条数据。
B. IndexReader也提供按Term删除的方法:
int deleteDocuments(Term term);
然而,此方法的实现中依然调用了deleteDocument(int docNum); 不同与IndexWriter中对应的方法,此方法可以立即返回执行结果,而IndexWriter会缓存待删除的Term,并在之后的时间里执行删除操作。
C. IndexWriter可以通过Query删除。
如同通过Term删除,其实你完全可以实现自己的Query删除方式。只需要通过Query查出结果,用deleteDocument(int docNum);一一删除。
值得注意的是,IndexReader会以“写”方式完成删除。这就意味着,在执行删除操作前,必须关闭所有在此索引上打开的IndexWriter,反之亦然。因此,频繁交替进行添加、删除操作,会使索引能力变得低下,因而要设计成批量添加或删除。通常来说,最好用IndexWriter进行删除操作,除非你确实需要通过docNum来删除文档,或者希望删除后的结果立即生效。
Lucene通过“黑名单”列出索引中删除的文档,换言之,文档仅仅是被标记成删除状态并存于数组中。这也意味着删除操作并不能释放磁盘空间,好在可以通过调用IndexWriter的expungeDeletes()方法释放这部分空间。更好的消息是,新版的Lucene已经不需要考虑这些了,而且expungeDeletes也被标记为Deprecated,应该会在4.0版本去掉。
FOR Doudou
分享到:
相关推荐
- `IndexWriter.deleteDocuments(Term term)`:用`IndexWriter`删除包含指定词的文档,删除操作会被缓存,直到下一次写入索引时才会实际生效。 - `IndexWriter.deleteDocuments(Term[] terms)`:删除包含这些词的...
5. 处理结果:遍历TopDocs的结果集,使用ScoreDoc获取文档编号,再用IndexSearcher的doc方法获取对应的Document对象。 6. 关闭资源:搜索完成后,记得关闭IndexSearcher和IndexReader。 四、优化与扩展 - 使用多...
在Lucene中,删除文档可以使用IndexReader和IndexWriter两种方式实现,每种方式都有其优缺。 首先,让我们来讨论删除文档的几种方式。在Lucene中,删除文档可以使用IndexReader和IndexWriter两种方式实现。...
- **更新和删除**:使用IndexWriter可以更新已有文档,或通过ID删除文档。 - **多线程索引**:通过控制IndexWriter的并发设置,可以提高索引大量数据时的性能。 以上就是关于“Lucene索引的简单使用”的详细介绍,...
9. **获取文档内容**:使用`IndexReader.document()`方法,传入文档编号,得到Document对象。 10. **提取查询结果**:从Document中通过Field的名称获取查询结果,如`document.get("group_id")`。 以上就是使用...
- **打开索引**:使用 IndexReader 或 DirectoryReader 访问已建立的索引。 - **构造查询**:使用 QueryParser 创建查询对象,根据用户输入的关键词。 - **执行查询**:使用 IndexSearcher 对索引执行查询,获取 ...
本实例将详细介绍如何使用Lucene进行索引创建、索引删除以及文档检索。 ### 1. Lucene 索引 Lucene 的索引过程主要包括以下几个步骤: - **创建Analyzer**: Analyzer是处理文本的关键组件,负责将输入的文本分解...
2. 创建IndexReader:使用Directory实例创建IndexReader,它是读取索引的主要接口。 3. 创建IndexSearcher:基于IndexReader创建一个IndexSearcher,它负责执行查询。 4. 构建Query:根据用户输入构建Query对象,...
7. **搜索**: 创建IndexReader和IndexSearcher,用以读取索引并执行查询。构造Query对象,例如使用TermQuery匹配特定关键词,然后使用IndexSearcher执行查询。最后,使用HitCollector或TopDocs收集结果。 8. **显示...
- 创建索引:使用Analyzer处理文档,生成Token流,然后通过IndexWriter写入索引。 - 读取索引:使用IndexReader打开已有的索引文件。 - 搜索:Searcher解析查询,执行搜索,并返回匹配的文档。 三、Lucene源码分析 ...
- 使用`addDocument`方法:通过`IndexWriter`将文档添加到索引中。 **4. 更新和删除文档** - 更新文档:Lucene不支持直接更新已存在的文档,而是通过删除旧文档并重新添加新文档的方式来实现。 - 删除文档:调用`...
- 文档操作:通过IndexReader读取文档信息,进行删除、更新等操作。 理解并熟练掌握"lucenelucene-core-3.5.0_jar"中的类和接口,是开发基于Lucene的全文搜索引擎的关键。通过深入研究其源代码和API,开发者可以...
2. Searcher.java:该类实现了搜索功能,使用 IndexReader 打开已有的索引,然后通过 QueryParser 创建查询对象,并调用 IndexSearcher 来执行查询,返回匹配的文档。 3. FilePreprocess.java:预处理文件,可能包含...
- **索引读取**:了解 Luke 是如何使用 Lucene 的 `IndexReader` 和 `Directory` 接口来访问和加载索引的。 - **字段和文档处理**:观察 Luke 如何获取和显示文档字段,以及如何解析和展示不同类型的字段值。 - **...
1. **读取旧索引**: 用IndexReader打开索引,获取需要更新的文档。 2. **删除旧文档**: 使用IndexWriter删除目标文档。 3. **创建新文档**: 更新文档内容后,创建新的Document对象。 4. **添加新文档**: 将新...
它提供了丰富的API,包括文档(Document)、字段(Field)、索引编写器(IndexWriter)、索引阅读器(IndexReader)、查询解析器(QueryParser)等类,使得开发者可以轻松地实现索引和查询功能。 在实际开发中,...
3. IndexReader:读取索引,用于搜索和获取文档信息。 4. Searcher:执行查询并返回结果,包括IndexSearcher和MultiSearcher。 5. Analyzer:文本分析器,处理分词和标准化。 6. QueryParser:解析用户查询,生成...
4. **IndexWriter**:用于创建和更新索引,处理文档添加、删除和修改操作。 5. **IndexReader**:读取已建立的索引,提供搜索功能。 6. **IndexSearcher**:执行搜索操作,返回匹配结果。 7. **QueryParser**:解析...
#### 第二章:入门实例 - **工作原理** Lucene的工作流程主要包括以下几步: 1. **文档分析**:将文档分割成一系列词汇单元(token),这一过程通常由分析器(analyzer)完成。 2. **建立索引**:为每个文档及其...
`IndexReader`提供了读取文档、获取文档数量、检查索引是否已删除文档等功能。同时,它还支持多线程读取,确保了在并发环境下的安全性和效率。开发者可以使用`IndexReader`查询索引,获取匹配查询条件的文档,并...