Whoosh - accessing search_page result items throws ReaderClosed exception

半世苍凉 提交于 2021-01-27 16:32:26

问题


Following is a simple pagination function.

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

if I try to access an attribute of a Hit, i get ReaderClosed exception.

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: 

How can i access hit's attributes?


回答1:


Browsing through whoosh's documents http://whoosh.readthedocs.org/en/latest/quickstart.html#the-searcher-object I've understood the problem. Leaving it here in case anyone gets stuck with same issue.

Any file descriptor related to search is closed when "with" scope ended. Therefore it seems resultset should be copied into another data structure such as a list of dictionaries in the "with" block, to be used outside the block.



来源:https://stackoverflow.com/questions/19477319/whoosh-accessing-search-page-result-items-throws-readerclosed-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!