12

Django Haystack 検索を「組み込み」の QuerySet フィルター操作、具体的には SearchQuerySet でサポートされていない Q() インスタンスと検索タイプでフィルタリングすることを組み合わせることは可能ですか? どちらの順序でも:

haystack-searched -> queryset-filtered

また

queryset-filtered -> haystack-searched

Django Haystack のドキュメントを閲覧しても、これを行う方法についての指示はありませんでした。

4

3 に答える 3

12

オブジェクトの PK を使用して、Haystack 検索の結果に基づいてクエリセットをフィルタリングできます。

def view(request):
  if request.GET.get('q'):
    from haystack import ModelSearchForm
    form = ModelSearchForm(request.GET, searchqueryset=None, load_all=True)
    searchqueryset = form.search()
    results = [ r.pk for r in searchqueryset ]

    docs = Document.objects.filter(pk__in=results)
    # do something with your plain old regular queryset

    return render_to_response('results.html', {'documents': docs});

これがどのようにスケーリングするかはわかりませんが、小さな結果セット (私の場合は数百) の場合、これはうまく機能します。

于 2010-06-14T12:46:02.037 に答える
1

ドキュメントから:

SearchQuerySet.load_all(self)

検索結果にオブジェクトを効率的に入力します。この方法を使用しない場合、DB ルックアップはオブジェクトごとに行われるため、データベースへの個々のトリップが多数発生します。load_all が使用されている場合、SearchQuerySet は同様のオブジェクトを 1 つのクエリにグループ化するため、返されるさまざまなオブジェクト タイプと同じ数のクエリのみが生成されます。

http://django-haystack.readthedocs.org/en/latest/searchqueryset_api.html#load-all

したがって、フィルタリングされた SQS を取得したら、それに対して load_all() を実行し、SearchResult.object を介してデータベース オブジェクトにアクセスするだけです。例えば

sqs = SearchQuerySet()
# filter as needed, then load_all
sqs = sqs.load_all()

for result in sqs:
    my_obj = result.object
    # my_obj is a your model object
于 2014-06-18T21:03:58.467 に答える
0

関連性についていきたい場合は、「オブジェクト」を介してデータベースからオブジェクトにアクセスする必要があります。

テンプレートの例:

{% for result in results %}
    {{ result.object.title }}
    {{ result.objects.author }}
{% endfor %}

しかし、haystack は結果ごとに "SELECT * FROM blah WHERE id = 42" のような追加のリクエストを行うため、これは非常に悪いことです。

インデックスに追加のフィールドを追加しなかったため、データベースからこれらのオブジェクトを取得しようとしているようですね。SearchIndex にタイトルと著者を追加すると、結果をそのまま使用できます。

{% for result in results %}
    {{ result.title }}
    {{ result.author }}
{% endfor %}

いくつかの余分なクエリを避けます。

于 2011-07-15T15:01:30.267 に答える