Comment obtenir une liste de tous les jetons de l'index Lucene 8.6.1 à l'aide de PyLucene?

Nov 22 2020

J'ai une certaine direction de cette question . Je crée d'abord l'index comme ci-dessous.

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()

J'essaie ensuite d'obtenir tous les termes de l'index pour un champ comme ci-dessous.

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

Tentative 1: essayer d'utiliser le next()tel qu'utilisé dans cette question qui semble être une méthode d' BytesRefIteratorimplémentation par 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())

Cependant, je n'arrive pas à pouvoir accéder à cette next()méthode.

---------------------------------------------------------------------------
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'

Tentative 2: essayer de changer la boucle while comme suggéré dans les commentaires de cette question .

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

Cependant, il semble qu'il ne TermsEnumsoit pas considéré comme un itérateur par Python.

---------------------------------------------------------------------------
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

Je suis conscient que ma question peut trouver une réponse comme suggéré dans cette question . Ensuite, je suppose que ma question est vraiment la suivante: comment puis-je intégrer tous les termes TermsEnum?

Réponses

1 PSK Nov 23 2020 at 00:46

J'ai trouvé que ce qui suit fonctionne à partir d' ici et à partir test_FieldEnumeration()du test_Pylucene.pyfichier qui se trouve dans pylucene-8.6.1/test3/.

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

Heureux d'accepter une réponse qui a plus d'explications que cela.