Разрешение 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
каждый раз, когда вы хотите совершить.