`
mozhenghua
  • 浏览: 323245 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

lucene NRT实时索引学习

 
阅读更多

     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操作,结果可能不会显示出来,要稍微等待一点时间就能查询到最新结果了(也许是十几毫秒吧),这点和数据库操作有点不一样,不过总的来说也非常好用了。

 

分享到:
评论

相关推荐

    Lucene.NET全文索引搜索Demo项目

    5. **性能优化**:Lucene.NET提供了批量索引、缓存、内存管理等机制来提高性能,例如使用NRT(Near-Real-Time)搜索可以在不影响搜索速度的情况下实现近乎实时的索引更新。 6. **多语言支持**:除了使用...

    Lucene 实时搜索视频详解

    3. **Near Realtime Search (NRT)**:通过使用 NRT 管理器,开发者可以在保持高搜索性能的同时,实现近乎实时的搜索。这通常涉及打开一个旧的读取器(Reader),同时使用 IndexWriter 更新索引,然后在适当的时候...

    实时建立索引的架构

    在IT行业中,实时建立索引的架构是一种关键的技术,特别是在大数据和搜索引擎领域。这个主题涉及到如何高效、实时地...mylucene-web可能是实现这种架构的一个实例,可以进一步研究其源码来深入学习实时索引的具体实现。

    lucene学习-02

    - **近实时搜索**:Lucene引入NRT(Near Real Time)机制,使得索引更新后几乎立即生效。 - **Lucene扩展**:如Elasticsearch、Solr等基于Lucene的框架,提供更高级的功能和服务,如集群管理、REST API和更多配置...

    lucene全文索引

    - **近实时搜索(NRT)**: IndexWriter允许在不关闭的情况下对索引进行小范围更新。 通过深入理解Lucene的工作原理和使用方法,开发者能够构建出高效、灵活的全文搜索引擎,满足各种复杂的搜索需求。这个“lucene全文...

    Lucene3.5源码jar包

    7. **近实时搜索(NRT)**:从3.0版本开始,Lucene引入了NRT机制,允许在不完全刷新索引的情况下返回最新结果。`IndexWriter.addDocument()`和`IndexWriter.commit()`等方法体现了这一特性。 8. **多字段搜索**:...

    lucene4.10.3

    Lucene实现了NRT(Near Real Time)搜索,新添加或更新的文档可以快速被搜索到,提高了系统的响应速度。 4.3 高级查询构造 Lucene提供复杂的查询构造能力,如自定义评分函数、布尔运算、短语匹配等,4.10.3版可能对...

    lucene对数据库操作

    6. **实时更新**:为了保持索引与数据库同步,可以设置监听器监听数据库变更,一旦有新的插入、更新或删除,就重新索引相关记录。 7. **性能优化**:为了提高效率,可以使用NRT(Near Real Time)索引策略,允许在...

    Lucene学习工具包.zip

    同时,可以研究如何使用缓存、近实时搜索(NRT)和分布式搜索(如Solr或Elasticsearch)。 ### 学习资源 压缩包中的"02.参考资料"可能包含了以下内容: - Lucene官方文档:详尽的技术指南和API参考。 - 示例代码...

    lucene部分案例的源代码

    - 近实时搜索:利用NRT(Near Real Time)机制,实现快速索引并立即生效的搜索。 - 高亮显示:搜索结果中高亮显示匹配的关键词,提高用户体验。 三、总结 通过对这些案例的源代码分析,我们可以深入理解Lucene的...

    lucene-4.7.0官方文档

    6. **高级特性**:如多字段搜索、高亮显示搜索结果、地理位置搜索、近实时搜索(NRT,Near Real Time)等,这些在4.7.0版本中都有详细的介绍。 7. **API详解**:文档涵盖了Lucene的主要类和接口,如IndexWriter用于...

    lucene实例

    通过这个"lucene实例",你可以学习如何配置和使用Lucene,理解其核心机制,并将其应用于实际项目中。如果你对压缩包内的文件进行解压并运行,你将看到具体的操作步骤和示例代码,帮助你更好地理解和掌握Lucene。

    lucene3.6 搜索例子

    3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新修改。 五、总结 Lucene 3.6作为一款强大的全文搜索库,提供了完整的搜索解决方案,包括高效的索引构建、灵活的查询语法和...

    Lucene.In.Action.2nd.Edition

    8. **实时搜索**:探讨如何在不断变化的数据中实现即时搜索,例如使用近实时搜索(NRT)模式。 9. **多核心和分布式搜索**:了解如何在多台机器上部署Lucene以构建大规模的分布式搜索系统,例如通过Solr或Elastic...

    lucene5.0源码包

    - **近实时搜索(Near Real-Time Search)**:5.0引入了NRT(Near Real-Time)搜索,使得索引更新后的结果几乎立即可见,极大地提升了系统的响应速度。 - **多字段排序(Multi-field Sorting)**:允许根据多个...

    lucene 3.5 官网 源代码

    Lucene 3.5提供了多种优化策略,如近实时搜索(NRT)、段合并(Merge Policy)以及缓存机制。同时,用户可以根据需求扩展Lucene,创建自定义分析器、查询解析器或者搜索策略。 四、实际应用 Lucene 3.5广泛应用于...

    Lucene全文检索案例

    **Lucene 全文检索案例** ...然而,实际应用中可能还需要考虑诸如多线程安全性、分布式搜索、近实时搜索(NRT)等高级特性。持续学习和实践,你将能更好地掌握Lucene的精髓,实现高效、精准的全文检索解决方案。

    lucene站内搜索

    1. **性能优化**: 使用多线程并行索引,或者利用NRT(Near Real Time)特性,实现更快的增量索引。 2. **查询优化**: 使用过滤器(Filter)、布尔查询(BooleanQuery)和短语查询(PhraseQuery)等提高查询效率。 ...

    lucene3.6源码

    自3.1版起,Lucene引入了NRT特性,允许在不关闭索引的情况下进行搜索,这在`lucene-3.6.1`中也有所体现。`IndexReader`和`IndexWriter`的交互机制是实现NRT的关键。 7. **多段索引与合并** `MergePolicy`和`...

    lucene 基础及代码分析

    4. **实时性与持久性**:Lucene 支持实时索引,新增或删除文档后立即可见,同时通过 SegmentReader 和 NRT Manager 确保数据持久化。 ### 四、学习资源 提供的资源包括基础教程和原理及代码分析,可以帮助读者从...

Global site tag (gtag.js) - Google Analytics