2016-05-22 8 views
0

Ich habe meinen eigenen Analysator in Apache Lucene für bestimmte Zwecke implementiert. Bevor ein Begriff indiziert wird, müssen bestimmte Filter angewendet werden. Ich dachte, es wäre egal, die Reihenfolge der Filter zu ändern. Aber es scheint so zu sein. Beispielsweise;Was ist die Logik hinter der "Reihenfolge des Anwendens von Filtern" in Apache Lucene

analyzer = new Analyzer(){ 
     @Override 
     protected TokenStreamComponents createComponents(String fieldName){ 
     AttributeFactory factory = AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY; 
     Tokenizer source = new NGramTokenizer(factory,3,10); 
     TokenStream filter = new NewlineFilter(source); 
     filter = new LowerCaseFilter(filter); 
     filter = new UsefulGrams(getVersion(), filter, usefulGramSet); 
     filter = new EmptySpaceFilter(filter); 
     return new TokenStreamComponents(source,filter); 
     }; 
    }; 

Mein Tokenizer generiert Gramm, dann Zeilenumbrüche werden geschnitten und alle Fälle gesenkt. Danach möchte ich nur die Gramm, die ich "nützlich" finde, im Index sein, dieser Filter eliminiert die nutzlosen Gramm. Am Ende filtert es die Gramm, die vollständig aus leeren Räumen bestehen.

Mit dem Datensatz, den ich halte, generiert diese Reihenfolge 316 indizierte Begriffe. Aber wenn ich die Reihenfolge der Filter ändere;

analyzer = new Analyzer(){ 
     @Override 
     protected TokenStreamComponents createComponents(String fieldName){ 
     AttributeFactory factory = AttributeFactory.DEFAULT_ATTRIBUTE_FACTORY; 
     Tokenizer source = new NGramTokenizer(factory,3,10); 
     TokenStream filter = new UsefulGrams(getVersion(), source, usefulGramSet); 
     filter = new NewlineFilter(filter); 
     filter = new EmptySpaceFilter(filter); 
     filter = new LowerCaseFilter(filter); 
     return new TokenStreamComponents(source,filter); 
     }; 
    }; 

Dies ergibt 350 indizierte Begriffe. Beachten Sie, dass der "erste" Filter SOURCE TOKENIZER verwenden muss, die anderen jedoch FILTER TOKENSTREAM. Wenn ich SOURCE in jeden Parameter einfüge, gibt es Warnungen bezüglich "addsuppression".

Meine Frage ist, was sollte die Reihenfolge der Anwendung dieser Filter sein? Ich möchte alle diese (alle Kleinbuchstaben, nur die Begriffe, die ich wähle, ohne leere Gramm, ohne Zeilenumbrüche) anwenden, würde nicht denken, dass dies durch irgendetwas geändert wird, anscheinend tut es.

+0

Es scheint, dass nur in einigen Fällen indizierte Termanzahl ändert, scheint das Problem von etwas anderem auftreten .... – Karavana

Antwort

2

Ja, Bestellung ist wichtig. Filter werden nacheinander auf den Text angewendet.

Dies ist wichtig, wenn die Wirkung eines Filters das Ergebnis eines anderen Filters beeinflusst. Das ist ziemlich einfach zu sehen mit Stemmern.

Wenn ich ein SynonymFilter sith das Synonym haben (Wikinger -> seafarer) und ein EnglishStemFilter, Wikinger dann

Ende
  • SynonymFilter: Wikinger -> seafarer
  • EnglishStemFilter: Seemanns -> seafar

Wenn ich die stemmer vor dem SynonymFilter setzen:

  • EnglishStemF ilter: Wikinger -> vike
  • SynonymFilter: vike (kein Effekt)

Was die korrekte Reihenfolge für Ihren Analysator, ich weiß nicht. Die Hauptfrage scheint zu sein, wo man den UsefulGrams Filter setzt, und ich habe keine Idee, was das tatsächlich tut.