lucene全文检索应用
2012-09-08 17:42
253 查看
使用Lucene实现全文检索,主要有下面三个步骤:
1、建立索引库:根据网站新闻信息库中的已有的数据资料建立Lucene索引文件。
2、通过索引库搜索:有了索引后,即可使用标准的词法分析器或直接的词法分析器实现进行全文检索。
3、维护索引库:网站新闻信息库中的信息会不断的变动,包括新增、修改及删除等,这些信息的变动都需要进一步反映到Lucene索引文件中。
下面是myrss.easyjf.com相关代码!
一、索引管理(建立及维护)
索引管理类MyRssIndexManage主要实现根据网站信息库中的数据建立索引,维护索引等。由于索引的过程需要消耗一定的时间,因此,索引管理类实现Runnable接口,使得我们可以在程序中开新线程来运行。
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.lucene;
2
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.Date;
3
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.List;
4
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.analysis.standard.StandardAnalyzer;
5
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.document.Document;
6
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.document.Field;
7
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.index.IndexReader;
8
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.index.IndexWriter;
9
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.MultiFieldQueryParser;
10
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.QueryParser;
11
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Hits;
12
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.IndexSearcher;
13
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Query;
14
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Searcher;
15
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.dbo.EasyJDB;
16
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.news.business.NewsDir;
17
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.news.business.NewsDoc;
18
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.news.business.NewsUtil;
19
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.IPageList;
20
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class MyRssIndexManage implements Runnable
![](http://www.blogjava.net/Images/dot.gif)
{
21
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private String indexDir;
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private String indexType="add";
23
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void run()
![](http://www.blogjava.net/Images/dot.gif)
{
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if("add".equals(indexType))
26
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
normalIndex();
27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else if ("init".equals(indexType)) reIndexAll();
28
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void normalIndex()
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
31
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date start = new Date();
33
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int num=0;
34
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IndexWriter writer=new IndexWriter(indexDir,new StandardAnalyzer(),false);
35
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//NewsDir dir=NewsDir.readBySn();
36
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String scope="(needIndex<2) or(needIndex is null)";
37
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=NewsUtil.pageList(scope,1,50);
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int p=0;p
![](http://www.blogjava.net/Images/dot.gif)
{
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pList=NewsUtil.pageList(scope,p,100);
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=pList.getResult();
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=0;i
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
NewsDoc doc=(NewsDoc)list.get(i);
43
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.addDocument(newsdoc2lucenedoc(doc));
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
num++;
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
46
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
47
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.optimize();
48
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.close();
49
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
EasyJDB.getInstance().execute("update NewsDoc set needIndex=2 where "+scope);
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date end = new Date();
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.print("新增索引"+num+"条信息,一共花:"+(end.getTime() - start.getTime())/60000+"分钟!");
52
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
53
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
54
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
56
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
57
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
58
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void reIndexAll()
59
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
60
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
61
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date start = new Date();
62
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int num=0;
63
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IndexWriter writer=new IndexWriter(indexDir,new StandardAnalyzer(),true);
64
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
NewsDir dir=NewsDir.readBySn("easyjf");
65
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=NewsUtil.pageList(dir,1,50);
66
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int p=0;p
![](http://www.blogjava.net/Images/dot.gif)
{
67
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pList=NewsUtil.pageList(dir,p,100);
68
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=pList.getResult();
69
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=0;i
![](http://www.blogjava.net/Images/dot.gif)
{
70
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
NewsDoc doc=(NewsDoc)list.get(i);
71
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.addDocument(newsdoc2lucenedoc(doc));
72
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
num++;
73
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
74
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
75
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.optimize();
76
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.close();
77
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
EasyJDB.getInstance().execute("update NewsDoc set needIndex=2 where dirPath like 'easyjf%'");
78
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date end = new Date();
79
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.print("全部重新做了一次索引,一共处理了"+num+"条信息,花:"+(end.getTime() - start.getTime())/60000+"分钟!");
80
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
81
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
82
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
83
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
84
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
85
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
86
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private Document newsdoc2lucenedoc(NewsDoc doc)
87
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
88
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Document lDoc=new Document();
89
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("title",doc.getTitle(),Field.Store.YES,Field.Index.TOKENIZED));
90
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("content",doc.getContent(),Field.Store.YES,Field.Index.TOKENIZED));
91
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("url",doc.getRemark(),Field.Store.YES,Field.Index.NO));
92
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("cid",doc.getCid(),Field.Store.YES,Field.Index.NO));
93
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("source",doc.getSource(),Field.Store.YES,Field.Index.NO));
94
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("inputTime",doc.getInputTime().toString(),Field.Store.YES,Field.Index.NO));
95
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return lDoc;
96
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
97
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public String getIndexDir()
![](http://www.blogjava.net/Images/dot.gif)
{
98
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return indexDir;
99
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
100
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setIndexDir(String indexDir)
![](http://www.blogjava.net/Images/dot.gif)
{
101
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.indexDir = indexDir;
102
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
103
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
104
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public String getIndexType()
![](http://www.blogjava.net/Images/dot.gif)
{
105
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return indexType;
106
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
107
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setIndexType(String indexType)
![](http://www.blogjava.net/Images/dot.gif)
{
108
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.indexType = indexType;
109
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
110
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
111
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
二、使用Lucene实现全文搜索
下面是MyRssSearch类的源码,该类主要实现使用Lucene中Searcher及QueryParser实现从索引库中搜索关键词。
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.lucene;
2
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.List;
4
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.analysis.standard.StandardAnalyzer;
5
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.document.Document;
6
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.index.IndexReader;
7
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.MultiFieldQueryParser;
8
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.QueryParser;
9
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Hits;
10
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.IndexSearcher;
11
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Query;
12
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Searcher;
13
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
14
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.search.MyRssUtil;
15
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.search.SearchContent;
16
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.IPageList;
17
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.PageList;
18
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
19
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class MyRssSearch
![](http://www.blogjava.net/Images/dot.gif)
{
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private String indexDir;
21
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IndexReader ir;
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Searcher search;
23
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public IPageList search(String key,int pageSize,int currentPage)
24
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=new PageList(new HitsQuery(doSearch(key)));
26
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pList.doList(pageSize,currentPage,"","",null);
27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(pList!=null)
28
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=pList.getResult();
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(list!=null)
![](http://www.blogjava.net/Images/dot.gif)
{
31
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=0;i
![](http://www.blogjava.net/Images/dot.gif)
{
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
list.set(i,lucene2searchObj((Document)list.get(i),key));
33
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
34
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
35
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
36
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
37
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(search!=null)search.close();
38
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(ir!=null)ir.close();
39
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
43
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return pList;
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
46
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private SearchContent lucene2searchObj(Document doc,String key)
47
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
48
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SearchContent searchObj=new SearchContent();
49
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String title=doc.getField("title").stringValue();
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setTitle(title.replaceAll(key,""+key+""));
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setTvalue(doc.getField("cid").stringValue());
52
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setUrl(doc.getField("url").stringValue());
53
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setSource(doc.getField("source").stringValue());
54
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setLastUpdated(doc.getField("inputTime").stringValue());
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setIntro(MyRssUtil.content2intro(doc.getField("content").stringValue(),key));
56
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return searchObj;
57
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
58
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public Hits doSearch(String key)
59
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
60
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Hits hits=null;
61
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
62
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ir=IndexReader.open(indexDir);
63
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
search=new IndexSearcher(ir);
64
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
String fields[]=
![](http://www.blogjava.net/Images/dot.gif)
{"title","content"};
65
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
QueryParser parser=new MultiFieldQueryParser(fields,new StandardAnalyzer());
66
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Query query=parser.parse(key);
67
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
hits=search.search(query);
68
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
69
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
70
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
71
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
72
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
73
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//System.out.println("搜索结果:"+hits.length());
74
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return hits;
75
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
76
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
77
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public String getIndexDir()
![](http://www.blogjava.net/Images/dot.gif)
{
78
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return indexDir;
79
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
80
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setIndexDir(String indexDir)
![](http://www.blogjava.net/Images/dot.gif)
{
81
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.indexDir = indexDir;
82
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
83
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
84
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
在上面的代码中,search方法返回一个封装了分页查询结果的IPageList,IPageList是EasyJWeb Tools业务引擎中的分页引擎,对于IPageList的使用,请看本人写的这篇文章《EasyJWeb Tools中业务引擎分页的设计实现》:
我们针对Lucene的的查询结果Hits结构,写了一个查询器HitsQuery。代码如下所示:
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.lucene;
2
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.ArrayList;
3
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.Collection;
4
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.List;
5
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Hits;
6
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.IQuery;
7
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class HitsQuery implements IQuery
![](http://www.blogjava.net/Images/dot.gif)
{
8
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int begin=0;
9
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int max=0;
10
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private Hits hits;
11
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public HitsQuery()
12
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
13
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
14
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
15
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public HitsQuery(Hits hits)
16
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
17
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(hits!=null)
18
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
19
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.hits=hits;
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.max=hits.length();
21
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
22
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
23
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getRows(String arg0)
![](http://www.blogjava.net/Images/dot.gif)
{
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return (hits==null?0:hits.length());
26
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
27
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public List getResult(String arg0)
![](http://www.blogjava.net/Images/dot.gif)
{
28
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=new ArrayList();
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=begin;i<(begin+max)&&(i
![](http://www.blogjava.net/Images/dot.gif)
{
31
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
list.add(hits.doc(i));
33
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
34
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
35
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
36
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
37
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return list;
40
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setFirstResult(int begin)
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
43
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.begin=begin;
44
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setMaxResults(int max)
![](http://www.blogjava.net/Images/dot.gif)
{
46
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
47
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.max=max;
48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
49
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setParaValues(Collection arg0)
![](http://www.blogjava.net/Images/dot.gif)
{
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
52
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
53
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public List getResult(String condition, int begin, int max)
![](http://www.blogjava.net/Images/dot.gif)
{
54
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if((begin>=0)&&(begin if(!(max>hits.length()))this.max=max;
56
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return getResult(condition);
57
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
58
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
59
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
三、Web调用
下面我们来看看在Web中如果调用商业逻辑层的全文检索功能。下面是处理用户请请的Action中关于搜索部分的源码:
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.news.action;
2
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class SearchAction implements IWebAction
![](http://www.blogjava.net/Images/dot.gif)
{
3
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public Page doSearch(WebForm form,Module module)throws Exception
4
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
5
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String key=CommUtil.null2String(form.get("v"));
6
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
key=URLDecoder.decode(URLEncoder.encode(key,"ISO8859_1"),"utf-8");
7
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.set("v",key);
8
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("v2",URLEncoder.encode(key,"utf-8"));
9
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(key.getBytes().length>2)
![](http://www.blogjava.net/Images/dot.gif)
{
10
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String orderBy=CommUtil.null2String(form.get("order"));
11
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int currentPage=CommUtil.null2Int(form.get("page"));
12
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int pageSize=CommUtil.null2Int(form.get("pageSize"));
13
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(currentPage<1)currentPage=1;
14
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(pageSize<1)pageSize=15;
15
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SearchEngine search=new SearchEngine(key,orderBy,pageSize,currentPage);
16
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
search.getLuceneSearch().setIndexDir(Globals.APP_BASE_DIR+"/WEB-INF/index");
17
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
search.doSearchByLucene();
18
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=search.getResult();
19
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(pList!=null && pList.getRowCount()>0)
![](http://www.blogjava.net/Images/dot.gif)
{
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("list",pList.getResult());
21
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("pages",new Integer(pList.getPages()));
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("rows",new Integer(pList.getRowCount()));
23
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("page",new Integer(pList.getCurrentPage()));
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
25
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
26
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else
27
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
28
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("notFound","true");//找不到数据
29
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
31
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("errMsg","您输入的关键字太短!");
33
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("hotSearch",SearchEngine.getHotSearch(20));
34
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return null;
35
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
36
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
37
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
其中调用的SearchEngine类中有关Lucene部分的源码:
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class SearchEngine
![](http://www.blogjava.net/Images/dot.gif)
{
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private MyRssSearch luceneSearch=new MyRssSearch();
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void doSearchByLucene()
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SearchKey keyObj=readCache();
43
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(keyObj!=null)
![](http://www.blogjava.net/Images/dot.gif)
{
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
result=luceneSearch.search(key,pageSize,currentPage);
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(updateStatus)
![](http://www.blogjava.net/Images/dot.gif)
{
46
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setReadTimes(new Integer(keyObj.getReadTimes().intValue()+1));
47
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.update();
48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
49
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else//缓存中没有该关键字信息,生成关键字搜索结果
51
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
52
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj=new SearchKey();
53
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setTitle(key);
54
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setLastUpdated(new Date());
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setReadTimes(new Integer(1));
56
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setStatus(new Integer(0));
57
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setSequence(new Integer(1));
58
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setVdate(new Date());
59
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.save();
60
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
result=luceneSearch.search(key,pageSize,currentPage);;
61
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
62
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
63
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
64
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
65
1、建立索引库:根据网站新闻信息库中的已有的数据资料建立Lucene索引文件。
2、通过索引库搜索:有了索引后,即可使用标准的词法分析器或直接的词法分析器实现进行全文检索。
3、维护索引库:网站新闻信息库中的信息会不断的变动,包括新增、修改及删除等,这些信息的变动都需要进一步反映到Lucene索引文件中。
下面是myrss.easyjf.com相关代码!
一、索引管理(建立及维护)
索引管理类MyRssIndexManage主要实现根据网站信息库中的数据建立索引,维护索引等。由于索引的过程需要消耗一定的时间,因此,索引管理类实现Runnable接口,使得我们可以在程序中开新线程来运行。
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.lucene;
2
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.Date;
3
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.List;
4
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.analysis.standard.StandardAnalyzer;
5
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.document.Document;
6
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.document.Field;
7
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.index.IndexReader;
8
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.index.IndexWriter;
9
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.MultiFieldQueryParser;
10
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.QueryParser;
11
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Hits;
12
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.IndexSearcher;
13
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Query;
14
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Searcher;
15
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.dbo.EasyJDB;
16
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.news.business.NewsDir;
17
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.news.business.NewsDoc;
18
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.news.business.NewsUtil;
19
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.IPageList;
20
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class MyRssIndexManage implements Runnable
![](http://www.blogjava.net/Images/dot.gif)
{
21
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private String indexDir;
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private String indexType="add";
23
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void run()
![](http://www.blogjava.net/Images/dot.gif)
{
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if("add".equals(indexType))
26
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
normalIndex();
27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else if ("init".equals(indexType)) reIndexAll();
28
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void normalIndex()
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
31
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date start = new Date();
33
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int num=0;
34
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IndexWriter writer=new IndexWriter(indexDir,new StandardAnalyzer(),false);
35
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//NewsDir dir=NewsDir.readBySn();
36
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String scope="(needIndex<2) or(needIndex is null)";
37
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=NewsUtil.pageList(scope,1,50);
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int p=0;p
![](http://www.blogjava.net/Images/dot.gif)
{
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pList=NewsUtil.pageList(scope,p,100);
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=pList.getResult();
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=0;i
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
NewsDoc doc=(NewsDoc)list.get(i);
43
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.addDocument(newsdoc2lucenedoc(doc));
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
num++;
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
46
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
47
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.optimize();
48
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.close();
49
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
EasyJDB.getInstance().execute("update NewsDoc set needIndex=2 where "+scope);
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date end = new Date();
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.print("新增索引"+num+"条信息,一共花:"+(end.getTime() - start.getTime())/60000+"分钟!");
52
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
53
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
54
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
56
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
57
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
58
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void reIndexAll()
59
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
60
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
61
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date start = new Date();
62
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int num=0;
63
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IndexWriter writer=new IndexWriter(indexDir,new StandardAnalyzer(),true);
64
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
NewsDir dir=NewsDir.readBySn("easyjf");
65
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=NewsUtil.pageList(dir,1,50);
66
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int p=0;p
![](http://www.blogjava.net/Images/dot.gif)
{
67
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pList=NewsUtil.pageList(dir,p,100);
68
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=pList.getResult();
69
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=0;i
![](http://www.blogjava.net/Images/dot.gif)
{
70
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
NewsDoc doc=(NewsDoc)list.get(i);
71
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.addDocument(newsdoc2lucenedoc(doc));
72
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
num++;
73
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
74
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
75
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.optimize();
76
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
writer.close();
77
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
EasyJDB.getInstance().execute("update NewsDoc set needIndex=2 where dirPath like 'easyjf%'");
78
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Date end = new Date();
79
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
System.out.print("全部重新做了一次索引,一共处理了"+num+"条信息,花:"+(end.getTime() - start.getTime())/60000+"分钟!");
80
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
81
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
82
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
83
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
84
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
85
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
86
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private Document newsdoc2lucenedoc(NewsDoc doc)
87
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
88
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Document lDoc=new Document();
89
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("title",doc.getTitle(),Field.Store.YES,Field.Index.TOKENIZED));
90
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("content",doc.getContent(),Field.Store.YES,Field.Index.TOKENIZED));
91
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("url",doc.getRemark(),Field.Store.YES,Field.Index.NO));
92
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("cid",doc.getCid(),Field.Store.YES,Field.Index.NO));
93
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("source",doc.getSource(),Field.Store.YES,Field.Index.NO));
94
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
lDoc.add(new Field("inputTime",doc.getInputTime().toString(),Field.Store.YES,Field.Index.NO));
95
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return lDoc;
96
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
97
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public String getIndexDir()
![](http://www.blogjava.net/Images/dot.gif)
{
98
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return indexDir;
99
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
100
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setIndexDir(String indexDir)
![](http://www.blogjava.net/Images/dot.gif)
{
101
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.indexDir = indexDir;
102
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
103
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
104
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public String getIndexType()
![](http://www.blogjava.net/Images/dot.gif)
{
105
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return indexType;
106
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
107
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setIndexType(String indexType)
![](http://www.blogjava.net/Images/dot.gif)
{
108
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.indexType = indexType;
109
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
110
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
111
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
二、使用Lucene实现全文搜索
下面是MyRssSearch类的源码,该类主要实现使用Lucene中Searcher及QueryParser实现从索引库中搜索关键词。
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.lucene;
2
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
3
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.List;
4
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.analysis.standard.StandardAnalyzer;
5
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.document.Document;
6
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.index.IndexReader;
7
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.MultiFieldQueryParser;
8
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.queryParser.QueryParser;
9
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Hits;
10
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.IndexSearcher;
11
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Query;
12
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Searcher;
13
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
14
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.search.MyRssUtil;
15
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.search.SearchContent;
16
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.IPageList;
17
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.PageList;
18
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
19
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class MyRssSearch
![](http://www.blogjava.net/Images/dot.gif)
{
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private String indexDir;
21
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IndexReader ir;
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Searcher search;
23
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public IPageList search(String key,int pageSize,int currentPage)
24
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=new PageList(new HitsQuery(doSearch(key)));
26
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
pList.doList(pageSize,currentPage,"","",null);
27
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(pList!=null)
28
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=pList.getResult();
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(list!=null)
![](http://www.blogjava.net/Images/dot.gif)
{
31
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=0;i
![](http://www.blogjava.net/Images/dot.gif)
{
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
list.set(i,lucene2searchObj((Document)list.get(i),key));
33
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
34
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
35
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
36
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
37
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(search!=null)search.close();
38
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(ir!=null)ir.close();
39
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
43
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return pList;
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
46
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private SearchContent lucene2searchObj(Document doc,String key)
47
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
48
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SearchContent searchObj=new SearchContent();
49
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String title=doc.getField("title").stringValue();
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setTitle(title.replaceAll(key,""+key+""));
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setTvalue(doc.getField("cid").stringValue());
52
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setUrl(doc.getField("url").stringValue());
53
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setSource(doc.getField("source").stringValue());
54
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setLastUpdated(doc.getField("inputTime").stringValue());
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
searchObj.setIntro(MyRssUtil.content2intro(doc.getField("content").stringValue(),key));
56
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return searchObj;
57
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
58
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public Hits doSearch(String key)
59
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
60
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Hits hits=null;
61
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
62
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
ir=IndexReader.open(indexDir);
63
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
search=new IndexSearcher(ir);
64
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
String fields[]=
![](http://www.blogjava.net/Images/dot.gif)
{"title","content"};
65
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
QueryParser parser=new MultiFieldQueryParser(fields,new StandardAnalyzer());
66
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
Query query=parser.parse(key);
67
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
hits=search.search(query);
68
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
69
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
70
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
71
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
72
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
73
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
//System.out.println("搜索结果:"+hits.length());
74
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return hits;
75
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
76
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
77
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public String getIndexDir()
![](http://www.blogjava.net/Images/dot.gif)
{
78
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return indexDir;
79
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
80
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setIndexDir(String indexDir)
![](http://www.blogjava.net/Images/dot.gif)
{
81
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.indexDir = indexDir;
82
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
83
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
84
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
在上面的代码中,search方法返回一个封装了分页查询结果的IPageList,IPageList是EasyJWeb Tools业务引擎中的分页引擎,对于IPageList的使用,请看本人写的这篇文章《EasyJWeb Tools中业务引擎分页的设计实现》:
我们针对Lucene的的查询结果Hits结构,写了一个查询器HitsQuery。代码如下所示:
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.lucene;
2
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.ArrayList;
3
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.Collection;
4
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import java.util.List;
5
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import org.apache.lucene.search.Hits;
6
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
import com.easyjf.web.tools.IQuery;
7
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class HitsQuery implements IQuery
![](http://www.blogjava.net/Images/dot.gif)
{
8
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int begin=0;
9
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private int max=0;
10
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private Hits hits;
11
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public HitsQuery()
12
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
13
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
14
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
15
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public HitsQuery(Hits hits)
16
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
17
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(hits!=null)
18
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
19
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.hits=hits;
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.max=hits.length();
21
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
22
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
23
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public int getRows(String arg0)
![](http://www.blogjava.net/Images/dot.gif)
{
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
25
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return (hits==null?0:hits.length());
26
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
27
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public List getResult(String arg0)
![](http://www.blogjava.net/Images/dot.gif)
{
28
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
29
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
List list=new ArrayList();
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
for(int i=begin;i<(begin+max)&&(i
![](http://www.blogjava.net/Images/dot.gif)
{
31
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
try
![](http://www.blogjava.net/Images/dot.gif)
{
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
list.add(hits.doc(i));
33
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
34
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
catch(Exception e)
35
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
36
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
e.printStackTrace();
37
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return list;
40
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setFirstResult(int begin)
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
43
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.begin=begin;
44
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setMaxResults(int max)
![](http://www.blogjava.net/Images/dot.gif)
{
46
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
47
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
this.max=max;
48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
49
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public void setParaValues(Collection arg0)
![](http://www.blogjava.net/Images/dot.gif)
{
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
51
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
52
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
53
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
public List getResult(String condition, int begin, int max)
![](http://www.blogjava.net/Images/dot.gif)
{
54
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
// TODO Auto-generated method stub
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if((begin>=0)&&(begin if(!(max>hits.length()))this.max=max;
56
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return getResult(condition);
57
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
58
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
59
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
三、Web调用
下面我们来看看在Web中如果调用商业逻辑层的全文检索功能。下面是处理用户请请的Action中关于搜索部分的源码:
1
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
package com.easyjf.news.action;
2
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class SearchAction implements IWebAction
![](http://www.blogjava.net/Images/dot.gif)
{
3
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public Page doSearch(WebForm form,Module module)throws Exception
4
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
5
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String key=CommUtil.null2String(form.get("v"));
6
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
key=URLDecoder.decode(URLEncoder.encode(key,"ISO8859_1"),"utf-8");
7
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.set("v",key);
8
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("v2",URLEncoder.encode(key,"utf-8"));
9
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(key.getBytes().length>2)
![](http://www.blogjava.net/Images/dot.gif)
{
10
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
String orderBy=CommUtil.null2String(form.get("order"));
11
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int currentPage=CommUtil.null2Int(form.get("page"));
12
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
int pageSize=CommUtil.null2Int(form.get("pageSize"));
13
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(currentPage<1)currentPage=1;
14
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
if(pageSize<1)pageSize=15;
15
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SearchEngine search=new SearchEngine(key,orderBy,pageSize,currentPage);
16
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
search.getLuceneSearch().setIndexDir(Globals.APP_BASE_DIR+"/WEB-INF/index");
17
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
search.doSearchByLucene();
18
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
IPageList pList=search.getResult();
19
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(pList!=null && pList.getRowCount()>0)
![](http://www.blogjava.net/Images/dot.gif)
{
20
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("list",pList.getResult());
21
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("pages",new Integer(pList.getPages()));
22
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("rows",new Integer(pList.getRowCount()));
23
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("page",new Integer(pList.getCurrentPage()));
24
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
25
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
26
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else
27
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
28
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("notFound","true");//找不到数据
29
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
30
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
31
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else
32
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("errMsg","您输入的关键字太短!");
33
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
form.addResult("hotSearch",SearchEngine.getHotSearch(20));
34
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
return null;
35
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
36
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
37
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
其中调用的SearchEngine类中有关Lucene部分的源码:
38
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif)
public class SearchEngine
![](http://www.blogjava.net/Images/dot.gif)
{
39
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
private MyRssSearch luceneSearch=new MyRssSearch();
40
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
public void doSearchByLucene()
41
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
42
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
SearchKey keyObj=readCache();
43
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(keyObj!=null)
![](http://www.blogjava.net/Images/dot.gif)
{
44
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
result=luceneSearch.search(key,pageSize,currentPage);
45
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
if(updateStatus)
![](http://www.blogjava.net/Images/dot.gif)
{
46
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setReadTimes(new Integer(keyObj.getReadTimes().intValue()+1));
47
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.update();
48
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
49
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
50
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
else//缓存中没有该关键字信息,生成关键字搜索结果
51
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif)
![](http://www.blogjava.net/Images/dot.gif)
{
52
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj=new SearchKey();
53
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setTitle(key);
54
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setLastUpdated(new Date());
55
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setReadTimes(new Integer(1));
56
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setStatus(new Integer(0));
57
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setSequence(new Integer(1));
58
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.setVdate(new Date());
59
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
keyObj.save();
60
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
result=luceneSearch.search(key,pageSize,currentPage);;
61
![](http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif)
62
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
63
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
}
64
![](http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif)
}
65
![](http://www.blogjava.net/Images/OutliningIndicators/None.gif)
相关文章推荐
- lucene全文检索应用示例及代码简析
- 在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介
- 在应用中加入全文检索功能—基于Java的全文索引引擎Lucene简介(收藏)
- 在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介
- 全文检索框架Lucene——Demo应用
- 全文检索框架Lucene——Demo应用
- 全文检索框架Lucene——Demo应用
- 在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介
- 全文检索Lucene 应用(一)
- Lucene全文检索应用示例及代码简析
- 全文检索框架Lucene——Demo应用
- 在应用中加入全文检索功能 ——基于Java的全文索引引擎Lucene简介
- lucene全文检索应用示例及代码简析
- Lucene全文检索学习笔记(一):lucene的应用
- lucene全文检索应用示例及代码简析
- lucene全文检索应用示例及代码简析
- lucene全文检索应用示例及代码简析
- [转]在应用中加入全文检索功能(基于Java的全文索引引擎Lucene简介)
- 使用Lucene-1.3-final在web上建立全文检索应用
- lucene全文检索应用示例及代码简析