`
liyuzhel312
  • 浏览: 6145 次
社区版块
存档分类
最新评论

多线程写Lucene索引

 
阅读更多
主要是用了线程池来实现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);
			}
		}
	}
}

分享到:
评论
1 楼 carlwu 2014-05-19  
在Lucene4.0中, 更新了45-48行:

@SuppressWarnings("deprecation")
public ThreadedIndexWriter(Directory dir, Analyzer a, boolean create,
int numThreads, int maxQueueSize, IndexWriterConfig config)
throws CorruptIndexException, IOException {
super(dir, config);

要不然没法编译

相关推荐

    lucene索引优化多线程多目录创建索引

    本教程主要探讨的是如何利用Lucene进行索引优化,特别是通过多线程和处理多个目录来提高索引创建效率。 首先,我们需要理解Lucene的索引原理。Lucene将文档分解为词项(tokens),并对每个词项创建倒排索引。倒排...

    Lucene5学习之多线程创建索引

    《Lucene5学习之多线程创建索引》 在深入了解Lucene5的多线程索引创建之前,我们先来了解一下Lucene的基本概念。Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发。它提供了强大的文本分析、索引和搜索...

    Lucene索引和查询

    - 多线程支持:在大型应用中,可能需要并发创建和查询索引,Lucene支持多线程操作。 - 性能优化:如使用内存映射文件(MMapDirectory)、优化写入策略等。 - 分布式搜索:通过Solr或Elasticsearch,可以实现分布式...

    Lucene 索引的简单使用

    - **多线程索引**:通过控制IndexWriter的并发设置,可以提高索引大量数据时的性能。 以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和...

    lucene并行索引

    ### Lucene并行索引关键技术解析 #### 一、引言 随着互联网的快速发展,海量信息的管理和检索成为了重要的挑战。传统的单机索引方法已无法满足高效处理大规模数据的需求,尤其是在搜索引擎领域。Lucene作为一款...

    Lucene索引的基本操作

    **Lucene索引的基本操作** Lucene是一款由Apache软件基金会开发的全文检索库,它提供了高效、可扩展的全文检索功能。...在实际应用中,还需要考虑更多的因素,如性能优化、多线程支持、错误处理等。

    基于lucene技术的增量索引

    - **并发控制**:在多线程环境下,需要确保对索引的操作是安全的,防止数据冲突和丢失。 - **优化索引**:定期执行索引优化(`IndexWriter.optimize()`)可以合并较小的段,提高搜索效率,但需要注意这是一项耗时...

    Lucene索引数据分析器

    同时,它还支持多线程读取,确保了在并发环境下的安全性和效率。开发者可以使用`IndexReader`查询索引,获取匹配查询条件的文档,并进一步处理搜索结果。 **数据展示** 描述中提到的“数据以表格的形式展示”,这...

    LUCENE索引搜索数据库技术汇总

    - **多线程索引与搜索**: 对于大规模数据,可以利用多线程并行处理,提升效率。 5. **分布式搜索** - **Solr和Elasticsearch**: 当索引过大时,可以使用基于Lucene的分布式搜索引擎如Solr或Elasticsearch,它们...

    lucene全文检索简单索引和搜索实例

    - 使用多线程索引:为了提高效率,可以使用多线程并行索引多个文档。 - 建立缓存:对于频繁查询的字段,可以启用字段缓存,提高查询速度。 - 查询优化:通过使用Filter、BooleanQuery等,可以对查询条件进行组合和...

    lucene实现索引查询

    6. **创建查询器**:`IndexSearcher`执行查询,传入索引读取器和是否开启多线程。 7. **执行查询**:调用`IndexSearcher.search()`方法,返回匹配的文档集合(TopDocs)。 8. **处理查询结果**:TopDocs包含匹配...

    lucene索引的简单使用

    2. **性能优化**:可以通过设置批处理大小、使用多线程、利用缓存等方式优化索引和查询性能。 3. **排序与评分**:Lucene不仅可以基于相关性排序结果,还可以通过自定义函数或外部字段进行排序。 4. **过滤与高亮*...

    lucene索引

    **Lucene索引详解** Lucene是Apache软件基金会的一个开源全文搜索引擎库,它提供了一种高效、可扩展的全文检索框架。作为一个纯Java库,Lucene可以被集成到任何Java应用中,帮助开发者轻松实现搜索功能。在深入理解...

    Lucene4.X实战类baidu搜索的大型文档海量搜索系统-04.Lucene索引深入 共24页.pptx

    这个文件的存在表明有写操作正在进行,防止了多线程或进程同时对索引进行修改。 3. **Segment Info**:.si文件存储Segment的元数据,如段的名称、文档数量、字段信息等。在Lucene 4.0中,Segment Info格式有所变化...

    Lucene.net高速创建索引

    描述中提到的“对SQL Server数据库表,用多线程,高速创建索引”,是指在构建Lucene.NET索引时,采用了多线程技术来提升性能。这种做法可以充分利用多核处理器的计算能力,将数据处理任务分散到多个线程中,从而加快...

    lucene与sqlserver数据库实现索引的简单实例

    7. **维护与更新**:为了保持索引与数据库的一致性,需要监听数据库的变化,如新增、修改或删除记录,及时更新Lucene索引。可以设置定时任务或触发器来实现这一过程。 在实际应用中,可能还需要考虑如错误处理、...

    lucene 结合 poi 索引word

    此外,对于性能优化,可以考虑使用多线程并行处理文档,或者利用Lucene的批量索引功能。 总结起来,通过结合Apache Lucene和POI,我们可以实现对Word文档的全文检索,使得用户可以方便地在大量Word文档中搜索特定...

    Lucene.net建立索引,检索分页Demo

    - 多线程:在多核处理器上,可以使用多个线程并行构建或搜索索引,提升效率。 6. **扩展性** - Filter:可以添加 Filter 对象来进一步筛选搜索结果,例如按时间范围、地理位置等条件过滤。 - 自定义排序:通过...

Global site tag (gtag.js) - Google Analytics