主要是用了线程池来实现writer的多线程
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.CorruptIndexException;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.Term;
import org.apache.lucene.store.Directory;
public class ThreadedIndexWriter extends IndexWriter {
private ExecutorService threadPool;
private Analyzer defaultAnalyzer;
private class Job implements Runnable { // 保留要加入索引的一个文档
Document doc;
Analyzer analyzer;
Term delTerm;
public Job(Document doc, Term delTerm, Analyzer analyzer) {
this.doc = doc;
this.analyzer = analyzer;
this.delTerm = delTerm;
}
public void run() { // 实际增加和更新文档
try {
if (delTerm != null) {
ThreadedIndexWriter.super.updateDocument(delTerm, doc,
analyzer);
} else {
ThreadedIndexWriter.super.addDocument(doc, analyzer);
}
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
}
}
@SuppressWarnings("deprecation")
public ThreadedIndexWriter(Directory dir, Analyzer a, boolean create,
int numThreads, int maxQueueSize, IndexWriter.MaxFieldLength mfl)
throws CorruptIndexException, IOException {
super(dir, a, create, mfl);
defaultAnalyzer = a;
threadPool = new ThreadPoolExecutor(
// 创建线程池
numThreads, numThreads, 0, TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(maxQueueSize, false),
new ThreadPoolExecutor.CallerRunsPolicy());
}
public void addDocument(Document doc) { // 让线程池增加文档
threadPool.execute(new Job(doc, null, defaultAnalyzer));
}
public void addDocument(Document doc, Analyzer a) { // 让线程池增加文档
threadPool.execute(new Job(doc, null, a));
}
public void updateDocument(Term term, Document doc) { // 让线程池更新文档
threadPool.execute(new Job(doc, term, defaultAnalyzer));
}
// 让线程池更新文档
public void updateDocument(Term term, Document doc, Analyzer a) {
threadPool.execute(new Job(doc, term, a));
}
public void close() throws CorruptIndexException, IOException {
finish();
super.close();
}
public void close(boolean doWait) throws CorruptIndexException, IOException {
finish();
super.close(doWait);
}
public void rollback() throws CorruptIndexException, IOException {
finish();
super.rollback();
}
private void finish() { // 关闭线程池
threadPool.shutdown();
while (true) {
try {
if (threadPool.awaitTermination(Long.MAX_VALUE,
TimeUnit.SECONDS)) {
break;
}
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
throw new RuntimeException(ie);
}
}
}
}
分享到:
相关推荐
本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...
《Lucene5学习之多线程创建索引》 在深入了解Lucene5的多线程索引创建之前,我们先来了解一下Lucene的基本概念。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了强大的文本分析、索引和搜索...
- 多线程支持:在大型应用中,可能需要并发创建和查询索引,Lucene支持多线程操作。 - 性能优化:如使用内存映射文件(MMapDirectory)、优化写入策略等。 - 分布式搜索:通过Solr或Elasticsearch,可以实现分布式...
- **多线程索引**:通过控制IndexWriter的并发设置,可以提高索引大量数据时的性能。 以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和...
### Lucene并行索引关键技术解析 #### 一、引言 随着互联网的快速发展,海量信息的管理和检索成为了重要的挑战。传统的单机索引方法已无法满足高效处理大规模数据的需求,尤其是在搜索引擎领域。Lucene作为一款...
**Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。...在实际应用中,还需要考虑更多的因素,如性能优化、多线程支持、错误处理等。
- **并发控制**:在多线程环境下,需要确保对索引的操作是安全的,防止数据冲突和丢失。 - **优化索引**:定期执行索引优化(`IndexWriter.optimize()`)可以合并较小的段,提高搜索效率,但需要注意这是一项耗时...
同时,它还支持多线程读取,确保了在并发环境下的安全性和效率。开发者可以使用`IndexReader`查询索引,获取匹配查询条件的文档,并进一步处理搜索结果。 **数据展示** 描述中提到的“数据以表格的形式展示”,这...
- **多线程索引与搜索**: 对于大规模数据,可以利用多线程并行处理,提升效率。 5. **分布式搜索** - **Solr和Elasticsearch**: 当索引过大时,可以使用基于Lucene的分布式搜索引擎如Solr或Elasticsearch,它们...
- 使用多线程索引:为了提高效率,可以使用多线程并行索引多个文档。 - 建立缓存:对于频繁查询的字段,可以启用字段缓存,提高查询速度。 - 查询优化:通过使用Filter、BooleanQuery等,可以对查询条件进行组合和...
6. **创建查询器**:`IndexSearcher`执行查询,传入索引读取器和是否开启多线程。 7. **执行查询**:调用`IndexSearcher.search()`方法,返回匹配的文档集合(TopDocs)。 8. **处理查询结果**:TopDocs包含匹配...
2. **性能优化**:可以通过设置批处理大小、使用多线程、利用缓存等方式优化索引和查询性能。 3. **排序与评分**:Lucene不仅可以基于相关性排序结果,还可以通过自定义函数或外部字段进行排序。 4. **过滤与高亮*...
**Lucene索引详解** Lucene是Apache软件基金会的一个开源全文搜索引擎库,它提供了一种高效、可扩展的全文检索框架。作为一个纯Java库,Lucene可以被集成到任何Java应用中,帮助开发者轻松实现搜索功能。在深入理解...
这个文件的存在表明有写操作正在进行,防止了多线程或进程同时对索引进行修改。 3. **Segment Info**:.si文件存储Segment的元数据,如段的名称、文档数量、字段信息等。在Lucene 4.0中,Segment Info格式有所变化...
描述中提到的“对SQL Server数据库表,用多线程,高速创建索引”,是指在构建Lucene.NET索引时,采用了多线程技术来提升性能。这种做法可以充分利用多核处理器的计算能力,将数据处理任务分散到多个线程中,从而加快...
7. **维护与更新**:为了保持索引与数据库的一致性,需要监听数据库的变化,如新增、修改或删除记录,及时更新Lucene索引。可以设置定时任务或触发器来实现这一过程。 在实际应用中,可能还需要考虑如错误处理、...
此外,对于性能优化,可以考虑使用多线程并行处理文档,或者利用Lucene的批量索引功能。 总结起来,通过结合Apache Lucene和POI,我们可以实现对Word文档的全文检索,使得用户可以方便地在大量Word文档中搜索特定...
- 多线程:在多核处理器上,可以使用多个线程并行构建或搜索索引,提升效率。 6. **扩展性** - Filter:可以添加 Filter 对象来进一步筛选搜索结果,例如按时间范围、地理位置等条件过滤。 - 自定义排序:通过...