2009-03-18 5 views
0

Si vous postez cette question à nouveau, ma requête ne reçoit pas de réponse. Je travaille sur une API de recherche de livre en utilisant Lucene. L'utilisateur peut rechercher un livre dont le champ de titre ou de description contient C.F.A ... Utilisez StandardAnalyzer avec une liste de mots d'arrêt. J'utilise MultiFieldQueryParser pour analyser la chaîne ci-dessus. Mais après l'analyse, il supprime les points de la chaîne. Qu'est-ce que j'oublie ici?MultiFieldQueryParser supprime des points de l'acronyme

Merci.

Répondre

1

(je suis seulement familier avec Java Lucene, mais j'imagine qu'il n'a pas d'importance dans ce cas.)

Le but des analyseurs est de dépouiller les caractères et la mise en forme qui empêche la recherche de texte intégral efficace . Par exemple, si vous écrivez un document où vous ne faites référence qu'à lucene comme "lucene.net", vous voudrez probablement que lucene renvoie également les résultats de recherche pour "lucene". Par conséquent, le StandardAnalyzer supprime les points (ainsi que d'autres caractères spéciaux).

Ne vous inquiétez pas cependant. Comme toujours avec lucene cela peut être configuré, dans ce cas en choisissant un analyseur différent. Essayez à la place d'utiliser SimpleAnalyzer ou KeywordAnalyzer et déterminez lequel est le plus proche du comportement souhaité. Si aucun d'entre eux ne le fait, vous pouvez même implémenter votre propre analyseur personnalisé en utilisant l'interface de l'analyseur. C'est en fait assez simple.

Bonne chance. :)

7

Comme vous l'avez mentionné, il s'agit d'une dupe de this question. Je vous suggère au moins d'ajouter un lien dans votre question. De plus, je vous invite à créer un compte d'utilisateur, car pour l'instant, il n'est pas possible de regarder votre ancienne question pour obtenir un contexte.

Le StandardAnalyzer gère spécifiquement les acronymes et convertit les C.F.A. (par exemple) à cfa. Cela signifie que vous devriez être capable de faire la recherche, à condition de vous assurer que vous utilisez le même analyseur pour l'indexation et pour l'analyse des requêtes.

Je vous suggérerais d'exécuter quelques cas de test de base pour éliminer d'autres facteurs. Essayez d'utiliser un QueryParser ordinaire au lieu d'un multi-champ.

est ici un code que j'ai écrit à jouer avec le StandardAnalyzer:

StringReader testReader = new StringReader("C.F.A. C.F.A word"); 
StandardAnalyzer analyzer = new StandardAnalyzer(); 
TokenStream tokenStream = analyzer.tokenStream("title", testReader); 
System.out.println(tokenStream.next()); 
System.out.println(tokenStream.next()); 
System.out.println(tokenStream.next()); 

La sortie pour cela, par la voie était:

(cfa,0,6,type=<ACRONYM>) 
(c.f.a,7,12,type=<HOST>) 
(word,13,17,type=<ALPHANUM>) 

note, par exemple, que si l'acronyme n » t se termine par un point puis l'analyseur suppose qu'il s'agit d'un nom d'hôte Internet, donc la recherche de "CFA" ne correspondra pas à "CFA" dans le texte.