2009-12-22 4 views
1

J'essaie d'utiliser Lucene pour rechercher des noms dans une base de données. Cependant, certains des noms contiennent des mots comme "NOT" et "OU" et même des symboles "-" moins. Je veux toujours que les différents jetons à l'intérieur des noms soient séparés à l'aide d'un analyseur et recherchés comme une combinaison booléenne de termes, mais je ne veux pas que Lucene interprète les termes "NOT"/"OU" comme des opérateurs veulent qu'ils soient recherchés comme des termes normaux). Une façon d'accomplir ce dont je parle serait d'exécuter manuellement l'analyseur sur la requête de recherche, puis de construire manuellement une requête booléenne basée sur tous les jetons résultants. Est-ce la meilleure façon? J'ai l'impression que les analyseurs ont été conçus pour être utilisés avec l'analyseur de requêtes et je pense qu'il devrait y avoir un moyen intégré d'accomplir ce que j'essaie de faire. Quelqu'un sait le meilleur moyen de le faire?Lucene Query SANS opérateurs

Répondre

1

Votre propre approche suggérée de construction d'une requête booléenne à partir d'un TokenStream prend tout son sens. L'API QueryParser est vraiment destinée uniquement à analyser des requêtes structurées à l'aide d'une syntaxe spécifique. Si vous n'utilisez pas la syntaxe de l'analyseur de requête, je ne vois aucune raison d'utiliser QueryParser sur une requête BooleanQuery construite manuellement. Toutefois, si vous utilisez un analyseur StandardAnalyzer (ou un autre analyseur avec un StopFilter) pour indexer vos champs, les mots tels que "AND", "NOT" et "OR" ne seront pas indexés et ne pourront pas être recherchés. Donc, dans ce cas, vous pouvez tout aussi facilement supprimer ces mots et opérateurs tels que "-" et "+" de vos requêtes en utilisant une expression régulière. Je recommanderais plutôt l'approche BooleanQuery, cependant.