我正在使用Haystack和Whoosh来搜索来自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)),
)
答案 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
参数。
我通过删除它解决了我的问题。