Plusieurs Requête de Champ de manutention dans Lucene

J'ai écrit un indice de chercheur dans Lucene qui permettra d'effectuer une recherche sur plusieurs champs dans la base de données indexée.

Effectivement il faut de la requête que les deux chaînes est dire title et un autre est cityname.

Maintenant la base de données indexée a trois champs: title, address and city.

Touché doit se produire uniquement si le titre correspond à et le nom de la ville de matchs. À cette fin, j'ai écrit ce qui suit à la recherche de code à l'aide de MultiFieldQuerySearcher avec l'aide d'un post:

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);
    }
}

Mais il ne fonctionne pas correctement.

Par exemple, si la requête est "Pizza Hut" et la ville est "Mumbai", je veux "Pizza Hut" à rechercher seulement dans le champ titre de la base de données et Mumbai seulement dans la ville de champ de la base de données.

Mais il s'agit de trouver "Refuge" dans la ville de champ de la base de données comme la sortie de la déclaration de booleanQuery.toString() est venue en tant que "+titre:pizza +(titre:la cabane de la ville:cabane) +ville:mumbai".

Comme un résultat de la boucle for c'est de donner de l'indice de outOfBound erreur.

Je suis nouveau sur Lucene. Donc, je demande de l'aide pour résoudre le problème.

pourriez-vous s'il vous plaît partager votre code?

OriginalL'auteur Joy | 2013-03-31