PyLucene을 사용하여 Lucene 8.6.1 인덱스에서 모든 토큰 목록을 얻는 방법은 무엇입니까?

Nov 22 2020

나는 이 질문 에서 어떤 방향을 얻었습니다 . 먼저 아래와 같이 인덱스를 만듭니다.

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

그런 다음 아래와 같이 하나의 필드에 대한 색인의 모든 용어를 가져 오려고합니다.

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

1 시도하십시오를 사용하려고 시도 next()에 사용 이 질문 의 방법이 될 것 같습니다 BytesRefIterator에 의해 구현 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())

그러나 그 next()방법 에 접근 할 수없는 것 같습니다 .

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

시도 2 : 이 질문 의 주석에서 제안한대로 while 루프를 변경하려고합니다 .

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

그러나 TermsEnum파이썬에 의해 반복자로 이해되지 않는 것 같습니다 .

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

이 질문 에서 제안한대로 제 질문에 대한 답변을받을 수 있다는 것을 알고 있습니다 . 그렇다면 내 질문은 실제로 모든 용어를 TermsEnum어떻게 얻 습니까?

답변

1 PSK Nov 23 2020 at 00:46

내가 발견에서 작품 아래 여기 와에서 test_FieldEnumeration()test_Pylucene.py있는 파일 pylucene-8.6.1/test3/.

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

이것보다 더 많은 설명이있는 대답을 받아들이게되어 기쁩니다.