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 TokenStream
sagt 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 TokenStream
auf 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, Token
wenn man diesen Typ wirklich will / braucht?
Mit der gleichen API-Änderung, die TokenStream
ein AttributeSource
, Token
jetzt implementiert Attribute
und mit TokenStream.addAttribute verwendet werden kann, genau wie die anderen Antworten für CharTermAttribute
und 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 Token
wä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 Token
zurückgegebenen von addAttribute
; Wenn Sie also eine Sammlung verschiedener Token
Objekte 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