私は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
外すと、1 秒もかからずに返されます。オンにすると、完了するまでに約 10 秒かかり、結果は人口順に並べられません。名前による注文は機能しますが、10 秒ほどかかります。
注: 組み込みの Haystack 検索ビューも試しましたが、人口で並べ替えようとすると非常に遅くなります。
qs = SearchQuerySet().order_by('-population')
urlpatterns = patterns('',
...
url(r'^demo2/$', SearchView(searchqueryset=qs)),
)