Django Haystack 和 Whoosh 搜索工作正常,但 SearchQuerySet Return 0 个结果
Django Haystack & Whoosh Search Working, But SearchQuerySet Return 0 Results
编辑:更多信息在 post...
底部
原问题:
我似乎遇到了与这个(未解决的)问题相同的问题:
我已经在我的 Django 项目上使用 Whoosh 设置了 Haystack,一开始一切正常(SearchQuerySet 用于 return 结果),但在尝试创建新的自定义搜索表单(滚动)失败后从 git 返回)看来索引和原始搜索页面仍然可以正常工作,但现在 SearchQuerySet() 总是 returns 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()
总是 returns 0
!
相关pip freeze
:
- Python 3.5.2
- Django 1.9.3
- django-haystack 2.5.0
- Whoosh 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 始终 return 那个 int,但我仍然不知道为什么 if not self._result_count
会是 true...
看起来这是 haystack 中的一个错误,已报告但尚未解决:
https://github.com/django-haystack/django-haystack/issues/1021
不幸的是,如果 "text" 索引字段是 Ngram 或 EdgeNgram SearchQuerySet().count()
并且 SearchQuerySet().all().count()
将 return 0
除非您指定过滤器,例如SearchQuerySet().all().exclude(content='thisshouldnotmatchanythingintheindex').count()
returns 索引对象总数。
编辑:更多信息在 post...
底部原问题:
我似乎遇到了与这个(未解决的)问题相同的问题:
我已经在我的 Django 项目上使用 Whoosh 设置了 Haystack,一开始一切正常(SearchQuerySet 用于 return 结果),但在尝试创建新的自定义搜索表单(滚动)失败后从 git 返回)看来索引和原始搜索页面仍然可以正常工作,但现在 SearchQuerySet() 总是 returns 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()
总是 returns 0
!
相关pip freeze
:
- Python 3.5.2
- Django 1.9.3
- django-haystack 2.5.0
- Whoosh 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 始终 return 那个 int,但我仍然不知道为什么 if not self._result_count
会是 true...
看起来这是 haystack 中的一个错误,已报告但尚未解决:
https://github.com/django-haystack/django-haystack/issues/1021
不幸的是,如果 "text" 索引字段是 Ngram 或 EdgeNgram SearchQuerySet().count()
并且 SearchQuerySet().all().count()
将 return 0
除非您指定过滤器,例如SearchQuerySet().all().exclude(content='thisshouldnotmatchanythingintheindex').count()
returns 索引对象总数。