编程语言
首页 > 编程语言> > python – Django Haystack&Whoosh搜索工作,但SearchQuerySet返回0结果

python – Django Haystack&Whoosh搜索工作,但SearchQuerySet返回0结果

作者:互联网

编辑:帖子底部的更多信息…

原始问题:

我似乎遇到了与此(未解决)问题相同的问题:
django-haystack + Whoosh SearchQuerySet().all() always None

我已经在我的Django项目中使用Whoosh设置了Haystack,并且一开始工作正常(SearchQuerySet用于返回结果),但在尝试创建新的自定义搜索表单(从git回滚)后,似乎索引和原始搜索页面仍然可以正常工作,但现在SearchQuerySet()总是返回0结果!

运行:

manage.py rebuild_index --verbosity=2

正确地显示:

Indexing 14 assets
    indexed 1 - 14 of 14 (worker PID: 1234).

然后,可以从原始搜索表单中正确搜索这些索引资产.

但是,打开一个Django shell并运行:

from haystack.query import SearchQuerySet
SearchQuerySet().all().count()

始终返回0!

相关点子冻结:

> Python 3.5.2
> Django 1.9.3
> django-haystack 2.5.0
>飞快2.7.4

/myapp/search_indexes.py:

from haystack import indexes
from .models import Asset

class AssetIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.NgramField(document=True, use_template=True)
    asset_description = indexes.CharField(model_attr='asset_description')
    manufacturer = indexes.CharField(model_attr='asset_manufacturer')

    def get_model(self):
        return Asset

    def no_query_found(self):
        return self.searchqueryset.exclude(content='foo')

    def index_queryset(self, using=None):
        return self.get_model().objects.all()

/myapp/templates/search/indexes/myapp/asset_text.txt:

{{ object.asset_description }}
{{ object.asset_details }}
{{ object.asset_manufacturer }}
{{ object.asset_model }}
... etc.

/myapp/urls.py:

urlpatterns = [
    ....
    url(r'^search/', include('haystack.urls')),
    ....
]

编辑:

因此深入了解Haystack源代码,我发现了0来自哪里,但不是为什么!

/myvenv/Lib/site-packages/hackstack/query.py

class SearchQuerySet(object):
    ...

    def __len__(self):
        if self._result_count is None:
            self._result_count = self.query.get_count()

        # Some backends give weird, false-y values here. Convert to zero.
        if not self._result_count:
            self._result_count = 0

    # This needs to return the actual number of hits, not what's in the cache.
    return self._result_count - self._ignored_result_count

    ....

将0更改为任何int使得SearchQuerySet始终返回该int,但我仍然不知道为什么如果不是self._result_count将是真的…

解决方法:

看起来这是干草堆中的一个已经报告但尚未解决的错误:

https://github.com/django-haystack/django-haystack/issues/1021

不幸的是,如果“text”索引字段是Ngram或EdgeNgram SearchQuerySet().count()和SearchQuerySet().all().count()将返回0,除非您指定一个过滤器,例如SearchQuerySet().all().exclude(content =’thisshouldnotmatchanythingintheindex’).count()返回索引对象的总数.

标签:django-haystack,whoosh,python,python-3-x,django
来源: https://codeday.me/bug/20191009/1876329.html