2011-10-31 27 views
4

任何人都可以幫我解決這個奇怪的錯誤,當向一個whoosh索引添加一個新文檔時,奇怪的錯誤添加到飛快索引

下面的代碼:

def add_to_index(self, doc): 
    ix = index.open_dir(self.index_dir) 
    writer = AsyncWriter(ix) # use async writer to prevent write lock errors 
    writer.add_document(**self.get_doc_args(doc)) 
    writer.commit() 

def get_doc_args(self, doc): 
    return { 
     'id':  u""+str(doc['id']), 
     'org':  doc['org__id'], 
     'created': doc['created_date'], 
     'date':  doc['received_date'], 
     'from_addr': doc['from_addr'], 
     'subject': doc['subject'], 
     'body':  doc['messagebody__cleaned_message'] 
    } 

我得到以下錯誤:

TypeError('ord() expected a character, but string of length 0 found',) 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.6/dist-packages/celery/execute/trace.py", line 36, in trace 
    return cls(states.SUCCESS, retval=fun(*args, **kwargs)) 
    File "/usr/local/lib/python2.6/dist-packages/celery/app/task/__init__.py", line 232, in __call__ 
    return self.run(*args, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/celery/app/__init__.py", line 172, in run 
    return fun(*args, **kwargs) 
    File "/mnt/deploy/prod/chorus/src/chorus/../chorus/search/__init__.py", line 131, in index_message 
    MessageSearcher().add_to_index(message) 
    File "/mnt/deploy/prod/chorus/src/chorus/../chorus/search/__init__.py", line 29, in add_to_index 
    writer.commit() 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/writing.py", line 423, in commit 
    self.writer.commit(*args, **kwargs) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filewriting.py", line 501, in commit 
    new_segments = mergetype(self, self.segments) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filewriting.py", line 78, in MERGE_SMALL 
    reader = SegmentReader(writer.storage, writer.schema, seg) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filereading.py", line 63, in __init__ 
    self.termsindex = TermIndexReader(tf) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filetables.py", line 590, in __init__ 
    super(TermIndexReader, self).__init__(dbfile) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filetables.py", line 502, in __init__ 
    OrderedHashReader.__init__(self, dbfile) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filetables.py", line 379, in __init__ 
    HashReader.__init__(self, dbfile) 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/filetables.py", line 187, in __init__ 
    self.hashtype = dbfile.read_byte() 
    File "/usr/local/lib/python2.6/dist-packages/whoosh/filedb/structfile.py", line 219, in read_byte 
    return ord(self.file.read(1)) 

奇怪的是,使用標準的作家(即不AsyncWriter)完全相同的代碼工作得很好。我在這裏錯過了什麼?請注意,在生產中我必須使用AsyncWriter以避免LockErrors。

+0

我應該補充一點,我已經驗證所有輸入都是unicode字符串。 – kuhnza

回答

-3

結束查找解決方案;它被稱爲Solr :-)

+0

作爲評論是好的,但不是你指定的錯誤的解決方案。 – n3storm

2

此錯誤是由某種索引損壞引起的。在我的情況下,機器在索引重建期間因另一個原因而崩潰。

您可以通過完全刪除whoosh_index文件夾內容和重建索引輕鬆解決它。

+0

刪除whoosh索引並重建它也爲我修復了它。 – Mahn