2016-06-07 11 views
0

Für Lucene, möchte ich einige Verarbeitung nur auf das letzte Token des TokenStream mit TokenFilter. Wenn zum Beispiel der Satz "Hallo meine Welt" gegeben wird, wenden Sie meine Verarbeitung nur auf "Welt" an, nicht auf andere Token.Lucene TokenFilter: Wie erkennt man das letzte Token von TokenStream?

Ich kann tun, indem ich zuerst die gesamte Eingabe von tokenStream iteriere, um den Offset des letzten Tokens zu bekommen, und dann vom ersten Token neu zu starten. Da ich den Offset des letzten Tokens bereits kenne, kann ich erkennen, ob das aktuelle Token ein letztes Token ist oder nicht.

Da jedoch zweimal Schleifen ineffizient ist sicher, ich möchte es mit der iterieren tokenStream nur einmal tun, aber es scheint wie schwer zu finden, richtig.

Angenommen, MyFilter sieht folgendermaßen aus: (Sicher, dieser MyFilter ist die grundlegende Struktur des TokenFilter).

public class MyFilter extends TokenFilter{ 

    public MyFilter(TokenStream input){ 
     super(input); 
    } 

    @Override 
    public boolean incrementToken() throws IOException { 
     if (input.incrementToken()){ 

      /* 
       if(current token is the last token): 
        Want to apply something only to the last token. 
      */ 

      return true; 
     } 
     return false; 
    } 
} 

Wie zu erkennen, ob das aktuelle Token das letzte ist oder nicht?

Antwort

0

ich auch das falsche Ende des Stockes habe hier bekam, aber ich denke, die Idee eines Strom ist genau, dass Sie auch in der Lage sein können zu sagen, wo es beginnt aber, dass es viel komplizierter wissen wo es endet ... was wahrscheinlich ist, warum sie es Token*Stream* genannt haben.

TokenFilter kann Ihnen sagen, wenn der Stream startet: Sie müssen nur reset() überschreiben.

Es gibt ein Verfahren TokenFilter.end(), natürlich, und man könnte versuchen, überschreibt das, aber Javadoc sagt:

Diese Methode durch die Verbraucher aufgerufen, nachdem der letzte Token verbraucht wurde, nach TokenStream.incrementToken() gab false zurück (unter Verwendung der neuen TokenStream-API ).

... was wahrscheinlich bedeutet, dass seine Ausgabe bereits vom "Verbraucher" bis dahin verwendet wurde.

Um das Ende zu erkennen, denke ich, dass Sie Ihre Tokenizer neu konstruieren müssen. Betrachtet man zum Beispiel nur StandardTokenizer und sein "Geschäftsende" StandardTokenizerImpl, könnte dies ziemlich kompliziert sein. Zweifellos besser, um Ihre eigene einfache Tokeniser zu machen: Es akzeptiert Strings, oder was auch immer, und der Weg, um fortzufahren wäre zu Tokenise vor dem Ausgeben der Token zu den Filter (n). Sie würden wissen, wie viele Tokens ausgegeben werden würden, und (zum Beispiel) würden Sie diese Nummer jederzeit Ihrer TokenFilter zur Verfügung stellen ...