Разрешение Whoosh IndexingError: Writer закрыт

В отличие от python whoosh IndexingError при прерывании, я не прерывал никаких коммитов, кроме IndexingError происходит при создании нового индекса:

import uuid
import os

from whoosh.index import create_in
from whoosh.fields import *
from whoosh.qparser import QueryParser

schema = Schema(hashID=TEXT(stored=True))
indexdir = 'foobar'
if not os.path.exists(indexdir):
    os.mkdir(indexdir)

ix = create_in(indexdir, schema)

with ix.writer() as writer:
    writer.add_document(hashID=str(uuid.uuid4()))
    writer.commit()

Ошибка:

---------------------------------------------------------------------------
IndexingError                             Traceback (most recent call last)
<ipython-input-1-85a42bebdce8> in <module>()
     15 with ix.writer() as writer:
     16     writer.add_document(hashID=str(uuid.uuid4()))
---> 17     writer.commit()

/usr/local/lib/python3.5/site-packages/whoosh/writing.py in __exit__(self, exc_type, exc_val, exc_tb)
    208             self.cancel()
    209         else:
--> 210             self.commit()
    211 
    212     def group(self):

/usr/local/lib/python3.5/site-packages/whoosh/writing.py in commit(self, mergetype, optimize, merge)
    918         """
    919 
--> 920         self._check_state()
    921         # Merge old segments if necessary
    922         finalsegments = self._merge_segments(mergetype, optimize, merge)

/usr/local/lib/python3.5/site-packages/whoosh/writing.py in _check_state(self)
    553     def _check_state(self):
    554         if self.is_closed:
--> 555             raise IndexingError("This writer is closed")
    556 
    557     def _setup_doc_offsets(self):

IndexingError: This writer is closed

Автор должен находиться в пределах контекста, поэтому я не уверен, почему он закрыт, хотя он только что создан. Как разрешить IndexingError для нового индекса?

1 ответ

writer.commit() сохраняет изменения и закрывает писателя.

Затем в конце заявления with ix.writer() as writer: пытается закрыть писателя, который уже закрыт и не существует.

Таким образом, ваш with утверждение эквивалентно:

try:
    writer = ix.writer()
    writer.add_document(hashID=str(uuid.uuid4()))
    writer.commit()
finally:
    writer.commit()

Как решение, если вы пропустите writer.commit() в вашем with заявление или вы избавляетесь от with постановка и воссоздание writer каждый раз, когда вы хотите совершить.

Другие вопросы по тегам