`
Mr_Tank_
  • 浏览: 22553 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

【Lucene】近实时搜索

 
阅读更多

近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交;这是2.9版本之后推出的新功能。

代码示例(本例参考《Lucene In Action》):

package com.tan.code;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.SimpleFSDirectory;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class NearRealTimeTest {

	public static final String INDEX_DIR_PATH = "E:\\indexDir";

	private Analyzer analyzer = null;

	private File indexFile = null;

	private Directory directory = null;

	private IndexReader indexReader = null;

	private IndexSearcher indexSearcher = null;
	private IndexWriter indexWriter = null;

	public void nearRealTime() throws IOException {

		analyzer = new IKAnalyzer(true);
		indexFile = new File(INDEX_DIR_PATH);
		directory = new SimpleFSDirectory(indexFile);

		indexWriter = new IndexWriter(directory, new IndexWriterConfig(
				Version.LUCENE_43, analyzer));
		for (int i = 0; i < 10; i++) {
			Document document = new Document();
			document.add(new StringField("id", "id" + i, Store.YES));
			document.add(new TextField("name", "my name is tank" + i, Store.YES));
			document.add(new TextField("content", "content" + i, Store.YES));
			indexWriter.addDocument(document);
		}

		// indexReader = DirectoryReader.open(directory);

		// 3.x 旧版本中使用indexWriter.getReader()创建近实时reader,本示例代码使用的是4.3.1版本

		indexReader = DirectoryReader.open(indexWriter, true);
		indexSearcher = new IndexSearcher(indexReader);

		Query query = new TermQuery(new Term("name", "name"));
		TopDocs topDocs = indexSearcher.search(query, 100);
		System.out.println("命中数:" + topDocs.totalHits);

		/*
		 * 建立索引变更,但是不提交
		 */
		Query q = new TermQuery(new Term("id", "id1"));
		indexWriter.deleteDocuments(q);// 根据id删除一个文档

		// 再添加10个
		for (int i = 10; i < 20; i++) {
			Document document = new Document();
			document.add(new StringField("id", "id" + i, Store.YES));
			document.add(new TextField("name", "my name is tank" + i, Store.YES));
			document.add(new TextField("content", "content" + i, Store.YES));
			indexWriter.addDocument(document);
		}
		//

		// reader.reopen();
		// 读入新增加的增量索引内容,满足实时索引需求
		//
		IndexReader newReader = DirectoryReader.openIfChanged(
				(DirectoryReader) indexReader, indexWriter, true);

		indexReader.close();

		Query query2 = new TermQuery(new Term("name", "name"));
		indexSearcher = new IndexSearcher(newReader);

		TopDocs topDocs2 = indexSearcher.search(query2, 100);
		System.out.println("命中数:" + topDocs2.totalHits);

		newReader.close();
		indexWriter.close();
	}
}

测试代码:

package com.tan.test;

import static org.junit.Assert.*;

import java.io.IOException;

import org.junit.Test;

import com.tan.code.NearRealTimeTest;

public class MyTest {

	@Test
	public void test() throws IOException {
		//fail("Not yet implemented");
		NearRealTimeTest nearRealTimeTest=new NearRealTimeTest();
		nearRealTimeTest.nearRealTime();
	}

}

测试结果(建议使用Luke查看索引结果):


【推荐博客:http://qindongliang1922.iteye.com/category/282568

分享到:
评论

相关推荐

    lucene近实时搜索

    lucene 近实时搜索 很清楚的解释了关于lucene近实时搜索的代码。很值得学习

    lucene5+zoie实现近实时索引

    《Lucene 5 + Zoie 实现近实时索引详解》 在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,...

    lucene3.6 搜索例子

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

    lucene开发WEB搜索引擎

    - 实现近实时搜索,让索引更新更快地反映在搜索结果中。 - 考虑使用多线程或分布式索引和搜索,以支持大规模数据和高并发访问。 总结,利用LUCENE.NET开发WEB搜索引擎是一项技术含量高的工作,涉及到数据爬取、文本...

    lucene实现企业搜索实例

    Lucene还提供了许多高级功能,如近实时搜索(NRT)、多字段搜索、模糊查询、短语查询、通配符查询、正向索引、倒排索引等。同时,Lucene支持分布式搜索,通过Solr或Elasticsearch等工具,可以构建大规模的企业级搜索...

    近实时搜索SearcherManager

    本文将详细探讨近实时搜索的原理以及如何使用SearcherManager和NRTManager来实现在Lucene中的应用。 近实时搜索的基本思想是通过快速地刷新索引,使得新添加或者更新的数据能够尽快被搜索到。在传统的全文搜索引擎...

    lucene 实现类似百度搜索

    3. **近实时搜索(Near Realtime Search)**:利用 NRT(Near Realtime)机制,更新索引后无需重启服务即可搜索到新内容。 4. **并发控制**:多线程环境下,合理使用 Locks 或 LockFree 机制保证数据一致性。 通过...

    lucene 搜索中文PDF文档

    2) 实施近实时搜索,利用Lucene的段合并机制;3) 对索引进行定期优化,以减少碎片;4) 根据需求选择合适的评分算法,如TF-IDF或BM25。 最后,应对中文搜索的挑战,比如歧义、同音词和多音字,可能需要引入更复杂的...

    基于Lucene的搜索引擎

    2. **实时性**:财经信息更新迅速,搜索引擎需要支持实时或近实时的索引和搜索,以提供最新的市场数据。 3. **结构化数据处理**:除了纯文本内容,财经类信息可能涉及结构化的数据,如公司财务报表。Lucene可以结合...

    lucene 站内搜索示例

    - 使用近实时搜索(NRT):通过 `NRTManager` 实现索引更新无需等待完整重建。 - 实现缓存机制:对热门查询结果进行缓存,减少重复计算。 - 提供拼写纠错功能:利用 `SpellChecker` 类自动修正用户的拼写错误。 - ...

    Lucene搜索引擎 JSP + JAVA

    - **近实时搜索**: Lucene支持近乎实时的搜索,即使在索引更新后,搜索结果也能快速反映变化。 综上所述,"Lucene搜索引擎 JSP + JAVA"项目展示了如何结合这三个强大的技术,构建一个高效、灵活的全文搜索引擎。...

    全文搜索-Lucene

    4. **近实时搜索**:索引更新后,新的文档可以几乎立即被搜索到。 5. **复杂查询**:支持布尔运算、短语查询、前缀查询、模糊查询等多种查询语法。 6. **定制化**:开发者可以通过自定义分词器、过滤器、查询解析...

    lucene in action源码

    10. **实时搜索**:Lucene允许动态添加、删除和更新文档,实现近实时的搜索体验。 11. **扩展性**:Lucene可以与其他项目结合,如Solr和Elasticsearch,以构建大型的分布式搜索解决方案。 12. **LuceneInAction...

    lucene

    1. 近实时搜索(Near Real-Time Search):Lucene引入了Segment和Merge策略,能够在添加新文档后几乎立即反映到搜索结果中。 2. 分布式搜索(Distributed Search):通过Solr或Elasticsearch等工具,Lucene可以扩展...

    Lucene3.5源码jar包

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

    搜索引擎Lucene+Heritrix(第二版)4

    5. **高级话题**:书中可能涵盖了高级主题,如查询优化、评分函数的定制、多字段搜索、分布式搜索、实时索引更新、近实时搜索以及性能调优等。此外,还可能涉及如何使用Lucene进行垂直搜索、自定义分析器和过滤器的...

    解密搜索引擎技术实战 LUCENE & JAVA(第3版)PDF

    此外,还会涉及高级主题,如分布式搜索、近实时搜索、搜索结果的相关性和排序。 书中还涵盖了实际项目开发中可能遇到的问题和解决方案,例如如何提高搜索速度、如何处理海量数据、如何优化查询性能等。这些实战经验...

    lucene4.6例子

    《深入理解Lucene 4.6:索引构建、查询执行与近实时搜索》 Lucene是一个开源全文搜索引擎库,广泛应用于各种信息检索系统。在本文中,我们将深入探讨Lucene 4.6版本,包括如何创建索引、执行查询以及实现近实时搜索...

    lucene in action 2nd edition, lucene in action 第二版 PDF

    5. **高级主题**:书中涵盖了高级话题,如近实时搜索、分布式搜索(通过Solr实现)、复杂查询结构、拼音支持、自动补全和拼音搜索、地理位置搜索等。 6. **实战案例**:提供了丰富的实际应用场景,如搜索引擎的构建...

    基于Lucene的Web搜索引擎的研究

    3. 近实时搜索:利用Lucene的近实时搜索特性,可以实现索引更新后的快速查询反馈。 4. 查询优化:对查询语句进行分析,使用更高效的查询结构,如短语查询、前缀查询等。 5. 结果排序:结合多种因素(如TF-IDF、...

Global site tag (gtag.js) - Google Analytics