Mot clé (ou, et) recherche dans Lucene

J'utilise Lucene dans mon portail (basé sur J2EE) pour l'indexation et les services de recherche.

le problème concerne les mots-clés de Lucène. Lorsque vous utilisez l'un d'eux dans la requête de recherche, vous obtiendrez une erreur.

Par exemple:

searchTerms = "ik OR jij"

cela fonctionne très bien, parce qu'il va chercher "ik" ou "jij"

searchTerms = "ik AND jij"

Cela fonctionne bien, il recherche "ik" et "jij"

mais quand vous cherchez:

searchTerms = "OR"
searchTerms = "AND"
searchTerms = "ik OR"
searchTerms = "OR ik"

etc., il échoue avec une erreur:

Component Name: STSE_RESULTS  Class: org.apache.lucene.queryParser.ParseException  Message: Cannot parse 'OR jij': Encountered "OR" at line 1, column 0. 
Was expecting one of: 
... 

cela a du sens, parce que ces mots sont des mots-clés pour Lucene sont probablement réservés et agiront comme mots-clés.

en néerlandais, le mot "OR" est important parce qu'il a une signification pour "Ondernemings Raad". Il est utilisé dans de nombreux textes, et il doit être trouvé. Par exemple "ou" fonctionne, mais ne renvoie pas de textes correspondant au terme "OU". Comment puis-je le rendre consultable?

Comment puis-je échapper au mot-clé "ou"? Ou Comment puis-je dire Lucene de traiter " ou " comme un terme de recherche et non comme un mot-clé.

18
demandé sur Areca 2009-08-21 15:00:06

6 réponses

je suppose que vous avez essayé de mettre le" ou " entre guillemets?

si cela ne fonctionne pas je pense que vous pourriez devoir aller jusqu'à changer la source de Lucene et ensuite recompiler toute la chose, comme l'opérateur "ou" est enfoui profondément à l'intérieur du code. En fait, compiler n'est probablement pas suffisant: vous devrez changer le fichier QueryParser.jj dans le paquet source qui sert D'entrée pour JavaCC, puis lancez JavaCC, puis recompilez l'ensemble.

La bonne nouvelle, toutefois, il n'y a qu'une seule ligne à changer:

| <OR: ("OR" | "||") >

devient

| <OR: ("||") >

de cette façon, vous aurez seulement "||" comme logique ou opérateur. Il y a une génération.xml qui contient aussi L'invocation de JavaCC, mais vous devez télécharger outil vous-même. Je ne peux pas l'essayer pour le moment, j'en ai peur.

C'est peut-être une bonne question pour la liste de diffusion des développeurs de Lucene, mais s'il vous plaît laissez-nous savoir si vous le faites et ils viennent avec une solution plus simple ;-)

4
répondu Robert Petermeier 2009-08-21 15:16:35

OR, NOT et et sont des mots réservés. J'ai résolu ce problème il y a seulement 2 jours en cachant plus bas ces 3 mots dans le terme de recherche de l'utilisateur avant de l'alimenter dans l'analyseur de requête de lucene. Notez que si vous recherchez et remplacez ces mots-clés assurez-vous d'utiliser des limites de mots (\B) afin de ne pas finir par changer des mots tels que ANDROID et ordre.

je laisse alors l'utilisateur spécifier NOT et et en utilisant - et +, à l'instar de Google.

3
répondu cherouvim 2009-08-22 04:19:25

escapade OR et et avec des guillemets ça me va. Alors essayez avec une chaîne Java comme

String query = "field:\"AND\"";

3
répondu Alb 2012-04-20 15:07:39

j'ai lu votre question de nombreuses fois! =[

veuillez jeter un oeil à ces suggestions

comment votre index est-il stocké?

Document contenant les champs stockés peut être stocké comme

1)Stocké 2)Tokenized 3)Indexed 4)Vector

il peut faire une grande différence

s'il vous plaît utiliser Luc, il peut vous dire comment votre index stockées(en fait)

Luke est un have Si vous travaillez avec lucene, comme il vous donne une vraie idée de la façon dont les index sont stockés,il offre également la recherche, essayez-le nous faire savoir avec votre mise à jour!

1
répondu Narayan 2009-08-21 13:10:47

vous faites probablement quelque chose de mal quand vous construisez la requête. Je vais appuyer la suggestion de Narayan sur Obtenir Luke (comme posté dans les commentaires) et essayer d'exécuter vos questions avec cela. Ça fait longtemps que je n'ai pas utilisé Lucene, mais je ne me souviens pas avoir eu de problèmes avec le bloc opératoire et le bloc opératoire.

en dehors de cela, vous pouvez essayer d'échapper aux chaînes de saisie en utilisant QueryParser.escape (userQuery)

En Savoir Plus Sur La Fuite Des

0
répondu Jesse 2009-08-21 12:21:15

vous pouvez échapper au " ou " lorsque c'est un terme de recherche, ou écrire votre propre analyseur de requête pour une syntaxe différente. Lucene offre une API de requête étendue en plus de l'analyseur, avec lequel vous supportez votre propre syntaxe de requête assez facilement.

-1
répondu beetstra 2009-08-21 11:45:49