web-dev-qa-db-fra.com

Comparaison des analyseurs Lucene

Quelqu'un peut-il expliquer la différence entre les différents analyseurs de Lucene? Je reçois une exception maxClauseCount et je comprends que je peux éviter cela en utilisant un KeywordAnalyzer mais je ne veux pas changer de StandardAnalyzer sans comprendre les problèmes entourant les analyseurs. Merci beaucoup.

105
Journeyman

En général, tout analyseur dans Lucene est tokenizer + stemmer + filtre de mots vides.

Tokenizer divise votre texte en morceaux, et puisque différents analyseurs peuvent utiliser différents tokenizers, vous pouvez obtenir différents flux de jetons de sortie , c'est-à-dire des séquences de morceaux de texte. Par exemple, KeywordAnalyzer que vous avez mentionné ne divise pas du tout le texte et prend tout le champ comme un seul jeton. Dans le même temps, StandardAnalyzer (et la plupart des autres analyseurs) utilisent les espaces et la ponctuation comme points de partage. Par exemple, pour la phrase "je suis très heureux", cela produira la liste ["i", "suis", "très", "heureux"] (ou quelque chose comme ça). Pour plus d'informations sur des analyseurs/tokeniseurs spécifiques, consultez son Java Docs .

Les Stemmers sont utilisés pour obtenir la base d'un mot en question. Cela dépend fortement de la langue utilisée. Par exemple, pour la phrase précédente en anglais, il y aura quelque chose comme ["i", "be", "veri", "happi"] produit, et pour le français "Je suis très heureux" une sorte d'analyseur de français (comme - SnowballAnalyzer , initialisé avec "French") produira ["je", "être", "tre", "heur"]. Bien sûr, si vous utilisez l'analyseur d'une langue pour endiguer du texte dans une autre, les règles de l'autre langue seront utilisées et stemmer peut produire des résultats incorrects. Ce n'est pas un échec de tout le système, mais les résultats de recherche peuvent alors être moins précis.

KeywordAnalyzer n'utilise pas de stemmers, il passe tout le champ non modifié. Donc, si vous allez rechercher des mots dans le texte anglais, ce n'est pas une bonne idée d'utiliser cet analyseur.

Les mots vides sont les mots les plus fréquents et presque inutiles. Encore une fois, cela dépend fortement de la langue. Pour l'anglais, ces mots sont "a", "the", "I", "be", "have", etc. Les filtres de mots vides les suppriment du flux de jetons pour réduire le bruit dans les résultats de recherche, donc finalement notre phrase "I suis très content "avec StandardAnalyzer sera transformé en liste [" veri "," happi "].

Et KeywordAnalyzer ne fait encore rien. Ainsi, KeywordAnalyzer est utilisé pour des choses comme l'ID ou les numéros de téléphone, mais pas pour le texte habituel.

Et en ce qui concerne votre maxClauseCount exception, je crois que vous obtenez sur la recherche. Dans ce cas, c'est probablement à cause d'une requête de recherche trop complexe. Essayez de le diviser en plusieurs requêtes ou utilisez des fonctions de bas niveau.

207
ffriend

Dans ma perspective, j'ai utilisé StandAnalyzer et SmartCNAnalyzer. Comme je dois rechercher du texte en chinois. De toute évidence, SmartCnAnalyzer est meilleur pour gérer le chinois. À des fins différentes, vous devez choisir l'analyseur le plus approprié.

0
neal