7 Stimmen

Lucene.Net Unterstriche verursachen Tokensplit

Ich habe ein Skript für eine MsSqlServer-Datenbank mit Tabellen, Ansichten und gespeicherten Prozeduren in einer Verzeichnisstruktur erstellt, die ich dann mit Lucene.net indizieren werde. Die meisten meiner Tabellen-, View- und Prozedurnamen enthalten Unterstriche.

Ich verwende den StandardAnalyzer. Wenn ich eine Abfrage für eine Tabelle namens tIr_ InvoiceBtnWtn01, zum Beispiel, erhalte ich Treffer für tIr und für InvoiceBtnWtn01 zurück, anstatt nur für tIr _InvoiceBtnWtn01.

Ich denke, das Problem ist der Tokenizer ist auf _ (Unterstrich) aufgeteilt, da es Satzzeichen ist.

Gibt es eine (einfache) Möglichkeit, Unterstriche aus der Interpunktionsliste zu entfernen, oder gibt es einen anderen Analyzer, den ich für Sql und Programmiersprachen verwenden sollte?

6voto

Xodarap Punkte 11311

Ja, der StandardAnalyzer trennt bei Unterstrichen. Der WhitespaceAnalyzer tut dies nicht. Beachten Sie, dass Sie einen PerFieldAnalyzerWrapper verwenden können, um verschiedene Analysatoren für jedes Feld zu verwenden - Sie möchten vielleicht einige der Funktionen des StandardAnalyzers für alles außer Tabellen-/Spaltennamen beibehalten.

WhitespaceAnalyzer führt jedoch nur die Aufteilung von Leerzeichen durch. Es wird nicht Kleinschreibung Ihre Token, zum Beispiel. So möchten Sie vielleicht Ihre eigenen Analysator machen, die WhitespaceTokenizer und LowercaseFilter kombiniert, oder schauen Sie in LowercaseTokenizer.

EDIT: Einfacher benutzerdefinierter Analyzer (in C#, aber man kann ihn ziemlich einfach in Java übersetzen):

// 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; 
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X