2010-01-29 2 views
10

Django Haystack 검색을 "내장"QuerySet 필터 작업, 특히 Q() 인스턴스로 필터링하고 SearchQuerySet에서 지원하지 않는 조회 유형을 결합 할 수 있습니까? 순서 중 하나에 :Django Haystack 결과는 QuerySet과 유사합니까?

haystack-searched -> queryset-filtered 

또는

queryset-filtered -> haystack-searched 

방법이 작업을 수행하는 어떤 지시를주지 않았다 장고 건초 더미 문서를 찾아.

답변

10

당신은 객체의 PK와를 사용하여 건초 더미 검색의 결과에 따라 검색어 세트를 필터링 할 수 있습니다 :

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}); 

하지 않음이 확장 방법을 잘하지만, 작은 결과 집합에 대한 (몇 백, 내 경우) ,이 잘 작동합니다.

예를 템플릿에 :

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

하지만이 때문에 정말 나쁜 당신이 적절와 유지하려면

+6

이렇게하면 결과가 ID별로 정렬되어 해당 사항을 잃게됩니다. – dzen

+0

@ dzen 관련성 순위를 유지하면서이 작업을 수행하는 가장 좋은 방법은 무엇입니까? –

+5

이것은 축척되지 않습니다. 쿼리가 너무 길어질 것이라고 가정합니다. 몇 천 개의 ID가 있으면 0 개의 결과가 나타납니다. –

0

, 당신은 "객체"를 통해 데이터베이스에서 개체에 액세스해야 haystack은 각 결과에서 "SELECT * FROM blah WHERE id = 42"와 같은 추가 요청을합니다.

색인에 몇 가지 추가 입력란을 넣지 않았기 때문에 데이터베이스에서 해당 개체를 가져 오려고합니다. SearchIndex에 제목과 저자를 추가하면 검색 결과를 사용할 수 있습니다.

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

일부 검색어는 사용하지 마십시오. 워드 프로세서

+1

searchqueryset.load_all()을 실행하면 개체가 모두 한 번에 하나씩 효율적으로 데이터베이스에서 미리로드됩니다. – melinath

+0

"SELECT * FROM blERE where id in (12, 132,1251)"와 같이 뭔가 새로운 소켓을 열려면 효율적입니까, 거기에서 데이터를 가져 옵니까? – dzen

1

:

SearchQuerySet.load_all (자기)

효율적으로 검색 결과의 개체를 채 웁니다. 이 방법을 사용하지 않으면 DB 조회가 개체 단위로 수행되므로 데이터베이스로의 개별 트립이 발생합니다. load_all이 사용되는 경우 SearchQuerySet은 유사한 객체를 단일 쿼리으로 그룹화하여 다른 객체 유형이있는만큼 많은 쿼리를 반환합니다. 이 반환됩니다. 따라서

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 
관련 문제