インデックス付きデータベース内の複数のフィールドを検索するインデックス サーチャーを Lucene で作成しました。
実際には、クエリを 2 つの文字列として受け取ります。1 つは saytitle
で、もう 1 つは ですcityname
。
現在、インデックス付きデータベースには 3 つのフィールドがあります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()の出力が" +title:pizza +(title:hut city:hut) +city:mumbai " として来ているので、データベースの city フィールドでも "Hut" を見つけています。
for ループの結果として、インデックス outOfBound エラーが発生しています。
私はLuceneが初めてです。だから私は問題を解決するために助けを求めています。