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.
OriginalL'auteur Joy | 2013-03-31
Vous devez vous connecter pour publier un commentaire.
Nous utilisons MultiFieldQueryParser seulement quand nous voulons à la recherche de la même mot-clé(s) dans de multiples domaines.
Pour traiter votre cas d'utilisation, il est plus simple que vous avez déjà des références à la ville de mot-clé et de titre mot-clé séparément. Essayez d'utiliser de code suivant.
Mais Monsieur il y a un problème. Dans mon index, il y a une entrée dont le titre est "Pizza Hut" et la ville est "Mumbai". Quand je suis à l'interrogation de l'index avec le titre "Pizza" et la ville "MUmbai", le nombre de visites s'avère être 0. Mais il devrait être l'un, d'après ma compréhension que les deux termes sont présents dans leurs champs. Pouvez-vous expliquer?
1) assurez-vous que vous utilisez le même Analyseur lors de l'indexation et d'interrogation.--- 2) s'il vous plaît d'impression de la dernière requête à la sortie et de le coller ici.---3) Utiliser Luc pour examiner votre Index. Il est extrêmement simple à utiliser. C'est un outil graphique pour explorer et d'inspecter l'Index Lucene. Utilisation Luc pour vérifier si l'Index contient ce que vous attendez.--- BTW, pas plus de "sir" s'il vous plaît.. 🙂
Dernière question est : +ville:mumbai +titre:la pizza. Et oui, j'ai utilisé StandardAnalyzer() à la fois lors de l'indexation et d'interrogation. Oui j'ai installé LukeAll. Pas d'index nom de la ville c'est à dire Mumbai n'est pas mis en minuscule mais dans la requête le nom de la ville est en train d'être mis en minuscule. C'est probablement pourquoi le nombre de visites est en train de devenir zéro. Mais comment cela peut être possible? J'ai utilisé la même analyseur dans les deux cas.
En fait au début j'ai fait de la ville un champ à l'indice de NOT_ANALYZED. Donc, dans l'index, il n'a pas été mis en minuscule et même après rectification que j'ai oublié de lancer l'indexeur de nouveau.Au lieu de cela j'ai continué à exécuter le chercheur de nouveau et de nouveau, donc, dans le Luc, j'ai été voir le champ ville pas comme lowercase. Qui a été la cause de la non-concordance. Désolé pour mon erreur.
OriginalL'auteur phani