Lucene实现简单的索引创建和搜索

创建索引这里是以一张表中两个字段创建一个索引
<%@ page language="java" pageEncoding="GBK"%>
<%@page import="org.apache.lucene.document.Document"%>
<%@page import="org.apache.lucene.document.Field"%>
<%@page import="org.apache.lucene.store.FSDirectory"%>
<%@page import="org.apache.lucene.store.Directory"%>
<%@page import="org.apache.lucene.index.IndexWriter"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.lucene.analysis.standard.StandardAnalyzer"%>
<%@page import="org.apache.lucene.analysis.Analyzer"%>
<%@ include file="/common/common.jsp" %>
<%
GoodsService goodsService = GoodsService.instance();
List<Goods> list = goodsService.getLatestList(1,200);
Directory directory = FSDirectory.open(new File("e:\\index"));
Analyzer analyzer = new StandardAnalyzer();
IndexWriter indexWriter = new IndexWriter(directory,analyzer,true);
long begin = System.currentTimeMillis();
for(int i=0;i<list.size();i++){
Goods goods = list.get(i);
Document doc = new Document();
Field id = new Field("id",goods.getId()+"",Field.Store.YES,Field.Index.NOT_ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);
Field title = new Field("title",goods.getTitle(),Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS);
doc.add(id);
doc.add(title);
indexWriter.addDocument(doc);
}
long end = System.currentTimeMillis();
System.out.println("建索引需要的时间:" + (end - begin));
indexWriter.optimize();
indexWriter.close();
%>

实现搜索
<%@ page language="java" pageEncoding="GBK"%>
<%@page import="org.apache.lucene.document.Document"%>
<%@page import="org.apache.lucene.search.IndexSearcher"%>
<%@page import="org.apache.lucene.analysis.standard.StandardAnalyzer"%>
<%@page import="org.apache.lucene.analysis.Analyzer"%>
<%@page import="java.io.File"%>
<%@page import="org.apache.lucene.queryParser.QueryParser"%>
<%@page import="org.apache.lucene.store.FSDirectory"%>
<%@page import="org.apache.lucene.store.Directory"%>
<%@page import="org.apache.lucene.search.Query"%>
<%@page import="org.apache.lucene.search.Hits"%>
<%@ include file="/common/common.jsp" %>
<%
String keyword = T.stringValue(request.getParameter("k"),null);
GoodsService goodsService = GoodsService.instance();
Goods goods = null;
if(keyword != null){
Hits hits = null;
Query query = null;
Directory directory = FSDirectory.open(new File("e:\\index"));
IndexSearcher indexSearcher = new IndexSearcher(directory);
Analyzer analyzer = new StandardAnalyzer();
try{
QueryParser queryParser = new QueryParser("title",analyzer);
query = queryParser.parse(keyword);
}catch(Exception e){
}

if(indexSearcher != null){
hits = indexSearcher.search(query);
if(hits.length() > 0){
out.println("搜索出来的结果为。。。。<br>");
if(hits.length() == 1){
Document doc = hits.doc(0);
//其实这个只要根据doc也可以获取到title字段,只是考虑一张表很多个字段,而只是拿几个出来建索引,要想获取详细的信息还必须查找数据库找到相应的字段
goods = goodsService.find(Long.valueOf(doc.get("id")));
if(goods != null){
out.println("{'id':"+goods.getId() +",'title':"+goods.getTitle()+"}<br>");
}
}else{
int length = hits.length();
for(int i=0;i<length;i++){
Document doc = hits.doc(i);
if(doc != null){
goods = goodsService.find(Long.valueOf(doc.get("id")));
if(goods != null){
out.println("{'id':"+goods.getId() +",'title':"+goods.getTitle()+"}<br>");
}
}
}
}
}
}
}
%>

猜你喜欢

转载自chenshengzun.iteye.com/blog/1396775