lucene是一个公用的全文索引组件,它的目标是把各种各样格式的数据转化成lucene特有的索引文件格式,这样才能通过lucene的高速检索机制进行全文检索。
你的数据来源可以是关系数据库,可以是word、execl、txt文档,可以是html网页,对于这些数据源,你必须将它们内部的数据读取出来,并封装成lucene的document实例,之后让lucene帮你构建索引。
举个例子:你的有一个用户数据库,里面存储了几十万的用户信息,你现在要对这个数据库进行全文索引,那么你要做的事情是:
1.写一段传统的JDBC程序,讲每条的用户信息从数据库读取出来
2.针对每条用户记录,建立一个lucene document
Document doc = new Document();
并根据你的需要,将用户信息的各个字段对应luncene document中的field 进行添加,如:
doc.add(new Field("NAME","USERNAME", Field.Store.YES,Field.Index.UN_TOKENIZED));
然后将该条doc加入到索引中, 如: luceneWriter.addDocument(doc);
这样就建立了lucene的索引库
3.编写对索引库的搜索程序(看lucene文档),通过对lucene的索引库的查找,你可以快速找到对应记录的ID
4.通过ID到数据库中查找相关记录
上面阐述了lucene的大体用法,不知道是不是说的很清楚。
B. java中如何实现全文检索
java的开源的免费全文检索工具Lucene
Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。
Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。
Lucene的发展历程:早先发布在作者自己的www.lucene.com,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:http://jakarta.apache.org/lucene/
已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有:
Jive:WEB论坛系统;
Eyebrows:邮件列表HTML归档/浏览/查询系统,本文的主要参考文档“TheLucene search engine: Powerful, flexible, and free”作者就是EyeBrows系统的主要开发者之一,而EyeBrows已经成为目前APACHE项目的主要邮件列表归档系统。
Cocoon:基于XML的web发布框架,全文检索部分使用了Lucene
Eclipse:基于Java的开放开发平台,帮助部分的全文索引使用了Lucene
对于中文用户来说,最关心的问题是其是否支持中文的全文检索。但通过后面对于Lucene的结构的介绍,你会了解到由于Lucene良好架构设计,对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。
C. 怎么用java 开发一个搜索引擎呀
一.创建索引
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中。
如下图所示
二.搜索索引
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.mole目录下添加一个新的package
例如:com.cscec.oa.searchengine.extend.mole.resourcestore
2.在新的目录下建立data package并建立相应的数据类,并使这个数据类继承BeanData。
例如:
package com.cscec.oa.searchengine.extend.mole.resourcestore.data
public class ResourceStoreBeanData extends BeanData{
}
3.与data package同一级目录建立manager package并建立相应管理类,并使这个管理类继承BeanDataManager
例如:
com.cscec.oa.searchengine.extend.mole.resourcestore.manager
public class extends BeanDataManager{
}
4.以管理员的身份登陆OA后,在菜单中找到“索引模块管理”链接,将相应信息添加完成后,便可以在List页面点击“创建索引”对该模块的数据进行索引的建立,建立完成后便可以进行查询。
D. java 搜索引擎
用lucene检索包,很强大。到官网下一个最新版本就可以进行二次开发。
至于中文支持,可以使用流行的中文分词包,建议用用paoding。
E. 用Java如何实现站内搜索
1,使用lucene
2. 使用solr
3. 使用sphinx
4. 低效率使用sql like
F. java如何实现文件搜索功能
java实现文件搜索主要使用类和正则表达式,如下示例:
packagecom.kiritor.util;
importjava.io.File;
importjava.io.FileFilter;
importjava.util.Arrays;
importjava.util.Collections;
importjava.util.List;
/**
*文件的相关操作类
*
*@authorKiritor
*/
publicclassFileOperation{
;
privatestaticStringfilePath;
privatestaticFile[]fileList=null;//保存文件列表,过滤掉目录
publicFileOperation(){
}
/**构造函数的参数是一个目录*/
publicFileOperation(Stringpath){
Filefile=newFile(path);
if(file.isDirectory())
this.contentPath=path;
else
this.filePath=path;
}
/**获取文件列表*/
publicstaticFile[]getFiles(){
if(contentPath==null){
Filefile=newFile(filePath);
fileList=newFile[1];
fileList[0]=file;
returnfileList;
}
fileList=newFile(contentPath).listFiles(newFileFilter(){
/**使用过滤器过滤掉目录*/
@Override
publicbooleanaccept(Filepathname){
if(pathname.isDirectory())
{
returnfalse;
}else
returntrue;
}
});
returnfileList;
}
/**对当前目录下的所有文件进行排序*/
publicstaticFile[]sort(){
getFiles();
Arrays.sort(fileList,newFileComparator());
returnfileList;
}
publicstaticvoidtree(Filef,intlevel){
StringpreStr="";
for(inti=0;i<level;i++){
preStr+="";
}
File[]childs=f.listFiles();
//返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。
for(inti=0;i<childs.length;i++){
System.out.println(preStr+childs[i].getName());
if(childs[i].isDirectory()){
tree(childs[i],level+1);
}
}
}
//提供一个"比较器"
.util.Comparator<File>{
@Override
publicintcompare(Fileo1,Fileo2){
//按照文件名的字典顺序进行比较
returno1.getName().compareTo(o2.getName());
}
}
}
G. Java lucene 急求一个文档分块检索的类!!!!
一般中文都是用google的paoding分词。。你可以去google免费下载使用
如果是lucene可以自定义Field啊?
晕。。要例子。。贴一个给你:paoding的标准文档例子:
String IDNEX_PATH = "E:/paoding_test_index";
//获取Paoding中文分词器
Analyzer analyzer = new PaodingAnalyzer();
//建立索引
IndexWriter writer = new IndexWriter(IDNEX_PATH, analyzer, true);
Document doc = new Document();
Field field = new Field("content", "你好,世界!", Field.Store.YES,
Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS);
doc.add(field);
writer.addDocument(doc);
writer.close();
System.out.println("Indexed success!");
//检索
IndexReader reader = IndexReader.open(IDNEX_PATH);
QueryParser parser = new QueryParser("content", analyzer);
Query query = parser.parse("你好");
Searcher searcher = new IndexSearcher(reader);
Hits hits = searcher.search(query);
if (hits.length() == 0) {
System.out.println("hits.length=0");
}
Document doc2 = hits.doc(0);
//高亮处理
String text = doc2.get("content");
TermPositionVector tpv = (TermPositionVector) reader.getTermFreqVector(
0, "content");
TokenStream ts = TokenSources.getTokenStream(tpv);
Formatter formatter = new Formatter() {
public String highlightTerm(String srcText, TokenGroup g) {
if (g.getTotalScore() <= 0) {
return srcText;
}
return "<b>" + srcText + "</b>";
}
};
Highlighter highlighter = new Highlighter(formatter, new QueryScorer(
query));
String result = highlighter.getBestFragments(ts, text, 5, "…");
System.out.println("result:\n\t" + result);
reader.close();