4

私はHaystackWhooshを使用して、 Geonamesプロジェクトの都市データでカスタム アプリを検索しています。

Geonames の都市データを少量しかインポートしていません (22917 レコード)。結果を都市の人口順に並べたいのですが、良い結果が得られません。

で使用するorder_bySearchQuerySet、結果が非​​常に遅くなります。また、「名前」フィールドに対しては適切に注文しますが、「人口」フィールドに対しては注文しないので、おそらく何か間違ったことをしているだけだと思います。

検索インデックスは次のとおりです。

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

3 年遅れていることはわかっていますが、最近、与えられたプロジェクトで同じ問題に直面しました。

唯一の問題は、 CharFieldindexed=Falseに渡すパラメーターだと思います。population

それを削除することで問題を解決しました。

于 2016-04-28T09:22:38.317 に答える