2010-12-01 6 views
5

J'ai scripté une MSSqlServer bases de données d'tables, vues et procédures stockées dans une structure de répertoire que j'indexation puis avec Lucene.net. La plupart de mes noms de table, de vue et de procédure contiennent des traits de soulignement. J'utilise StandardAnalyzer. Si je fais une recherche pour une table nommée tIr_ InvoiceBtnWtn01, par exemple, je reçois frappe de retour pour tîr et InvoiceBtnWtn01, plutôt que pour seulement tîr _InvoiceBtnWtn01.Lucene.Net faisant scission jeton Souligne

Je pense que la question est le tokenizer est le fractionnement sur _ (underscore), car il est la ponctuation.

est-il un (simple) moyen de supprimer underscores dans la liste de ponctuation ou est-il un autre analyseur que je devrais utiliser pour les langages SQL et la programmation?

+0

J'essaie la StopAnalyzer et WhitespaceAnalyzer maintenant. Donc, il semble que le WhitespaceAnalyzer soit le chemin à parcourir. – automatic

Répondre

4

Oui, le StandardAnalyzer divise le trait de soulignement. WhitespaceAnalyzer ne le fait pas. Notez que vous pouvez utiliser un PerFieldAnalyzerWrapper pour utiliser différents analyseurs pour chaque champ - vous pouvez conserver certaines fonctionnalités de l'analyseur standard pour tout sauf le nom de table/colonne.

WhitespaceAnalyzer ne fait que diviser les espaces bien. Il ne minera pas vos jetons, par exemple. Donc, vous pouvez faire votre propre analyseur qui combine WhitespaceTokenizer et LowercaseFilter, ou regarder dans LowercaseTokenizer.

EDIT: simple analyseur personnalisé (en C#, mais vous pouvez le traduire en Java assez facilement):

// Chains together standard tokenizer, standard filter, and lowercase filter 
class MyAnalyzer : Analyzer 
{ 
    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     StandardTokenizer baseTokenizer = new StandardTokenizer(Lucene.Net.Util.Version.LUCENE_29, reader); 
     StandardFilter standardFilter = new StandardFilter(baseTokenizer); 
     LowerCaseFilter lcFilter = new LowerCaseFilter(standardFilter); 
     return lcFilter; 
    } 
} 
+1

Je pense que je vais vouloir des jetons en minuscules. Je suppose qu'il n'y a pas une manière de compiler "non-source" de Whitespace et de minuscules. Quelle est la différence entre l'utilisation de LowercaseFilter et de lowercaseTokenizer? – automatic

+0

@automatic: J'ai ajouté un exemple de chaînage de filtres/tokenizers. En général, Solr est destiné à être la version "facile à utiliser" de Lucene, donc oui, il n'y a pas un moyen de faire cela qui ne nécessite pas d'écrire du code si vous utilisez uniquement Lucene. Mais c'est quasi-intentionnel. – Xodarap

+0

@automatic: De plus, LowercaseTokenizer est LowercaseFilter + LetterTokenizer; en regardant LetterTokenizer cependant, il se séparera au trait de soulignement aussi. Donc, ce n'est pas ce que vous voulez. Pardon. – Xodarap