2012-06-24 9 views
3

J'utilise Compass/Lucene pour rechercher et indexer ma base de données. Je souhaite que les signes diacritiques et les caractères soient ignorés lorsque je recherche, de sorte que la requête "foo" corresponde à la fois à "Fóo" et à "foo" et une requête à "fóó" correspond à "fóo" et "fOO". D'après ce que j'ai lu, il semble que j'ai besoin de changer l'analyseur par défaut que Compass utilise à la fois lors de l'indexation et de la recherche dans mon contexte. J'ai découvert où je spécifie l'analyseur à utiliser, mais je n'arrive pas à trouver une implémentation d'analyseur qui réponde à mes exigences. Existe-t-il déjà un analyseur qui ignore les signes diacritiques et les caractères, ou dois-je écrire le mien?ignorer les signes diacritiques lors de la recherche

Répondre

5

Jetez un oeil à org.apache.lucene.analysis.ASCIIFoldingFilter pour voir si elle fait ce que vous voulez. Sinon, j'utiliserais sa source comme point de départ pour écrire le vôtre.

Vous avez raison que vous devez utiliser la même configuration de l'analyseur pour l'indexation et l'interrogation, pour la raison évidente que si vous avez dépouillé tous les diacritiques de l'index, vous devez les dépouiller de toute requête aussi.

Une chose à prendre en compte est de vous assurer de normaliser tout unicode quelque part dans le processus d'indexation/interrogation. Pour plus d'informations, voir: http://unicode.org/reports/tr15/, http://unicode.org/faq/normalization.html et http://docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html. EDIT: Comme mentionné dans les commentaires ci-dessous, en tant que filtre, vous ne pouvez pas utiliser ASCIIFoldingFilter en tant qu'analyseur directement, mais il existe des instructions simples pour l'inclure dans un analyseur ici: stackoverflow.com/a/3834244/ 390153

EDIT: Comme mentionné par @jspboix dans le commentaire ci-dessous, vous devrez également chaîner LowerCaseFilter pour gérer le cas de caractères.

+0

Je ne pense pas que org.apache.lucene.analysis.ASCIIFoldingFilter résoudra mon problème directement, parce que ce n'est pas un analyseur, mais pourrait être un point de départ utile –

+0

Non, pas directement car c'est un filtre. Cependant, vous trouverez un court exemple de la façon de l'incorporer dans un analyseur ici: http://stackoverflow.com/a/3834244/390153 – Recurse

+1

Vous aurez également besoin de LoweCaseFilter pour matchin "fOO" avec "foo". – jspboix

0

Dans mon application Grails, j'utiliser le plug-in interrogeable et juste configuré le système pour utiliser l'analyseur « allemand »:

compassSettings = ['compass.engine.analyzer.default.type': 'German'] 

Cela ne tient pas au moins le cas et trémas - « A » est stocké sous forme de " un "dans l'index.

Je viens d'ajouter "Fóo" et "Föo" à l'un de mes documents de test et j'ai cherché "foo" - il trouve "Föo" mais pas "Fóo". Donc je suppose que si vous changez la langue à la bonne valeur (français?) Ça devrait marcher.

Questions connexes