您查看的文章来源于http://www.oklinux.cn 下面是MyRssSearch类的源码,该类主要实现使用Lucene中Searcher及QueryParser实现从索引库中搜索关键词。 package com.easyjf.lucene;
import java.util.List; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.index.IndexReader; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query; import org.apache.lucene.search.Searcher;
import com.easyjf.search.MyRssUtil; import com.easyjf.search.SearchContent; import com.easyjf.web.tools.IPageList; import com.easyjf.web.tools.PageList;
public class MyRssSearch { private String indexDir; IndexReader ir; Searcher search; public IPageList search(String key,int pageSize,int currentPage) { IPageList pList=new PageList(new HitsQuery(doSearch(key))); pList.doList(pageSize,currentPage,"","",null); if(pList!=null) { List list=pList.getResult(); if(list!=null){ for(int i=0;i { list.set(i,lucene2searchObj((Document)list.get(i),key)); } } } try{ if(search!=null)search.close(); if(ir!=null)ir.close(); } catch(Exception e) { e.printStackTrace(); } return pList; } private SearchContent lucene2searchObj(Document doc,String key) { SearchContent searchObj=new SearchContent(); String title=doc.getField("title").stringValue(); searchObj.setTitle(title.replaceAll(key,"" key "")); searchObj.setTvalue(doc.getField("cid").stringValue()); searchObj.setUrl(doc.getField("url").stringValue()); searchObj.setSource(doc.getField("source").stringValue()); searchObj.setLastUpdated(doc.getField("inputTime").stringValue()); searchObj.setIntro(MyRssUtil.content2intro(doc.getField("content").stringValue(),key)); return searchObj; } public Hits doSearch(String key) { Hits hits=null; try{ ir=IndexReader.open(indexDir); search=new IndexSearcher(ir); String fields[]={"title","content"}; QueryParser parser=new MultiFieldQueryParser(fields,new StandardAnalyzer()); Query query=parser.parse(key); hits=search.search(query); } catch(Exception e) { e.printStackTrace(); } //System.out.println("搜索结果:" hits.length()); return hits; } public String getIndexDir() { return indexDir; } public void setIndexDir(String indexDir) { this.indexDir = indexDir; } }
在上面的代码中,search方法返回一个封装了分页查询结果的IPageList,IPageList是EasyJWeb Tools业务引擎中的分页引擎,对于IPageList的使用,请看本人写的这篇文章《EasyJWeb Tools中业务引擎分页的设计实现》:
我们针对Lucene的的查询结果Hits结构,写了一个查询器HitsQuery。代码如下所示: package com.easyjf.lucene; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.lucene.search.Hits; import com.easyjf.web.tools.IQuery; public class HitsQuery implements IQuery { private int begin=0; private int max=0; private Hits hits; public HitsQuery() { } public HitsQuery(Hits hits) { if(hits!=null) { this.hits=hits; this.max=hits.length(); } } public int getRows(String arg0) { // TODO Auto-generated method stub return (hits==null?0:hits.length()); } public List getResult(String arg0) { // TODO Auto-generated method stub List list=new ArrayList(); for(int i=begin;i<(begin max)&&(i { try{ list.add(hits.doc(i)); } catch(Exception e) { e.printStackTrace(); } } return list; } public void setFirstResult(int begin) { // TODO Auto-generated method stub this.begin=begin; } public void setMaxResults(int max) { // TODO Auto-generated method stub this.max=max; } public void setParaValues(Collection arg0) { // TODO Auto-generated method stub } public List getResult(String condition, int begin, int max) { // TODO Auto-generated method stub if((begin>=0)&&(begin if(!(max>hits.length()))this.max=max; return getResult(condition); }
共3页: 上一页 [1] 2 [3] 下一页 |