Skip to main content
 首页 » 编程设计

python之Whoosh之访问 search_page 结果项抛出 ReaderClosed 异常

2025年05月04日8jillzhang

下面是一个简单的分页功能。

from whoosh import index 
def _search(q): 
    wix = index.open_dir(settings.WHOOSH_INDEX_DIR) 
    term = Term("title", q) | Term("content", q) 
    page_id = 1 
 
    with wix.searcher() as s: 
        return s.search_page(term, page_id, pagelen=settings.ITEMS_PER_PAGE) 
 
In [15]: p = _search("like") 
 
In [16]: p.results[0].reader.is_closed 
Out[16]: True 

如果我尝试访问命中的属性,我会收到 ReaderClosed 异常。

In [19]: p.results 
Out[19]: <Top 10 Results for Or([Term('title', 'like'), Term('content', 'like')]) runtime=0.0214910507202> 
 
[21]: p.results[0]["title"] 
--------------------------------------------------------------------------- 
ReaderClosed                              Traceback (most recent call last) 
/usr/local/lib/python2.7/dist-packages/Django-1.5.3-py2.7.egg/django/core/management/commands/shell.p yc in <module>() 
----> 1 p.results[0]["title"] 
 
/usr/local/lib/python2.7/dist-packages/whoosh/searching.pyc in __getitem__(self, fieldname) 
1500  
1501     def __getitem__(self, fieldname): 
-> 1502         if fieldname in self.fields(): 
1503             return self._fields[fieldname] 
1504  
 
/usr/local/lib/python2.7/dist-packages/whoosh/searching.pyc in fields(self) 
1388  
1389         if self._fields is None: 
-> 1390             self._fields = self.searcher.stored_fields(self.docnum) 
1391         return self._fields 
1392  
 
/usr/local/lib/python2.7/dist-packages/whoosh/reading.pyc in stored_fields(self, docnum) 
1197     def stored_fields(self, docnum): 
1198         segmentnum, segmentdoc = self._segment_and_docnum(docnum) 
-> 1199         return self.readers[segmentnum].stored_fields(segmentdoc) 
1200  
1201     # Per doc methods 
 
/usr/local/lib/python2.7/dist-packages/whoosh/reading.pyc in stored_fields(self, docnum) 
    693     def stored_fields(self, docnum): 
    694         if self.is_closed: 
--> 695             raise ReaderClosed 
    696         assert docnum >= 0 
    697         schema = self.schema 
 
ReaderClosed:  

我如何访问命中的属性?

请您参考如下方法:

浏览 whoosh 的文档 http://whoosh.readthedocs.org/en/latest/quickstart.html#the-searcher-object我明白了这个问题。把它留在这里以防有人遇到同样的问题。

当“with”范围结束时,任何与搜索相关的文件描述符都会关闭。因此,似乎应该将结果集复制到另一个数据结构中,例如“with” block 中的字典列表,以便在 block 外使用。