6

インデックス付きデータベース内の複数のフィールドを検索するインデックス サーチャーを 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が初めてです。だから私は問題を解決するために助けを求めています。

4

1 に答える 1