import java.util.StringTokenizer; import org.apache.lucene.search.*; import org.apache.lucene.index.IndexReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.document.Document; /** * Created by IntelliJ IDEA. * User: qiao * Date: 2008-1-23 * Time: 15:51:29 * To change this template use File | Settings | File Templates. */ public class Search { private int iHits = 0; private String sMultiHits = ""; private String sDatabase = ""; private String sQuery = ""; private String sSortField = ""; private boolean bSort = false; private String sResult = ""; private String sPath = ""; private String sFieldList = ""; public int getHits() { return this.iHits; } public String getArrHits() { return this.sMultiHits; } public String getResult() { return this.sResult; } public void initial(String sPath,String sIndexDatabase,String sQueryInput,String sSortField,boolean bSort,String sFieldList) { this.sPath = sPath; this.sDatabase = sIndexDatabase; this.sQuery = sQueryInput; this.sSortField = sSortField; this.bSort = bSort; this.sFieldList = sFieldList; } public void searchAllWithResult(int iPage, int iPageSize) { String sErrorMessage = ""; boolean bError = false; this.iHits = 0; StringTokenizer sDbToken = new StringTokenizer(this.sDatabase, ";"); //錕矯碉拷錕斤拷錕叫碉拷錕斤拷菘錕? int iDbNum = sDbToken.countTokens(); //錕斤拷菘錕斤拷錕僥? IndexSearcher[] _arrSearchers = new IndexSearcher[iDbNum]; Query _query = null; //the Query created by the QueryParser Hits _hits = null; int iDocIndex = (iPage-1) * iPageSize; try { for (int i = 0; i < iDbNum; i++) { String sDbName = sDbToken.nextToken(); String sIndexName = this.sPath + "//" + sDbName; _arrSearchers[i] = new IndexSearcher(IndexReader.open(sIndexName)); //create an indexSearcher for our page } } catch (Exception e) { //any error that happens is probably due //to a permission problem or non-existant //or otherwise corrupt index bError = true; //don't do anything up to the footer sErrorMessage = "ERROR opening the Index - contact sysadmin!" + e.getMessage(); System.out.println(sErrorMessage); } if (this.sQuery == null) { bError = true; sErrorMessage = "Query string is null!"; } if (bError == false) { try { Analyzer _analyzer = new StandardAnalyzer(); //construct our usual analyzer QueryParser _parser = new QueryParser("AB", _analyzer); _query = _parser.parse(this.sQuery); } catch (ParseException e) { bError = true; sErrorMessage = "Error While parsing query:" + e.getMessage(); } } if (bError == false) { try { MultiSearcher _multiSearcher = new MultiSearcher(_arrSearchers); if (sSortField.equalsIgnoreCase("")) { _hits = _multiSearcher.search(_query); } else { Sort _st = new Sort(); _st.setSort(sSortField, bSort); //錕斤拷錕斤拷錕斤拷錕斤拷 _hits = _multiSearcher.search(_query, _st); } this.iHits = _hits.length(); if (_hits.length() == 0) { bError = true; sErrorMessage = "I'm sorry I couldn't find what you were looking for."; } else { int iBegin = (iPage - 1) * iPageSize; int iEnd = 0; if (iPage * iPageSize > this.iHits) { iEnd = _hits.length(); } else { iEnd = iPage * iPageSize; } String[] sArrFields = this.sFieldList.split(";"); this.sResult = "<docs>"; for (int i = iBegin; i < iEnd; i++) { Document doc = _hits.doc(i); this.sResult = this.sResult + "<doc>"; sResult = sResult + "<id>" + (iDocIndex+1) + "</id>"; for (int j = 0; j < sArrFields.length; j++) { this.sResult = this.sResult + "<fld name=/"" + sArrFields[j] + "/">"; this.sResult = this.sResult + doc.get(sArrFields[j]); this.sResult = this.sResult + "</fld>"; } this.sResult = this.sResult + "</doc>"; iDocIndex++; } } _multiSearcher.close(); } catch (Exception ex) { System.out.println(ex.getMessage()); bError = true; sErrorMessage = "I'm sorry I couldn't find what you were looking for."; } } for(int i=0;i<_arrSearchers.length;i++) { try { _arrSearchers[i].close(); _arrSearchers[i] = null; } catch(Exception ex) { System.out.print(ex.getMessage()); } } _hits = null; } public void searchEvyWithResult(int iPage,int iPageSize) { this.iHits = 0; this.sMultiHits = ""; StringTokenizer sDbToken = new StringTokenizer(this.sDatabase, ";"); //錕矯碉拷錕斤拷錕叫碉拷錕斤拷菘錕? int iDbNum = sDbToken.countTokens(); int iBegin = (iPage-1) * iPageSize; int iEnd = iPage * iPageSize; int iDocIndex = (iPage-1) * iPageSize; String [] sArrFields = this.sFieldList.split(";"); this.sResult = "<docs>"; for(int i=0;i<iDbNum;i++) { String sDbName = sDbToken.nextToken(); String sIndexName = this.sPath + "//" + sDbName; IndexReader _reader = null; Searcher _searcher = null; Analyzer _analyzer = new StandardAnalyzer(); QueryParser _parser = new QueryParser("AB", _analyzer); try { _reader = IndexReader.open(sIndexName); _searcher = new IndexSearcher(_reader); Query _query = _parser.parse(sQuery); Hits _hits = _searcher.search(_query); int iLen = _hits.length(); if (iLen != 0) { int iBIn = iBegin; int iEIn = iEnd; if (iBegin == 0) { if (iLen <= iEnd) { iEIn = iLen; iBegin = iLen; } } else { if (iBegin >= this.iHits && iBegin < (this.iHits + iLen)) { iBIn = (iBegin - this.iHits); if ((this.iHits + iLen) <= iEnd) { iEIn = iLen; iBegin = this.iHits + iLen; } else { iEIn = iEnd - this.iHits; } } } if(iLen > iBIn) { for (int j = iBIn; j < iEIn; j++) { Document doc = _hits.doc(j); sResult = sResult + "<doc>"; sResult = sResult + "<id>" + (iDocIndex + 1) + "</id>"; for (int m = 0; m < sArrFields.length; m++) { sResult = sResult + "<fld name=/"" + sArrFields[m] + "/">"; sResult = sResult + doc.get(sArrFields[m]); sResult = sResult + "</fld>"; } sResult = sResult + "</doc>"; iDocIndex ++ ; } } } this.iHits = this.iHits + iLen; this.sMultiHits = this.sMultiHits + ";" + iLen; _searcher.close(); _reader.close(); _searcher = null; _reader = null; } catch(Exception ex) { System.out.println(ex.getMessage()); } } this.sMultiHits = this.sMultiHits.substring(1); this.sResult = this.sResult + "</docs>"; } public void searchEvyWithoutResult() { this.iHits = 0; this.sMultiHits = ""; StringTokenizer sDbToken = new StringTokenizer(this.sDatabase, ";"); //錕矯碉拷錕斤拷錕叫碉拷錕斤拷菘錕? int iDbNum = sDbToken.countTokens(); for(int i=0;i<iDbNum;i++) { String sDbName = sDbToken.nextToken(); String sIndexName = this.sPath + "//" + sDbName; IndexReader _reader = null; Searcher _searcher = null; Analyzer _analyzer = new StandardAnalyzer(); QueryParser _parser = new QueryParser("AB", _analyzer); try { _reader = IndexReader.open(sIndexName); _searcher = new IndexSearcher(_reader); Query _query = _parser.parse(sQuery); Hits _hits = _searcher.search(_query); int iLen = _hits.length(); this.sMultiHits = this.sMultiHits + ";" + iLen; this.iHits = this.iHits + iLen; _searcher.close(); _reader.close(); _searcher = null; _reader = null; } catch(Exception ex) { System.out.println(ex.getMessage()); } } this.sMultiHits = this.sMultiHits.substring(1); } public void search(int iPage,int iPageSize) { if(this.sSortField.equalsIgnoreCase("")) { searchEvyWithResult(iPage,iPageSize); } else { searchAllWithResult(iPage,iPageSize); searchEvyWithoutResult(); } } public static void main(String[] args) { Search _sch = new Search(); _sch.initial("D://TestShanghai//server//data","MedicineStandardCN","TI:錕斤拷血壓 OR TI:hypertension","PN",false,"PN;TI;PA"); _sch.search(1,20); //_sch.searchEvyWithoutResult();//(8,100); System.out.println(_sch.getHits()); System.out.println(_sch.getArrHits()); System.out.print(_sch.getResult()); } } |
我們自己的lusecn搜索引擎
日誌 > 技術交流
評論列表
溫馨提示:點擊驗證碼輸入框,以獲取驗證碼
請輸入驗證碼:
loading......
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.