2012-08-03 5 views
3

J'ai créé un index à l'aide de certaines données. Maintenant, j'utilise WildcardQuery pour rechercher ces données. Les documents indexés portent un nom de domaine Product Code contre lequel je suis en train de chercher.WildcardQuery ne renvoie pas le résultat correct

est Ci-dessous le code que j'utilise pour créer la requête et la recherche:

Term productCodeTerm = new Term("Product Code", "*"+searchText+"*");

query = new WildcardQuery(productCodeTerm);

searcher.search(query, 100);

La variable searchText contient la chaîne de recherche qui est utilisé pour la recherche l'index. Dans le cas où searchString est « jf », je reçois le résultat suivant:

JF32358 
JF5215 
JF2592 

Maintenant, lorsque je tente de rechercher à l'aide 25, or f2 or f3 ou toute autre chose autre que d'utiliser uniquement j,f,jf, la requête n'a pas de résultats. Je ne suis pas capable de comprendre pourquoi cela se passe. Quelqu'un peut-il m'aider à comprendre la raison pour laquelle la recherche se comporte de cette manière?

+0

cas sensible problème? related: http://stackoverflow.com/questions/2432486/lucene-wildcard-queries –

+0

Case n'est pas le problème ici. Les parties numériques sont toujours les mêmes, elles ne sont pas en majuscules ou en minuscules. – Logan

+0

mais vous avez dit 'f2', 'f3' et pas seulement '2' ou '3'. –

Répondre

2

Quel analyseur avez-vous utilisé au moment de l'indexation? Compte tenu de vos exemples, vous devez vous assurer que votre analyseur:

  • fait en minuscules,
  • ne supprime pas les chiffres,
  • ne fractionne pas aux frontières entre les lettres et les chiffres.
+0

J'ai utilisé StopAnalyzer pour indexage. Il fait des minuscules, ne supprime pas les chiffres. Bien que je ne suis pas sûr du point 3. Mais même si elle se divise aux limites entre les lettres et les chiffres, alors quand je recherche en utilisant seulement des chiffres (32 par exemple), alors cela devrait fonctionner. Ça ne devrait pas? – Logan

+0

J'ai trouvé le problème. Cela était dû au troisième point mentionné par vous. 'StopAnalyzer' utilise' LetterTokenizer' pour créer des jetons qui vont casser la chaîne à la limite entre les lettres et les chiffres. Merci. – Logan

+0

Mais s'il le fait de cette façon, ne stockera-t-il pas les littéraux numériques ou créera un jeton séparé pour la valeur numérique (ex 32358) ou créera des jetons séparés pour toutes les valeurs numériques (ex 3,2,3,5 , 8)? – Logan

0

Dans la FAQ Lucene page, il dit:

wildcards de premier plan (par exemple * ook) ne sont pas pris en charge par le QueryParser par défaut . Depuis Lucene 2.1, ils peuvent être activés en appelant QueryParser.setAllowLeadingWildcard (true). Notez que cela peut être une opération coûteuse: il faut analyser la liste des jetons dans l'index dans son intégralité pour rechercher ceux qui correspondent au modèle.

Pour plus d'informations, consultez here.

+0

Je n'utilise pas un QueryParser pour analyser la requête Deuxièmement, si le premier caractère générique n'est pas supporté, alors quand je recherche en utilisant la chaîne * f *, je ne devrais obtenir aucun résultat, mais ce n'est pas le cas ici, le problème ne vient que lorsque je n'utilise que des entiers, ou des caractères + entiers – Logan

+0

Désolé, j'ai mal compris votre question –

+1

Ok, merci d'avoir essayé. :) – Logan

Questions connexes