lucene高级版本中添加了对实时索引查询的功能,因为在真实的应用场景中经常会对IndexWriter做写,更新或者删除操作之后马上去做查询操作,之前较低的版本中必要执行commit操作后将索引都写到磁盘之后才能从IndexSearcher 对象上的查询才能更新,老方式比较耗时。
实例代码如下:
public class LuceneNrtTest extends TestCase {
public static Analyzer analyzer;
static {
analyzer = new StandardAnalyzer(Version.LUCENE_31);
}
public void testNearRealTime() throws Exception {
Directory dir = new RAMDirectory();
IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_31,
analyzer);
iwc.setOpenMode(OpenMode.CREATE_OR_APPEND);
IndexWriter writer = new IndexWriter(dir, iwc);
for (int i = 0; i < 10; i++) {
Document doc = new Document();
doc.add(new Field("id", "" + i, Field.Store.NO,
Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field("text", "aaa", Field.Store.NO,
Field.Index.ANALYZED));
writer.addDocument(doc);
}
// 测试是否能查询到刚刚插入的数据
IndexReader reader = IndexReader.open(writer, false);
IndexSearcher searcher = new IndexSearcher(reader);
Query query = new TermQuery(new Term("text", "aaa"));
TopDocs docs = searcher.search(query, 1);
assertEquals(10, docs.totalHits);
// 测试是否能删除一条数据
writer.deleteDocuments(new Term("id", "7"));
// 再加一条
Document doc = new Document();
doc.add(new Field("id", "11", Field.Store.NO,
Field.Index.NOT_ANALYZED_NO_NORMS));
doc.add(new Field("text", "bbb", Field.Store.NO, Field.Index.ANALYZED));
writer.addDocument(doc);
IndexReader newReader = IndexReader.open(writer, true);
assertFalse(reader == newReader);
reader.close();
searcher = new IndexSearcher(newReader);
TopDocs hits = searcher.search(query, 10);
assertEquals(9, hits.totalHits);
query = new TermQuery(new Term("text", "bbb"));
hits = searcher.search(query, 1);
assertEquals(1, hits.totalHits);
newReader.close();
writer.close();
}
}
代码所依赖的lucene版本是:
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-core</artifactId>
<version>3.5.0</version>
</dependency>
有一点要说明的是这里所说的实时索引,并不等同于正的实时索引,只不过接近实时索引,可能更新完条数据,马上去执行search操作,结果可能不会显示出来,要稍微等待一点时间就能查询到最新结果了(也许是十几毫秒吧),这点和数据库操作有点不一样,不过总的来说也非常好用了。
分享到:
相关推荐
5. **性能优化**:Lucene.NET提供了批量索引、缓存、内存管理等机制来提高性能,例如使用NRT(Near-Real-Time)搜索可以在不影响搜索速度的情况下实现近乎实时的索引更新。 6. **多语言支持**:除了使用...
3. **Near Realtime Search (NRT)**:通过使用 NRT 管理器,开发者可以在保持高搜索性能的同时,实现近乎实时的搜索。这通常涉及打开一个旧的读取器(Reader),同时使用 IndexWriter 更新索引,然后在适当的时候...
在IT行业中,实时建立索引的架构是一种关键的技术,特别是在大数据和搜索引擎领域。这个主题涉及到如何高效、实时地...mylucene-web可能是实现这种架构的一个实例,可以进一步研究其源码来深入学习实时索引的具体实现。
- **近实时搜索**:Lucene引入NRT(Near Real Time)机制,使得索引更新后几乎立即生效。 - **Lucene扩展**:如Elasticsearch、Solr等基于Lucene的框架,提供更高级的功能和服务,如集群管理、REST API和更多配置...
- **近实时搜索(NRT)**: IndexWriter允许在不关闭的情况下对索引进行小范围更新。 通过深入理解Lucene的工作原理和使用方法,开发者能够构建出高效、灵活的全文搜索引擎,满足各种复杂的搜索需求。这个“lucene全文...
7. **近实时搜索(NRT)**:从3.0版本开始,Lucene引入了NRT机制,允许在不完全刷新索引的情况下返回最新结果。`IndexWriter.addDocument()`和`IndexWriter.commit()`等方法体现了这一特性。 8. **多字段搜索**:...
Lucene实现了NRT(Near Real Time)搜索,新添加或更新的文档可以快速被搜索到,提高了系统的响应速度。 4.3 高级查询构造 Lucene提供复杂的查询构造能力,如自定义评分函数、布尔运算、短语匹配等,4.10.3版可能对...
6. **实时更新**:为了保持索引与数据库同步,可以设置监听器监听数据库变更,一旦有新的插入、更新或删除,就重新索引相关记录。 7. **性能优化**:为了提高效率,可以使用NRT(Near Real Time)索引策略,允许在...
同时,可以研究如何使用缓存、近实时搜索(NRT)和分布式搜索(如Solr或Elasticsearch)。 ### 学习资源 压缩包中的"02.参考资料"可能包含了以下内容: - Lucene官方文档:详尽的技术指南和API参考。 - 示例代码...
- 近实时搜索:利用NRT(Near Real Time)机制,实现快速索引并立即生效的搜索。 - 高亮显示:搜索结果中高亮显示匹配的关键词,提高用户体验。 三、总结 通过对这些案例的源代码分析,我们可以深入理解Lucene的...
6. **高级特性**:如多字段搜索、高亮显示搜索结果、地理位置搜索、近实时搜索(NRT,Near Real Time)等,这些在4.7.0版本中都有详细的介绍。 7. **API详解**:文档涵盖了Lucene的主要类和接口,如IndexWriter用于...
通过这个"lucene实例",你可以学习如何配置和使用Lucene,理解其核心机制,并将其应用于实际项目中。如果你对压缩包内的文件进行解压并运行,你将看到具体的操作步骤和示例代码,帮助你更好地理解和掌握Lucene。
3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新修改。 五、总结 Lucene 3.6作为一款强大的全文搜索库,提供了完整的搜索解决方案,包括高效的索引构建、灵活的查询语法和...
8. **实时搜索**:探讨如何在不断变化的数据中实现即时搜索,例如使用近实时搜索(NRT)模式。 9. **多核心和分布式搜索**:了解如何在多台机器上部署Lucene以构建大规模的分布式搜索系统,例如通过Solr或Elastic...
- **近实时搜索(Near Real-Time Search)**:5.0引入了NRT(Near Real-Time)搜索,使得索引更新后的结果几乎立即可见,极大地提升了系统的响应速度。 - **多字段排序(Multi-field Sorting)**:允许根据多个...
Lucene 3.5提供了多种优化策略,如近实时搜索(NRT)、段合并(Merge Policy)以及缓存机制。同时,用户可以根据需求扩展Lucene,创建自定义分析器、查询解析器或者搜索策略。 四、实际应用 Lucene 3.5广泛应用于...
**Lucene 全文检索案例** ...然而,实际应用中可能还需要考虑诸如多线程安全性、分布式搜索、近实时搜索(NRT)等高级特性。持续学习和实践,你将能更好地掌握Lucene的精髓,实现高效、精准的全文检索解决方案。
1. **性能优化**: 使用多线程并行索引,或者利用NRT(Near Real Time)特性,实现更快的增量索引。 2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询(PhraseQuery)等提高查询效率。 ...
自3.1版起,Lucene引入了NRT特性,允许在不关闭索引的情况下进行搜索,这在`lucene-3.6.1`中也有所体现。`IndexReader`和`IndexWriter`的交互机制是实现NRT的关键。 7. **多段索引与合并** `MergePolicy`和`...
4. **实时性与持久性**:Lucene 支持实时索引,新增或删除文档后立即可见,同时通过 SegmentReader 和 NRT Manager 确保数据持久化。 ### 四、学习资源 提供的资源包括基础教程和原理及代码分析,可以帮助读者从...