Wie erhalte ich mit PyLucene eine Liste aller Token aus dem Lucene 8.6.1-Index?

Nov 22 2020

Ich habe eine Richtung von dieser Frage . Ich mache zuerst den Index wie unten.

import lucene
from  org.apache.lucene.analysis.standard import StandardAnalyzer
from org.apache.lucene.index import IndexWriterConfig, IndexWriter, DirectoryReader
from org.apache.lucene.store import SimpleFSDirectory
from java.nio.file import Paths
from org.apache.lucene.document import Document, Field, TextField
from org.apache.lucene.util import BytesRefIterator

index_path = "./index"

lucene.initVM()

analyzer = StandardAnalyzer()
config = IndexWriterConfig(analyzer)
if len(os.listdir(index_path))>0:
    config.setOpenMode(IndexWriterConfig.OpenMode.APPEND)

store = SimpleFSDirectory(Paths.get(index_path))
writer = IndexWriter(store, config)

doc = Document()
doc.add(Field("docid", "1",  TextField.TYPE_STORED))
doc.add(Field("title", "qwe rty", TextField.TYPE_STORED))
doc.add(Field("description", "uio pas", TextField.TYPE_STORED))
writer.addDocument(doc)

writer.close()
store.close()

Ich versuche dann, alle Begriffe im Index für ein Feld wie unten zu erhalten.

store = SimpleFSDirectory(Paths.get(index_path))
reader = DirectoryReader.open(store)

Versuch 1: Versuch, das next()in dieser Frage verwendete zu verwenden, was eine Methode zu sein scheint, die von BytesRefIteratorimplementiert wird TermsEnum.

for lrc in reader.leaves():
    terms = lrc.reader().terms('title')
    terms_enum = terms.iterator()
    while terms_enum.next():
        term = terms_enum.term()
        print(term.utf8ToString())

Ich kann jedoch anscheinend nicht auf diese next()Methode zugreifen .

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-47-6515079843a0> in <module>
      2     terms = lrc.reader().terms('title')
      3     terms_enum = terms.iterator()
----> 4     while terms_enum.next():
      5         term = terms_enum.term()
      6         print(term.utf8ToString())

AttributeError: 'TermsEnum' object has no attribute 'next'

Versuch 2: Versuchen Sie, die while-Schleife zu ändern, wie in den Kommentaren dieser Frage vorgeschlagen .

while next(terms_enum):
    term = terms_enum.term()
    print(term.utf8ToString())

Es scheint TermsEnumjedoch, dass Python es nicht als Iterator versteht.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-48-d490ad78fb1c> in <module>
      2     terms = lrc.reader().terms('title')
      3     terms_enum = terms.iterator()
----> 4     while next(terms_enum):
      5         term = terms_enum.term()
      6         print(term.utf8ToString())

TypeError: 'TermsEnum' object is not an iterator

Mir ist bewusst, dass meine Frage wie in dieser Frage vorgeschlagen beantwortet werden kann . Dann ist meine Frage wohl wirklich, wie bekomme ich alle Begriffe rein TermsEnum?

Antworten

1 PSK Nov 23 2020 at 00:46

Ich fand, dass das Folgende von hier und von test_FieldEnumeration()in der test_Pylucene.pyDatei funktioniert, die in ist pylucene-8.6.1/test3/.

for term in BytesRefIterator.cast_(terms_enum):
    print(term.utf8ToString())

Ich bin froh, eine Antwort zu akzeptieren, die mehr Erklärungen enthält.