4

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

我只导入了少量 Geonames 城市数据(22917 条记录)。我想按城市人口排序结果,但我无法获得好的结果。

当我order_by在 my 上使用时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)),
)
4

3 回答 3

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'),
)
于 2012-10-18T16:04:05.510 回答
0

我发现我也无法使用 order_by 订购结果。我得到了看起来很奇怪的部分排序。我最终意识到默认排序是按相关性排名。我使用的 order_by 大概只是在每个等级内排序。Haystack 文档中并没有真正提出这一点。

我想这个教训可能是,如果你希望你的结果顺序忽略相关性,你需要在显示它们之前对结果进行后期处理。

可能有点跑题了,但我有点惊讶你的索引人口字段是一个 CharField。这与您的模型匹配吗?

于 2012-12-04T13:39:05.580 回答
0

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

我想唯一的问题是indexed=False您传递给populationCharField 的参数。

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

于 2016-04-28T09:22:38.317 回答