文档章节

Lucene基本应用示例

猪刚烈
 猪刚烈
发布于 2014/10/12 11:40
字数 688
阅读 11
收藏 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
636
0
Apache Lucene 6.2.1 中文文档-首页

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

码上中国博客
2016/11/05
164
0
许雪里/xxl-search

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

许雪里
2016/09/26
0
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
0
2
Lucene In Action 读书笔记(一)

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

林俊龙
2013/09/04
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea新建springCloud项目(5)- 订单服务

1.创建订单api,如下: 2.创建订单实现逻辑 3.新建订单、订单商品表 -- 订单 create table `order_master` ( `order_id` varchar(32) not null, `buyer_name` varchar(32) not null comment......

monroeCode
21分钟前
1
1
游戏开发经验谈(二):对战类全球服游戏的设计与实现

上篇文章《游戏开发经验谈(一):游戏架构里隐藏的五个坑及其应对方案》,我们主要讲解了游戏架构设计当中隐藏的一些坑及其应对方案,错过的小伙伴可以回溯之前的内容。本期内容,将会重点介...

UCloudTech
31分钟前
0
0
Mysql基本语法

一.联合主键 drop table CONTENT_AND_CATALOG;CREATE TABLE `tobebetter`.`CONTENT_AND_CATALOG` ( `ID` VARCHAR(120) NOT NULL , `CONTENT_ID` VARCHAR(120) , `CA......

我是菜鸟我骄傲
32分钟前
0
0
179. centos7 安装mariadb

1. centos7 中安装mariadb 1.1 执行安装 centos7 自带了mariadb yum -y install mariadb mariadb-server 1.2 启动mariadb systemctl start mariadb 1.3 设置开机启动 systemctl enable maria......

Lucky_Me
40分钟前
0
0
【AI实战】动手训练自己的目标检测模型(YOLO篇)

在前面的文章中,已经介绍了基于SSD使用自己的数据训练目标检测模型(见文章:手把手教你训练自己的目标检测模型),本文将基于另一个目标检测模型YOLO,介绍如何使用自己的数据进行训练。 ...

雪饼
46分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部