我在 Lucene 中编写了一个索引搜索器,它将搜索索引数据库中的多个字段。
实际上它将查询作为两个字符串,一个是say 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);
}
}
但它运行不正常。
例如,如果查询是“Pizza Hut”,城市是“Mumbai”,我希望仅在数据库的标题字段中搜索“Pizza Hut”,仅在数据库的城市字段中搜索 Mumbai。
但它也在数据库的 city 字段中找到“Hut”,因为语句booleanQuery.toString()的输出为“ +title:pizza +(title:hut city:hut) +city:mumbai ”。
结果在 for 循环中给出了 index outOfBound 错误。
我是 Lucene 的新手。所以我正在寻求帮助来解决这个问题。