文档章节

Lucene基本应用示例

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 688
阅读 11
收藏 0
点赞 0
评论 0

以下两段代码分别展示如何创建lucene索引和通过lucene进行检索:

1.为指定的数据表创建索引

indexDirPath是索引文件的存放路径。clearDir是指明是否在每次建立索引时清空文件夹。batchIndexingDao是专来提取数据的DAO接口,它有一个public <T> List<T> getBatchRecords(String tableName, int beginIndex, int count);方法用来分批次的从表中提取数据。此接口一般由某具体Dao实现。tableName,用于需要做索引的数据表。其实这个参数是不应该出现的,它应该由某个具体的DAO封装起来了。这里是由于程序中的特殊原因。indexDocWrapper是很有意思的一个接口,它很像spirngjdbc的rowmapper,由于把DAO返回的实体对象包裹或者说适配成lucene的Document对象。


/**
	 * Creates index. This is generic method for creating index.
	 *
	 * @param <T> the object type which will be indexed.
	 * @param indexFileDir the index file's directory.
	 * @param clearDir whether clear the direcory first when creating index.
	 * @param batchIndexingDao the batch indexing dao, it's used to load objects from database when indexing.
	 * @param tableName the table name. there are many topic and reply daily tables.
	 * @param indexDocWrapper the wrapper to wrap an object into document.
	 */
	public <T> void createIndex(String indexDirPath, boolean clearDir, BatchIndexingDao batchIndexingDao ,String tableName , IndexDocWrapper<T> indexDocWrapper){	
		IndexWriter writer = null;
		try {
			File indexFileDir = new File(indexDirPath);
			if(indexFileDir.exists()&&clearDir==true){
				FileUtils.cleanDirectory(indexFileDir);
				logger.info("The specified direcory:" + indexDirPath +" has cleared.");
			}
			writer = new IndexWriter(FSDirectory.open(indexFileDir), new IKAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED);
			writer.setRAMBufferSizeMB(Constants.INDEX_WRITER_RAM_BUFFER);
			int recordIndex = 0;
			List<T> objects = null;
			do {
				try {
					objects = batchIndexingDao.getBatchRecords(tableName, recordIndex, Constants.BATCH_INDEX_SIZE);
				} catch (BadSqlGrammarException e) {
					logger.error(tableName+" does not exist!");
					continue;
				}
				if (objects != null && !objects.isEmpty()) {
					for (T object : objects) {
						writer.addDocument(indexDocWrapper.createDoc(object));
					}
					logger.info(recordIndex + objects.size() + " records has added!");
					recordIndex += Constants.BATCH_INDEX_SIZE;
				}
			} while (objects != null && !objects.isEmpty());
			logger.info("Starts to optimize...");
			writer.optimize();
			logger.info("Optimize finished.");
		} catch (CorruptIndexException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} catch (LockObtainFailedException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} catch (IOException e) {
			logger.error(e.getMessage());
			e.printStackTrace();
		} finally {
			if(writer!=null){
				try {
					writer.close();
					logger.info("Topic indexing work finished.");
				} catch (CorruptIndexException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}


2. 根据给定的关键字检索命中的对象

indexDirPath是索引文件的存放路径。field是将被检索的Lucene的Document的field.expression是lucene表达式。indexObjectWrapper和indexDocWrapper是对应的,当是把lucene的Document提取出来封装到对象中的包裹器。beginIndex和count是当检索结果很多时用来分页的。

/**
	 * Search. This is generic method for searching with paging.
	 *
	 * @param <T>  the searching target object type.
	 * @param indexFileDir the index file dir
	 * @param field the document field for searching.
	 * @param expression the expression
	 * @param indexObjectWrapper the index object wrapper
	 * @param beginIndex the begin index
	 * @param count the count
	 * @return the list
	 */
	public <T> List<T> search(String indexFileDir, String field,  String expression, IndexObjectWrapper<T> indexObjectWrapper, int beginIndex, int count){
		IndexSearcher indexSearcher = null;
		try {
			logger.info("Starts to search...");
			if(expression==null||"".equals(expression.trim())){
				throw new NullPointerException("The lucene expression is null or empty!");
			}
			indexSearcher = new IndexSearcher(FSDirectory.open(new File(indexFileDir)));
			Query query = new QueryParser(Version.LUCENE_CURRENT, field, new IKAnalyzer()).parse(expression);
			TopDocs topDocs = indexSearcher.search(query, Integer.MAX_VALUE);
			ScoreDoc[] scoreDocs = topDocs.scoreDocs;
			logger.info("Total Hits: "+topDocs.totalHits);
			List<T> objects = new ArrayList<T>();
			int endIndex = beginIndex+count;
			for (int i = beginIndex; i < endIndex; i++) {
				Document targetDoc = indexSearcher.doc(scoreDocs[i].doc);
				objects.add(indexObjectWrapper.createObject(targetDoc));
			}
			return objects;
		}  catch (Exception e) {
			logger.info(e.getMessage());
			e.printStackTrace();
			return null;
		} finally {
			if(indexSearcher!=null){
				try {
					indexSearcher.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}


本文转载自:http://blog.csdn.net/bluishglc/article/details/5866375

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
搜索应用参考示例 - xxl-search

《搜索应用参考示例XXL-SEARCH》 一、简介 1.1 概述 XXL-SEARCH 是以 "lucene/elasticsearch" 为核心的,Pragmatic风格的搜索应用参考示例,是索引搜索世界中的主流技术选型,最佳实践的总结...

许雪里 ⋅ 2016/09/26 ⋅ 0

Apache Lucene 6.2.1 中文文档-首页

原文链接:CDCN-码上中国 Lucene 是一个基于Java的全文搜索引擎。Lucene不是要给完整的应用程序,而是 一个可以轻松地向应用程序添加搜索功能的代码库API接口。 这是Apache Lucene 6.2.1的官...

码上中国博客 ⋅ 2016/11/05 ⋅ 0

整合Lucene 4.10.1 与IK Analyzer

注意,IK Analyzer需要使用其下载列表中的IK Analyzer 2012FF_hf1.zip,否则在和Lucene 4.10配合使用时会报错。 我使用 intellij IDEA 12进行的测试。 建立java项目 建立项目HelloLucene,导...

樂天 ⋅ 2014/10/02 ⋅ 2

许雪里/xxl-search

《搜索应用参考示例XXL-SEARCH》 一、简介 1.1 概述 XXL-SEARCH 是以 "lucene/elasticsearch" 为核心的,Pragmatic风格的搜索应用参考示例,是索引搜索世界中的主流技术选型,最佳实践的总结...

许雪里 ⋅ 2016/09/26 ⋅ 0

Lucene In Action 读书笔记(一)

简介 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和...

林俊龙 ⋅ 2013/09/04 ⋅ 1

Lucene索引数据库

Lucene是一个高性能、可伸缩的信息搜索(IR)库。它可以为你的应用程序添加索引和搜索能力。Lucene是用java实现的、成熟的开源项目,是著名的Apache Jakarta大家庭的一员,并且基于Apache软件许...

酷帅CoolBash ⋅ 2012/09/20 ⋅ 0

Lucene.Net Research

Lucene.Net Research The history of Lucene. 1 What is the Lucene. 1 Lucene.net basic objects. 2 Behind the scenes of indexing. 8 Concurrency rules of Lucene. 10 The history of Lu......

长平狐 ⋅ 2012/08/28 ⋅ 1

Lucene的索引文件格式(1)

Lucene学习总结之三:Lucene的索引文件格式(1) Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙。 当我们真正进入到Lucene源代码之中的时...

nubo ⋅ 03/05 ⋅ 0

Lucene索引文件组成

Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙。 当我们真正进入到Lucene源代码之中的时候,我们会发现: Lucene的索引过程,就是按照全...

曾杰 ⋅ 2012/03/05 ⋅ 0

Lucene学习总结之三:Lucene的索引文件格式(1)

【转载 http://www.cnblogs.com/forfuture1978/archive/2009/12/14/1623597.html】 Lucene的索引里面存了些什么,如何存放的,也即Lucene的索引文件格式,是读懂Lucene源代码的一把钥匙。 当...

ruanjun ⋅ 2016/04/12 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringBoot集成Druid的最简单的小示例

参考网页 https://blog.csdn.net/king_is_everyone/article/details/53098350 建立maven工程 Pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM......

karma123 ⋅ 47分钟前 ⋅ 0

Java虚拟机基本结构的简单记忆

Java堆:一般是放置实例化的对象的地方,堆分新生代和老年代空间,不断未被回收的对象越老,被放入老年代空间。分配最大堆空间:-Xmx 分配初始堆空间:-Xms,分配新生代空间:-Xmn,新生代的大小一...

算法之名 ⋅ 今天 ⋅ 0

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 今天 ⋅ 5

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部