-1

我读了这篇文章http://eshlox.net/en/2012/09/13/sphinxsearch-and-django-ubuntu/

鉴于我收到代码错误:total = query_results['total']

错误:“NoneType”对象没有属性“ getitem

def search(request):
    if request.GET:
        form = SearchForm(request.GET)
        query = request.GET.get('q', '')
        s = SphinxClient()
        s.SetServer('localhost', 9312)
        s.SetLimits(0, 16777215)
        if s.Status():
            query_results = s.Query(query)
            total = query_results['total']
            pages_id = [page['id'] for page in query_results['matches']]
            if pages_id:
                results = Page.objects.filter(id__in=pages_id)
            else:
                results = None
            if results:
                paginator = Paginator(results, 25)
                page = request.GET.get('page')
                try:
                    results = paginator.page(page)
                except PageNotAnInteger:
                    results = paginator.page(1)
                except EmptyPage:
                    results = paginator.page(paginator.num_pages)
            return render(request, 'wiki/search.html',
                          {'results': results,'total': total,
                           'query': query, 'form': form})
        else:
            logger = logging.getLogger('helper')
            logger.error('Sphinxsearch Error! %s' % s.GetLastError())
            messages.add_message(request, messages.ERROR, 'Search server is '
                                 'not responding. Administrator '
                                 'has been informed.')
            form = SearchForm()
            return render(request, 'wiki/search.html', {'form': form})
    else:
        form = SearchForm()
        return render(request, 'wiki/search.html', {'form': form})

Traceback 切换到复制和粘贴视图

/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py in

获取响应

                        response = wrapped_callback(request, *callback_args, **callback_kwargs)

    ...
▶ Local vars
/home/max/askmoiseev/ask/views.py in search

              total = query_results['total']

    ...
▶ Local vars

请告诉我可能是什么错误?

4

2 回答 2

4

我想你的查询结果是 None

query_results = s.Query(query)

所以当你尝试访问

total = query_results['total']

您收到__getitem__错误消息,因为 None 不是列表。

这是解释器的一个例子。

>>> n = None
>>> n['b']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'
>>> 

尝试在 shell 中运行查询 -django-admin.py shell然后

s = SphinxClient()
s.SetServer('localhost', 9312)
s.SetLimits(0, 16777215)
query_results = s.Query(query)

祝你好运,山姆

于 2014-06-01T16:26:57.270 回答
0

在尝试使用 query_results之前,您应该检查 GetLastError 和可能的 GetLastWarning,以确保查询成功。

您可以找出查询失败的原因。如果 api 在失败时引发适当的异常,这可能会更好,但事实并非如此。

另外一点,你的 setLimits 高得离谱,它很可能是因为试图获得太多结果而失败。

真的你应该直接在sphinx中进行分页,只获取当前页面的id,而不是获取所有id,然后分页。

于 2014-06-02T09:56:08.230 回答