bard
bard

Reputation: 3052

Python Whoosh AttributeError when updating index

I'm trying to update my whoosh search index when I make changes to my database, but keep getting an error that I haven't been able to figure out.

One of my views:

from search import update_index

@view_config(route_name='update_effect_brief', permission='edit')
def update_effect_brief(request):
    name = request.matchdict['pagename']
    brief = request.params['effect_brief']
    effect = Effect.get_by_name(name) # This is an "effect" object
    effect.update_brief(brief)
    update_index(effect)
return HTTPFound(location=request.route_url('view_effect', pagename=name))

My search.py file:

from whoosh.index import create_in, open_dir

def update_index(obj):
    '''Update single ingredient, product or effect.'''
    index = open_dir('searchindex') # searchindex is the name of the directory

    with index.searcher as searcher: # crashes on this line!
        writer = index.writer()
        update_doc(writer, obj)

Traceback:

Traceback (most recent call last):
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.9-py2.7.egg/pyramid_debugtoolbar/toolbar.py", line 152, in toolbar_tween
    response = _handler(request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid_debugtoolbar-1.0.9-py2.7.egg/pyramid_debugtoolbar/panels/performance.py", line 55, in resource_timer_handler
    result = handler(request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid-1.4.5-py2.7.egg/pyramid/tweens.py", line 21, in excview_tween
    response = handler(request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid_tm-0.7-py2.7.egg/pyramid_tm/__init__.py", line 82, in tm_tween
    reraise(*exc_info)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid_tm-0.7-py2.7.egg/pyramid_tm/__init__.py", line 63, in tm_tween
    response = handler(request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid-1.4.5-py2.7.egg/pyramid/router.py", line 161, in handle_request
    response = view_callable(context, request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid-1.4.5-py2.7.egg/pyramid/config/views.py", line 237, in _secured_view
    return view(context, request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid-1.4.5-py2.7.egg/pyramid/config/views.py", line 377, in viewresult_to_response
    result = view(context, request)
  File "/home/home/SkinResearch/env/local/lib/python2.7/site-packages/pyramid-1.4.5-py2.7.egg/pyramid/config/views.py", line 493, in _requestonly_view
    response = view(request)
  File "/home/home/SkinResearch/skinresearch/skinproject/views.py", line 544, in update_effect_brief
    update_index(effect)
  File "/home/home/SkinResearch/skinresearch/skinproject/search.py", line 37, in start_update
    update_index(obj)
  File "/home/home/SkinResearch/skinresearch/skinproject/search.py", line 92, in update_index
    with index.searcher as searcher:
AttributeError: __exit__

What am I doing wrong?

Upvotes: 0

Views: 109

Answers (1)

Martijn Pieters
Martijn Pieters

Reputation: 1122342

You need to call the index.searcher() method to create the context manager:

with index.searcher() as searcher:

See the Searcher object section in the Whoosh quickstart, and The Searcher object documentation.

It isn't entirely clear to me why you are creating a searcher, but then create a writer in the block and update the index. Perhaps you wanted to use the writer as a context manager instead here:

with index.writer() as writer:
    update_doc(writer, obj)

and leave the searcher for searching operations.

Upvotes: 2

Related Questions