`
lxwt909
  • 浏览: 572237 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Lucene5学习之多索引目录查询以及多线程查询

阅读更多

     上一篇中我们使用多线程创建了索引,下面我们来试着采用不把多个索引目录里的数据合并到一个新的索引目录的方式去查询索引数据,当然你也可以合并(合并到一个索引目录查询就很简单了),其实很多情况我们都是不合并到一个索引目录的,那多索引目录该如何查询呢,在Lucene5中使用的MultiReader类,在Lucene4时代,使用的是MultiSearcher类。至于Lucene多线程查询,只需要在构建IndexSearcher对象时传入一个ExecutorService线程池管理对象即可,具体请看下面贴出的示例代码:

package com.yida.framework.lucene5.index;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import org.apache.lucene.document.Document;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.MultiReader;
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.store.Directory;

import com.yida.framework.lucene5.util.LuceneUtils;

/**
 * 多线程多索引目录查询测试
 * @author Lanxiaowei
 *
 */
public class MultiThreadSearchTest {
	public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
		//每个线程都从5个索引目录中查询,所以最终5个线程的查询结果都一样
		//multiThreadAndMultiReaderSearch();
		
		//多索引目录查询(把多个索引目录当作一个索引目录)
		multiReaderSearch();
	}
	
	/**
	 * 多索引目录查询
	 * @throws InterruptedException
	 * @throws ExecutionException
	 * @throws IOException
	 */
	public static void multiReaderSearch()  throws InterruptedException, ExecutionException, IOException {
		Directory directory1 = LuceneUtils.openFSDirectory("C:/lucenedir1");
		Directory directory2 = LuceneUtils.openFSDirectory("C:/lucenedir2");
		Directory directory3 = LuceneUtils.openFSDirectory("C:/lucenedir3");
		Directory directory4 = LuceneUtils.openFSDirectory("C:/lucenedir4");
		Directory directory5 = LuceneUtils.openFSDirectory("C:/lucenedir5");
		IndexReader reader1 = DirectoryReader.open(directory1);
		IndexReader reader2 = DirectoryReader.open(directory2);
		IndexReader reader3 = DirectoryReader.open(directory3);
		IndexReader reader4 = DirectoryReader.open(directory4);
		IndexReader reader5 = DirectoryReader.open(directory5);
		MultiReader multiReader = new MultiReader(reader1,reader2,reader3,reader4,reader5);
		
		IndexSearcher indexSearcher = LuceneUtils.getIndexSearcher(multiReader);
		Query query = new TermQuery(new Term("contents","volatile"));
		List<Document> list = LuceneUtils.query(indexSearcher, query);
		if(null == list || list.size() <= 0) {
			System.out.println("No results.");
			return;
		}
		for(Document doc : list) {
			String path = doc.get("path");
			//String content = doc.get("contents");
			System.out.println("path:" + path);
			//System.out.println("contents:" + content);
		}
	}
	
	/**
	 * 多索引目录且多线程查询,异步收集查询结果
	 * @throws InterruptedException
	 * @throws ExecutionException
	 * @throws IOException
	 */
	public static void multiThreadAndMultiReaderSearch()  throws InterruptedException, ExecutionException, IOException {
		int count = 5;
		ExecutorService pool = Executors.newFixedThreadPool(count);
		
		Directory directory1 = LuceneUtils.openFSDirectory("C:/lucenedir1");
		Directory directory2 = LuceneUtils.openFSDirectory("C:/lucenedir2");
		Directory directory3 = LuceneUtils.openFSDirectory("C:/lucenedir3");
		Directory directory4 = LuceneUtils.openFSDirectory("C:/lucenedir4");
		Directory directory5 = LuceneUtils.openFSDirectory("C:/lucenedir5");
		IndexReader reader1 = DirectoryReader.open(directory1);
		IndexReader reader2 = DirectoryReader.open(directory2);
		IndexReader reader3 = DirectoryReader.open(directory3);
		IndexReader reader4 = DirectoryReader.open(directory4);
		IndexReader reader5 = DirectoryReader.open(directory5);
		MultiReader multiReader = new MultiReader(reader1,reader2,reader3,reader4,reader5);
		
		final IndexSearcher indexSearcher = LuceneUtils.getIndexSearcher(multiReader, pool);
		final Query query = new TermQuery(new Term("contents","volatile"));
		List<Future<List<Document>>> futures = new ArrayList<Future<List<Document>>>(count);
		for (int i = 0; i < count; i++) {
			futures.add(pool.submit(new Callable<List<Document>>() {
				public List<Document> call() throws Exception {
					return LuceneUtils.query(indexSearcher, query);
				}
			}));
		}
		
		int t = 0;
		//通过Future异步获取线程执行后返回的结果
		for (Future<List<Document>> future : futures) {
			List<Document> list = future.get();
			if(null == list || list.size() <= 0) {
				t++;
				continue;
			}
			for(Document doc : list) {
				String path = doc.get("path");
				//String content = doc.get("contents");
				System.out.println("path:" + path);
				//System.out.println("contents:" + content);
			}
			System.out.println("");
		}
		//释放线程池资源
		pool.shutdown();
		
		if(t == count) {
			System.out.println("No results.");
		}
	}
}

当然你也可以把上面的代码改造成每个线程查询一个索引目录,我上面是每个线程都从5个索引目录中查询,所以结果会打印5次,看到运行结果请不要感到奇怪。

 

如果你还有什么问题请加我Q-Q:7-3-6-0-3-1-3-0-5,

或者加裙
一起交流学习!

0
0
分享到:
评论

相关推荐

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

    通过对“lucene_multiThreadIndex”压缩包的学习,你将掌握如何在Lucene中实现多线程索引,从而提高大型数据集的索引构建速度。通过实践,你可以更好地理解和应用这些技术,优化你的信息检索系统。

    Lucene5学习之多线程创建索引

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

    Lucene索引和查询

    **Lucene索引和查询** Lucene是Apache软件基金会的开放源码全文...本项目提供了一个基础的实现示例,对于初学者来说,是学习Lucene索引和查询的绝佳起点。在实际应用中,可以进一步扩展和优化,以满足更复杂的需求。

    lucene实现索引查询

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

    Lucene 索引的简单使用

    以上就是关于“Lucene索引的简单使用”的详细介绍,包括其核心概念、创建和查询索引的步骤以及一些高级特性。希望对你理解和应用Lucene有所帮助。在实际开发中,可以根据需求选择合适的Analyzer,优化索引策略,以...

    lucene并行索引

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

    基于lucene技术的增量索引

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

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

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

    Lucene5学习之自定义Collector

    这篇博客“Lucene5学习之自定义Collector”显然聚焦于如何在Lucene 5版本中通过自定义Collector来优化搜索结果的收集过程。Collector是Lucene搜索框架中的一个重要组件,它负责在搜索过程中收集匹配的文档,并根据...

    Lucene索引的基本操作

    以上就是Lucene索引的基本操作,包括添加、更新文档以及进行查询测试。通过这些基础操作,开发者可以进一步构建复杂、高效的全文搜索引擎。在实际应用中,还需要考虑更多的因素,如性能优化、多线程支持、错误处理等...

    lucene分词搜索,增量索引及全量索引

    同时,为了避免长时间阻塞用户查询,可以考虑使用多线程或者分布式策略加速索引构建。 四、定时更新 为了平衡即时性和效率,往往需要结合增量索引和全量索引,设置定时更新策略。这可以通过调度工具(如Quartz或...

    Lucene.net高速创建索引

    **正文** 标题“Lucene.net高速创建索引”所涉及的核心技术是Apache Lucene.NET,这是一个开源全文搜索引擎库...开发者可以通过阅读源代码,学习如何集成Lucene.NET,优化索引构建流程,以及如何利用多线程提升性能。

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

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

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

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

    lucene 查询 学习

    - **并发控制**:对于多线程环境下的查询操作,需要采取适当的并发控制策略来避免数据不一致问题。 - **内存管理**:监控和调整内存使用情况,避免因内存泄漏而导致系统崩溃。 ### 实践案例 为了更好地理解Lucene...

    lucene相关jar+查询分析器jar

    6. **性能优化**:Lucene通过缓存、多线程索引和查询、以及倒排索引的位图压缩等技术提高性能。此外,合理的硬件配置和索引设计也对性能有显著影响。 7. **Lucene的扩展性**:除了基本功能,Lucene还提供了一些扩展...

    深入了解Lucene之二 索引结构.ppt

    《深入理解Lucene之二:索引结构》 Lucene是一个强大的全文搜索引擎库,它的核心功能之一就是构建高效的索引结构,使得数据的检索过程快速而精准。本篇内容将详细解析Lucene的索引结构,帮助你更好地理解和运用这个...

    lucene5和IKAnalyzer5的jar包 相匹配

    在Lucene5中,优化了多线程处理、提升了查询性能,并且支持更多种类型的字段和更丰富的查询语法,使得开发者能够构建出复杂且高效的搜索引擎。 其次,IKAnalyzer5是一款基于Java的开源中文分词器,专为满足Java...

    Lucene索引数据分析器

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

Global site tag (gtag.js) - Google Analytics