无法订购Haystack / Whoosh结果(而且速度非常慢)

时间:2012-08-03 17:55:12

标签: django-haystack

我正在使用HaystackWhoosh来搜索来自Geonames项目的城市数据的自定义应用。

我只导入了少量的Geonames城市数据(22917条记录)。我想按照一个城市的人口来订购结果,而我却无法取得好成绩。

当我在order_by上使用SearchQuerySet时,结果非常慢。它也可以在“名称”字段中正确排序,而不是“人口”,因此我认为我可能只是做错了。

这是搜索索引:

class EntryIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    name = indexes.CharField(indexed=False, model_attr='ascii_name')
    population = indexes.CharField(indexed=False, model_attr='population')
    django_id = indexes.CharField(indexed=False, model_attr='id')

    def get_model(self):
        return Entry

    def index_queryset(self):
        return self.get_model().objects.all()

这是模板:

{{ object.ascii_name }}
{{ object.alternate_names }}
{{ object.country.name }}
{{ object.country.iso }}
{{ object.admin1_division.ascii_name }}
{{ object.admin1_division.name }}
{{ object.admin1_division.code }}
{{ object.admin2_division.ascii_name }}
{{ object.admin2_division.name }}

以下是相关的观看代码:

query = request.GET.get('q', '')
results = SearchQuerySet().models(Entry).auto_query(query).order_by('population')

当我从查询中取出order_by时,它会在不到一秒的时间内返回。有了它,它需要大约10秒钟才能完成,结果不是按人口排序的。按名称排序有效,但也需要约10秒。

注意:我也尝试使用内置的Haystack搜索视图,当我尝试按人口排序时,它非常慢:

qs = SearchQuerySet().order_by('-population')

urlpatterns = patterns('',
    ...
    url(r'^demo2/$', SearchView(searchqueryset=qs)),
)

3 个答案:

答案 0 :(得分:1)

我做的几乎是一样的,订购对我来说工作快速而正确。

你所做的唯一不同的是:

query = request.GET.get('q', '')
results = SearchQuerySet().models(Entry).auto_query(query).order_by('population')

由于您指定了一个请求,我假设您已经创建了自己的视图。您不应该需要自定义视图。我在urls.py中实现了这个:

from haystack.forms import ModelSearchForm
from haystack.query import SearchQuerySet
from haystack.views import SearchView, search_view_factory

sqs = SearchQuerySet().models(MyModel).order_by('-weight')

urlpatterns += patterns('',
    url(r'^search/$', search_view_factory(
        view_class=SearchView,
        template='search/search.html',
        searchqueryset=sqs,
        form_class=ModelSearchForm
    ), name='search'),
)

答案 1 :(得分:0)

我发现无法使用order_by订购结果。我得到的似乎是一个奇怪的部分排序。我最终意识到默认排序是通过相关性排名。我使用的order_by可能只是在每个等级内排序。 Haystack文档中没有提到这一点。

我想这一课可能是因为如果您希望结果顺序忽略相关性,则需要在显示结果之前对结果进行后处理。

可能有点偏离主题,但我有点惊讶你的索引填充字段是CharField。这与您的型号匹配吗?

答案 2 :(得分:0)

我知道我迟到了三年,但最近我遇到了同样的问题我已经给了一个项目。

我想唯一的问题是你传递给indexed=False CharField的population参数。

我通过删除它解决了我的问题。