11
votes

Filtre Django Haystack entraîne des résultats comme QuerySet?

est-il possible de combiner une recherche de Django HAYStack avec des opérations de filtre de querySet "intégrées", filtrant spécifiquement des instances Q () et des types de recherche non pris en charge par SearchQuiserySet? Dans l'un ou l'autre ordre: xxx

ou xxx

navigation de navigation de la documentation de Django HaNstack n'a donné aucune direction comment faire cela.


0 commentaires

3 Réponses :


11
votes

Vous pouvez filtrer votre queryset en fonction des résultats d'une recherche de fointes, à l'aide des objets des objets:

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


3 commentaires

Avec cela, vos résultats seront triés par IDS et vous perdrez la pertinence.


@ Dzen Quelle est la meilleure façon de le faire tout en conservant le rang de pertinence, alors?


Cela n'échappe pas. Je suppose que la requête devient trop longue - avec quelques milliers d'identifiants il y aura 0 résultats.



0
votes

Si vous souhaitez suivre la pertinence, vous devez accéder à l'objet de la base de données via "Objet":

Exemple dans votre modèle: P>

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


2 commentaires

Si vous exécutez RECHERCHERQUERYSET.LOAD_ALL (), les objets seront tous préchargés de la base de données aussi efficacement que possible, au lieu d'une à la fois.


Avec quelque chose comme "Select * du bla où ID dans (12, 132 1251)" de sorte que cela est efficace, à ouvrir (peut-être) une nouvelle prise, récupérez des données de là?



1
votes

de la DOCS:

searchQuiseryset.load_all (auto)

Pumpule efficacement les objets dans les résultats de la recherche. Sans utiliser Cette méthode, les recherches de dB sont effectuées sur une base d'objet, entraînant de nombreux voyages individuels dans la base de données. Si load_all est utilisé, le SearchQuiserySet va grouper des objets similaires dans une seule requête, résultant uniquement autant de requêtes que certains types d'objets différents retourné.

http: // Django-Haystack. readthedocs.org/en/latest/searchQueryset_api.html#load-all

Par conséquent, après avoir eu un SQ filtré, vous pouvez effectuer une connexion LOAD_ALL () dessus et accéder à des objets de base de données via SearchResult.Object. Par exemple. xxx


0 commentaires