2

35個のフィールド(Char、Int、Bool、Dec、M2M、FK)を持つUserProfileモデルがあります。検索ビュー機能の一部として、フィールドの1つは全文検索を必要とし、残りの34フィールドは「高度な検索フィルタリング」を提供するために使用されます(__gte、__ lte、__ excat、__in、__ startswithを使用)。「検索」クエリでは、検索ビューの条件として5〜35個のフィールドを使用できます。

haystackを使用してSearchIndexを構築しており、現在35のフィールドすべてが追加されていますが、django ORM(?)をバイパスしているため、これは効果がないようです。

Filter Django Haystackからの回答はQuerySetのようになりますか?SearchIndexに単一の全文検索フィールドを格納し、残りの34個のフィルターフィールドに対してSearchQuerySetをdjangoのQuerySetと組み合わせることができることを示唆しています。次に、djangoモデルのこれらのフィールドの一部またはすべてでdb_index = Trueを使用しますか?この2段階のクエリマージアプローチを使用すると、何千もの結果にうまく対応できますか?

私のUserProfileモデルは300K〜2Mのエントリに成長する可能性があるため、このモデルにインデックスを付けるのに最適な方法を理解しようとしています。dbのインデックス作成と検索に慣れていないので、データベースを最適化するための最善の方法についての洞察を探しています。

4

1 に答える 1

0

2つを混合することは、おそらくスケーラブルではありません。クエリセットまたはSearchQuerySetを構築している場合、どこかで結果を要求するまでクエリは実際には実行されないため、その意味では怠惰です。

しかし、あなたが次のようなことをするなら

results = [ r.pk for r in searchqueryset ]

実際には、haystack/solrに対してそのクエリを実行します。合計で200万のエントリを見ている場合、それはリストが200万のアイテムを返す可能性があることを意味します。そして今、あなたはさらにフィルタリングを行うために(ORMを使用して)MySQLに2Mリストを送信しています。これは明らかにスケールアップすることはありません。

haystackに固執してから、searchquerysetを構築し続けると、結果にアクセスしたときに1回だけ実行されます。また、{{result.object}}を減らすことにも注意してください。これは、結果ごとにデータベースにも影響を与えるためです。

load_all()、ファセットなどを見ることができます。

于 2011-04-28T01:14:16.610 に答える