2009-09-09 8 views
2

Si quelqu'un connaît une réponse simple à cette question, je n'ai pas à patauger à travers la création d'un index supplémentaire avec des chaînes échappées et pleurer mes yeux tout en détruisant mon joli code. Fondamentalement, la recherche Lucene que nous avons en cours d'exécution ne peut pas gérer tous les caractères non-lettre. Espace, signes de pourcentage, points, tirets, barres obliques, vous l'appelez. C'est extrêmement exaspérant, parce que je ne peux faire aucune recherche sur les éléments contenant ces caractères, peu importe où je les échappe ou non.Zend Lucene échoue toutes les recherches avec des caractères spéciaux

J'ai deux options: Tuez ces caractères dans un index séparé et dépouillez-les des noms que je recherche ou arrêtez la foutue recherche.

Répondre

3

Vous pouvez échapper des caractères spéciaux en utilisant '/'. Lucene traite les suivants comme des caractères spéciaux et vous devrez échapper à ces personnages pour le faire fonctionner.

+ - && || ! () { } [ ]^" ~ * ? : \ 

Si vous voulez rechercher "2 + 3", la requête doit être "2/+ 3"

+1

Merci. C'est la bonne réponse (j'ai bêtement essayé d'échapper avec une barre oblique inverse tout le temps). Cependant, nous avons depuis longtemps quitté l'indice Lucene géré par Zend car c'était un sacré bordel. La prochaine fois nous allons sortir une instance de Solr et contourner tout cet enfer. – John

+0

J'ai juste une question! N'ai-je pas besoin d'échapper le signe '$' car c'est un caractère spécial qui marque la fin d'une chaîne? – Ankit

3

Utilisez QueryParser.escape(String s) pour échapper à la chaîne de requête.

+0

Ce n'est pas la solution si vous effectuez une requête 'Boolean'. Parce qu'une requête comme '+ web + mail' est échappée et qu'elle recherche' web' ou 'mail' à la place pour les deux mots-clés. Quelqu'un connaît le droit d'échappement pour les requêtes 'Boolean'? – TiMESPLiNTER

1

Selon http://lucene.apache.org/core/old_versioned_docs/versions/2_9_1/queryparsersyntax.html#-

Le caractère d'échappement est slash-arrière, non -forward:.

Et pour répondre à Ankit, $ ne semble pas devoir être échappé car ce n'est pas un caractère spécial.

Echapper au tableau de bord comme suggéré par Ralph ne fait pas de différence pour moi (Zend Lucene). On pourrait penser que quand un mot 'abc-def' est indexé et que vous cherchez 'abc-def', vous trouverez en quelque sorte ce mot, que le tiret soit ignoré ou non à l'étape de l'indexation. La même entrée devrait avoir le même résultat. Le mot semble être indexé comme deux jetons distincts 'abc' et 'def'. Pourtant, la recherche de 'abc-def' ne donne aucun résultat lorsque 'abc def' le fait.

Questions connexes