为了便于调试,这里用Jsp程序作为例子:
要引入的包
<%@ page import = "org.apache.lucene.analysis.*" %>
<%@ page import = "org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer" %>
<%@ page import = "org.apache.lucene.document.*" %>
<%@ page import = "org.apache.lucene.index.*" %>
<%@ page import = "org.apache.lucene.store.*" %>
<%@ page import = "org.apache.lucene.util.*" %>
设定分词器
SmartChinese 是Lucene较新版本内置的强大分词器,当然你也可以使用第三方的,如 IKAnalyzer 等
Analyzer analyzer = new IKAnalyzer();
//Analyzer analyzer = new SmartChineseAnalyzer(Version.LUCENE_CURRENT);
Document doc = new Document();
Field f = null;
索引类
IndexWriter writer = new IndexWriter(FSDirectory.open( new File(request.getRealPath("网站的目录") ) ),
analyzer, true, IndexWriter.MaxFieldLength.LIMITED);
for( 循环要索引的东东 )
{
新文档(这里的文档,其实也可以认为相当于数据库的“行”,当然,如果索引的对象正好是个文件,那文档这种叫法就很合理了)
doc = new Document();
doc.add( new Field("id", rs.getString("id"), Field.Store.YES, Field.Index.NOT_ANALYZED) );
doc.add( new Field("title", rs.getString("title"), Field.Store.YES, Field.Index.ANALYZED) );
d = new SimpleDateFormat("yyyy-MM-dd").format( new java.util.Date( rs.getLong("shadow_time") ) ).toString();
f = new Field("shadowtime", d, Field.Store.YES, Field.Index.NOT_ANALYZED);
doc.add(f);
writer.addDocument(doc);
}
索引必须严格按照这样的方式去创建,如果按2.4版以下的方式,会出现方法已经过期的警告,在3.0中一些方法甚至是直接不能用的,具体是哪些可以看相关的API。
====================================================================
对已经创建的索引进行查询,即是搜索,这包括两个部份,一是如何直接读取某个索引的所有记录,二是如果对某个索引进行搜索。
一、列出索引里的文档
列出索引需引入的类或包
<%@ page import = "org.apache.lucene.document.*" %>
<%@ page import = "org.apache.lucene.index.*" %>
<%@ page import = "org.apache.lucene.store.*" %>
<%@ page import = "org.apache.lucene.util.Version" %>
索引目录
String indexPath = request.getRealPath("网站目录");
IndexReader reader = null;
long startTime = (new java.util.Date()).getTime();
打开索引
try {
reader = IndexReader.open( FSDirectory.open(new File(indexPath)) , true );
}
catch (Exception e) {
;
}
版本:<%=reader.getVersion()%> 文档:<%=pagination.getTotalResult()%> 个<br />
TermDocs tdocs = reader.termDocs();
int i = 0;
while( tdocs.next() )
{
i++;
Document doc = reader.document( tdocs.doc() );
String docid = doc.get("id");
String title = doc.get("title");
String area = doc.get("shadowtime");
....
}
二、搜索索引
除了上面引入的包外,还需要引入
<%@ page import = "org.apache.lucene.search.*" %>
<%@ page import = "org.apache.lucene.queryParser.*" %>
//索引目录
String indexPath = request.getRealPath("网站目录");
Analyzer analyzer = new IKAnalyzer();
IndexSearcher searcher = null;
IndexReader reader = null;
Query query = null;
TopDocs hits = null;
//打开索引目录
try
{
reader = IndexReader.open( FSDirectory.open(new File(indexPath)) , true );
searcher = new IndexSearcher(reader);
}
catch (Exception e)
{
return;
}
执行查询
try
{
//多字段搜索,这里要搜索多少个字段就要有多个个参数
BooleanClause.Occur[] clauses = { BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD };
String[] fieldnames = new String[] { "title", "content"};
IKQueryParser ikquery = new IKQueryParser();
query = ikquery.parseMultiField(fieldnames, queryString , clauses);
//获取分词结果(这个只是便于对搜索结果输出加亮之类,并非必要选项)
String wd = "";
Reader r = new StringReader(queryString);
org.apache.lucene.analysis.TokenStream tsi = analyzer.tokenStream("", r);
org.apache.lucene.analysis.Token token;
while ( tsi.incrementToken() )
{
wd = tsi.toString().replaceAll("\(\(|,(.*)", "");
spword += (spword=="" ? wd : "," + wd );
}
tsi.close();
}
catch (Exception e)
{
return ;
}
读取搜索结果
hits = searcher.search(query, 0);
for (int i = startindex; i < hits.totalHits; i++)
{
if(i >= hits.totalHits) { break; }
Document doc = searcher.doc(hits.scoreDocs[i].doc);
String docid = doc.get("id");
String title = doc.get("title");
.....................
}
分享到:
相关推荐
lucene3.0 lucene3.0 lucene3.0 lucene3.0 lucene3.0
Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 Lucene3.0 使 用 教 程 ...
lucene 3.0 API中文帮助,学习的人懂得的
Lucene3.0特性Lucene3.0特性
Lucene3.0之查询处理(1):原理和查询类型 各种Query对象详解
lucene3.0 中文分词器, 庖丁解牛
Lucene 3.0 原理与代码分析完整版
lucene3.0使用介绍及实例,从不同的使用方面介绍了lucene的使用及相应的实例。
lucene3.0 实例,在jdk1.5,lucene3.0下调式通过,可以直接运行。先运行生成索引文件的class,在运行搜索的class。
lucene3.0的核心jar包文件,lucene3.0的核心jar包文件,lucene3.0的核心jar包文件,lucene3.0的核心jar包文件。
传智播客Lucene3.0课程,Lucene3.0的入门教程.
lucene3.0-highlighter.jar lucene3.0的高亮jar包,从lucene3.0源码中导出来的
在使用lucene3与paoding集成的时候可能会出现以下错误: Exception in thread "main" java.lang.AbstractMethodError: org.apache.lucene.analysis.TokenStream.incrementToken()Z at org.apache.lucene.index....
Lucene 3.0 原理 Lucene 3.0 原理 Lucene 3.0 原理 Lucene 3.0 原理
全面好用的lucene 2.0 api以及lucene 3.0 api帮助文档
Lucene3.0浅析Lucene3.0浅析Lucene3.0浅析Lucene3.0浅析
基于lucene3.0 书籍查询系统 基于lucene3.0 书籍查询系统
Lucene3.0分词系统.doc
lucene3.0 例子lucene3.0 例子 lucene3.0 例子 ,很好的学习,只有原代原,jar 包自己加上去就OK了
lucene 3.0 入门实例项目,迅速教会你怎么使用3.0API