我在Lucene中編寫了一個索引搜索器,它將搜索索引數據庫中的多個字段。Lucene中的多字段查詢處理
其實它需要查詢爲兩個字符串,一個是title
,另一個是cityname
。
現在索引數據庫有三個字段:title, address and city
。
僅當標題匹配和城市名稱匹配時纔會發生點擊。爲此目的,我寫了使用MultiFieldQuerySearcher
與後的幫助下面的搜索代碼:
public void searchdb(String myQuery, String myCity) throws Exception
{
System.out.println("Searching in the database ...");
String[] fields={"title","address","city"};
MultiFieldQueryParser parser = new MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, new StandardAnalyzer(Version.LUCENE_CURRENT));
parser.setDefaultOperator(QueryParser.Operator.AND);
if(!myQuery.toLowerCase().contains(myCity.toLowerCase()))
{
myQuery="title:"+myQuery+" "+"address:"+myQuery+" "+myCity+" "+"city:"+myCity;
}
Query query=parser.parse(myQuery);
if (query instanceof BooleanQuery)
{
BooleanClause.Occur[] flags ={BooleanClause.Occur.MUST,BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST};
BooleanQuery booleanQuery = (BooleanQuery) query;
BooleanClause[] clauses = booleanQuery.getClauses();
System.out.println("Query="+booleanQuery.toString()+" and Number of clauses="+clauses.length);
for (int i = 0; i < clauses.length; i++)
{
clauses[i].setOccur(flags[i]);
}
Directory dir=FSDirectory.open(new File("demoIndex"));
IndexSearcher searcher = new IndexSearcher(dir, true);
TopDocs hits = searcher.search(booleanQuery, 20);
searcher.close();
dir.close();
System.out.println("Number of hits="+hits.totalHits);
}
}
但運行不正常。
例如,如果查詢是「必勝客」而城市是「孟買」,我只希望在數據庫的標題字段和孟買僅在數據庫的城市字段中搜索「必勝客」。
但它是尋找「必勝客」也可在數據庫作爲語句booleanQuery.toString的輸出城市場()即將爲「+標題:比薩+(標題:小屋城市:小屋) + city:mumbai「。
作爲for循環的結果,它給出索引outOfBound錯誤。
我是Lucene的新手。所以我正在尋求幫助來解決這個問題。
請問你能分享一下你的代碼嗎? – jbakirov