利用Lucene制作搜索模块的思路及代码说明
搜索引擎主要分为两大功能:一.创建索引
二.搜索索引
一.创建索引
1.一般创建索引的核心步骤
(1).创建索引写入对象IndexWriter:
IndexWriter indexWriter = new IndexWriter(INDEX_STORE_PATH,new StandardAnalyzer(),create);
参数说明:INDEX_STORE_PATH:索引文件存放路径
new StandardAnalyzer():分词工具
create:此参数为Boolean型,true表示重新创建整个索引,false表示增量式创建索引。
(2).创建文档模型,并用IndexWriter对象写入
Document doc = new Document();
Field field1 = new Field(fieldName1, fieldValue ,Field.Store.YES, Field.Index.TOKENIZED);
doc.add(field1);
Field field2 = new Field(fieldName2, fieldValue ,Field.Store.YES, Field.Index.TOKENIZED);
doc.add(field2);
……
indexWriter.addDocument(doc);
indexWriter.close();
参数说明:
Document:负责搜集数据源,它可以从不同的物理文件提取数据并放入同一个Document中或从一个物理文件中提取出不同的数据并放入同一个Document中。如下图所示
Field:用来表示不同的数据源
fieldName1:表示field名称
fieldValue:表示field的值
Field.Store.YES,:表示是否在索引文件中完整的存储该值。
在创建索引时,有些内容需要以摘要的形式完整地或以片段的方式显示在页面上,来便于用户查找想要的记录,那么就应该选择存储,如果不需要完整或片段的显示就不需要存储。
Field.Index.TOKENIZED:表示是否索引和分词。
只要是需要当作关键字让用户查找的字段就需要建立索引。
在建立索引的过程中,如果像文章标题、文章内容这样的Field,一般是靠用户输入几个关键字来查询的,就应该选择分词。
如果需要用户输入完整字符也就是精确查找才能查询到的,例如:beanName,就可以不分词。
Document最直观的理解方式:
Document就相当于我们平台中的一个普通javaBean,,而Field就是javaBean中的一个属性。lucene搜索的机制就是靠搜索指定的Field的值,来得到含有要搜索内容的Document集合,所以问题的关键在于如何组织Document
.
2.结合平台创建索引的思路
(1)经分析搜索元素应该由如下内容组成(Document的属性)
(2)数据库数据转化为Document的构造过程:
JavaBean / Attachment→(Temp Object) BaseData→(Finally Object) Document
分析:
要建立索引的源数据分为两大部分:一个是数据库数据BeanData ,另一个是附件数据FileData ,这样可以建立一个抽象类BaseData ,来存放它们共有的属性。同时为了管理这些相应的数据,在相同的等级结构上,建立了相应的管理类(xxxDataManager) ,对这些数据类的操作(建立或删除索引)进行管理,并用一个工厂类(DataManagerFactory)来创建所需要的管理类,IndexHelper用来充当整个索引模块对外的接口,为了实现一些与平台特定的业务,特用SupportManager来提供一些额外的业务支持,索引模块代码结构如下图所示。
二.搜索索引
1.lucene搜索的核心步骤:
String[]fields={“title”,“summary”,……};//要查找的field范围
BooleanClause.Occur[]flags={BooleanClause.Occur.SHOULD, BooleanClause.Occur.MUST ,……};
Queryquery = MultiFieldQueryParser.parse(queryStr, fields,flags,new StandardAnalyzer());
Hitshits=newIndexSearcher(INDEX_STORE_PATH).search(query);
for (int i = 0;i < hitsLength ; i++)
{
Document doc = hits.doc(i);
String title = doc.get(“title”);
String summary = doc.get(“summary”);
//搜索出来的结果高亮显示在页面上
if (title != null) {
TokenStream tokenStream = analyzer.tokenStream(“title”,new
StringReader(title));
String highlighterValue = highlighter.getBestFragment(tokenStream, title) ;
if(highlighterValue != null){
title = highlighterValue ;
}
//log.info("SearchHelper.search.title="+title);
}
if(summary!= null){
TokenStream tokenStream = analyzer.tokenStream(“summary”,new
StringReader(summary));
String highlighterValue = highlighter.getBestFragment(tokenStream, creator) ;
if(highlighterValue != null){
summary = highlighterValue ;
}
//log.info("SearchHelper.search. summary ="+ summary);
}
}
2.结合平台构造搜索模块
PageData类用来存放检索结果集数据。
PageInfo类用来存放页面相关信息例如,PageData对象集合、总记录个数、每一页的记录数、总页面数量等等。
SearchHelper用来充当整个搜索模块的对外接口。
三.为平台组件添加索引的步骤(以知识中心为例)
1.在com.cscec.oa.searchengine.extend.module目录下添加一个新的package
例如:com.cscec.oa.searchengine.extend.module.resourcestore
2.在新的目录下建立data package并建立相应的数据类,并使这个数据类继承BeanData。
例如:
package com.cscec.oa.searchengine.extend.module.resourcestore.data
public class ResourceStoreBeanData extends BeanData{
}
3.与data package同一级目录建立manager package并建立相应管理类,并使这个管理类继承BeanDataManager
例如:
com.cscec.oa.searchengine.extend.module.resourcestore.manager
public class ResourceStoreBeanDataManagerImpl extends BeanDataManager{
}
4.以管理员的身份登陆OA后,在菜单中找到“索引模块管理”链接,将相应信息添加完成后,便可以在List页面点击“创建索引”对该模块的数据进行索引的建立,建立完成后便可以进行查询。
分享到:
相关推荐
利用lucene进行搜索,IndexSearcher是整个Lucene搜索查询相关信息的驱动引擎,在使IndexSearcher之前,需要构建IndexSearcher对象,Lucene提供了两种构建IndexSearcher对象的方式: 1、基于Directory对象构建; 2...
java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交搜索系统 java代码 结合 lucene 实现的 公交...
Apache Solr lucene 搜索模块设计实现 Solr 模块 架构 lucene 搜索
基于LUCENE的搜索引擎的设计与实现源代码..
Lucene.Net 源搜索引擎源代码 使用说明: 一、在IIS上建立虚拟目录,指向web 二、Web\Data\Config.xml 配置索引目录 三、运行Web\Data\IndexFiles.exe 建立文件索引(自己也可以写一个批处理,定时更新索引) 四、...
lucene3.6 搜索例子
《Lucene+nutch搜索引擎开发》书附带的源代码
搜索模块源代码 第1个是普通搜索 第2个是高级搜索 第3个是Lucene搜索引擎
布尔操作符 域搜索 通配符搜索 模糊查询 范围搜索
lucene 近实时搜索 很清楚的解释了关于lucene近实时搜索的代码。很值得学习
lucene 高级搜索项目 附件搜索 附件内容搜索 全文搜索
主要是关于lucene站内搜索的技术代码,可以使用;按照需要进行代码修改。
lucene-3.0.1库 和 源代码包
用lucene2.0.0来设计一个简单的搜索引擎,包含一个实例。
我自己写的一个lucene搜索引擎的简单入门例子源代码 对照lucene,相当的易懂。api我这也有,含JE分词器。
Lucene.NET2.9,搜索引擎源代码(C#),分析较透彻,可以研究源代码来学习
Lucene实现全文搜索,支持英文、模糊和智能查询
基于lucene平台搜索工具相关包及使用说明.rar
基于Lucene的搜索策略研究