2017-05-04 3 views
1

Anders als bei python whoosh IndexingError when interrupted, ich habe keine Commits nicht unterbrochen, aber die IndexingError tritt auf, wenn Sie einen neuen Index zu erstellen:Resolving Whoosh IndexingError: Schriftsteller geschlossen ist

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

Der Fehler:

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

Der Schriftsteller sollte innerhalb des Kontextzeitraums sein, also bin ich mir nicht sicher, warum es geschlossen ist, obwohl es neu erstellt wurde. Wie behebt man den IndexingError für einen neuen Index?

Antwort

0

writer.commit() speichert die Änderungen und schließt den Schreiber.

Dann am Ende der Anweisung, with ix.writer() as writer: versucht, den Schreiber zu schließen, der bereits geschlossen ist und nicht existiert.

So Ihre with Aussage entspricht:

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

Als Lösung, egal ob Sie writer.commit() in Ihrer with Anweisung weglassen oder Sie with Anweisung loswerden und neu erstellen writer jedes Mal, wenn Sie begehen wollen.