Es gibt zwei Variationen in der OP-Frage:
- Was ist "der Prozess, um Token von einem TokenStream zu erhalten"?
- "Kann jemand erklären, wie man tokenartige Informationen von einem TokenStream erhält?"
Aktuelle Versionen der Lucene-Dokumentation zum BeispielToken (Hervorhebung hinzugefügt):
HINWEIS: Ab Version 2.9 ist es nicht mehr erforderlich , Token zu verwenden. Mit der neuen TokenStream-API kann sie als Convenience-Klasse verwendet werden, die alle Attribute implementiert. Dies ist besonders nützlich, um einfach von der alten zur neuen TokenStream-API zu wechseln.
Und TokenStreamsagt seine API:
... ist von Token-basiert zu Attribut-basiert übergegangen. Die bevorzugte Methode zum Speichern der Informationen eines Tokens ist die Verwendung von AttributeImpls.
Die anderen Antworten auf diese Frage beziehen sich auf # 2 oben: Wie man tokenartige Informationen von einem TokenStreamauf die "neue" empfohlene Weise unter Verwendung von Attributen erhält . Beim Lesen der Dokumentation schlagen die Lucene-Entwickler vor, dass diese Änderung teilweise vorgenommen wurde, um die Anzahl der gleichzeitig erstellten Einzelobjekte zu verringern.
Aber wie einige Leute in den Kommentaren dieser Antworten betont haben, antworten sie nicht direkt auf Nummer 1: Wie bekommt man eine, Tokenwenn man diesen Typ wirklich will / braucht?
Mit der gleichen API-Änderung, die TokenStreamein AttributeSource, Tokenjetzt implementiert Attributeund mit TokenStream.addAttribute verwendet werden kann, genau wie die anderen Antworten für CharTermAttributeund OffsetAttribute. Also haben sie diesen Teil der ursprünglichen Frage wirklich beantwortet, sie haben ihn einfach nicht gezeigt.
Es ist wichtig, dass Sie mit diesem Ansatz zwar Tokenwährend der Schleife zugreifen können , es sich jedoch immer noch um ein einzelnes Objekt handelt, unabhängig davon, wie viele logische Token sich im Stream befinden. Jeder Aufruf von incrementToken()ändert den Status des Tokenzurückgegebenen von addAttribute; Wenn Sie also eine Sammlung verschiedener TokenObjekte erstellen möchten, die außerhalb der Schleife verwendet werden sollen, müssen Sie zusätzliche Arbeit leisten, um ein neues Token Objekt als (tiefe?) Kopie zu erstellen .
CharTermAttributeImpl.toString()stattdessen so etwas wie verwenden