近实时搜索:可以使用一个打开的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 5 + Zoie 实现近实时索引详解》 在当今大数据时代,搜索引擎技术扮演着至关重要的角色,而Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种信息检索系统。然而,传统的Lucene在处理大规模数据时,...
3. 近实时搜索:通过NRT(Near Real Time)机制,Lucene可以在短时间内反映出对索引的最新修改。 五、总结 Lucene 3.6作为一款强大的全文搜索库,提供了完整的搜索解决方案,包括高效的索引构建、灵活的查询语法和...
- 实现近实时搜索,让索引更新更快地反映在搜索结果中。 - 考虑使用多线程或分布式索引和搜索,以支持大规模数据和高并发访问。 总结,利用LUCENE.NET开发WEB搜索引擎是一项技术含量高的工作,涉及到数据爬取、文本...
Lucene还提供了许多高级功能,如近实时搜索(NRT)、多字段搜索、模糊查询、短语查询、通配符查询、正向索引、倒排索引等。同时,Lucene支持分布式搜索,通过Solr或Elasticsearch等工具,可以构建大规模的企业级搜索...
本文将详细探讨近实时搜索的原理以及如何使用SearcherManager和NRTManager来实现在Lucene中的应用。 近实时搜索的基本思想是通过快速地刷新索引,使得新添加或者更新的数据能够尽快被搜索到。在传统的全文搜索引擎...
3. **近实时搜索(Near Realtime Search)**:利用 NRT(Near Realtime)机制,更新索引后无需重启服务即可搜索到新内容。 4. **并发控制**:多线程环境下,合理使用 Locks 或 LockFree 机制保证数据一致性。 通过...
2) 实施近实时搜索,利用Lucene的段合并机制;3) 对索引进行定期优化,以减少碎片;4) 根据需求选择合适的评分算法,如TF-IDF或BM25。 最后,应对中文搜索的挑战,比如歧义、同音词和多音字,可能需要引入更复杂的...
2. **实时性**:财经信息更新迅速,搜索引擎需要支持实时或近实时的索引和搜索,以提供最新的市场数据。 3. **结构化数据处理**:除了纯文本内容,财经类信息可能涉及结构化的数据,如公司财务报表。Lucene可以结合...
- 使用近实时搜索(NRT):通过 `NRTManager` 实现索引更新无需等待完整重建。 - 实现缓存机制:对热门查询结果进行缓存,减少重复计算。 - 提供拼写纠错功能:利用 `SpellChecker` 类自动修正用户的拼写错误。 - ...
- **近实时搜索**: Lucene支持近乎实时的搜索,即使在索引更新后,搜索结果也能快速反映变化。 综上所述,"Lucene搜索引擎 JSP + JAVA"项目展示了如何结合这三个强大的技术,构建一个高效、灵活的全文搜索引擎。...
4. **近实时搜索**:索引更新后,新的文档可以几乎立即被搜索到。 5. **复杂查询**:支持布尔运算、短语查询、前缀查询、模糊查询等多种查询语法。 6. **定制化**:开发者可以通过自定义分词器、过滤器、查询解析...
10. **实时搜索**:Lucene允许动态添加、删除和更新文档,实现近实时的搜索体验。 11. **扩展性**:Lucene可以与其他项目结合,如Solr和Elasticsearch,以构建大型的分布式搜索解决方案。 12. **LuceneInAction...
1. 近实时搜索(Near Real-Time Search):Lucene引入了Segment和Merge策略,能够在添加新文档后几乎立即反映到搜索结果中。 2. 分布式搜索(Distributed Search):通过Solr或Elasticsearch等工具,Lucene可以扩展...
7. **近实时搜索(NRT)**:从3.0版本开始,Lucene引入了NRT机制,允许在不完全刷新索引的情况下返回最新结果。`IndexWriter.addDocument()`和`IndexWriter.commit()`等方法体现了这一特性。 8. **多字段搜索**:...
5. **高级话题**:书中可能涵盖了高级主题,如查询优化、评分函数的定制、多字段搜索、分布式搜索、实时索引更新、近实时搜索以及性能调优等。此外,还可能涉及如何使用Lucene进行垂直搜索、自定义分析器和过滤器的...
此外,还会涉及高级主题,如分布式搜索、近实时搜索、搜索结果的相关性和排序。 书中还涵盖了实际项目开发中可能遇到的问题和解决方案,例如如何提高搜索速度、如何处理海量数据、如何优化查询性能等。这些实战经验...
《深入理解Lucene 4.6:索引构建、查询执行与近实时搜索》 Lucene是一个开源全文搜索引擎库,广泛应用于各种信息检索系统。在本文中,我们将深入探讨Lucene 4.6版本,包括如何创建索引、执行查询以及实现近实时搜索...
5. **高级主题**:书中涵盖了高级话题,如近实时搜索、分布式搜索(通过Solr实现)、复杂查询结构、拼音支持、自动补全和拼音搜索、地理位置搜索等。 6. **实战案例**:提供了丰富的实际应用场景,如搜索引擎的构建...
3. 近实时搜索:利用Lucene的近实时搜索特性,可以实现索引更新后的快速查询反馈。 4. 查询优化:对查询语句进行分析,使用更高效的查询结构,如短语查询、前缀查询等。 5. 结果排序:结合多种因素(如TF-IDF、...