2012-08-03 83 views
4

我使用HaystackWhooshGeonames项目中使用城市数据搜索自定义应用程序。无法订购Haystack/Whoosh结果(而且速度非常慢)

我只有进口国地名城市数据(22917条记录)的量小。我想按一个城市的人口排列结果,而且我很难获得好的结果。

当我在我的SearchQuerySet使用order_by,结果是极其缓慢。它也正确地反对'名字'字段而不是'人口',所以我认为我可能只是在做错事。

这里的搜索索引:

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秒。

注:我也试图与内置的草垛搜索视图,当我试图通过人口订购这是非常缓慢:

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

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

回答

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'), 
) 
0

我发现我无法使用order_by命令结果。我看起来像是一个奇怪的部分排序。我最终意识到,默认排序是通过相关性排名。我使用的order_大概只是在每个等级内进行排序。这一点在Haystack文档中并没有真正提出。

我想教训可能是,如果你希望你的结果以忽略相关性,你需要展示他们之前发布过程的结果。

可能有点题外话,但我有点惊讶你的索引人口领域是一个CharField。这与您的模型相匹配吗?

0

我知道我有三个旬,但最近我遇到了同样的问题与我一直在考虑的项目。

我想唯一的问题是要传递到​​CharField的indexed=False参数。

我通过去除固定我的问题。