2016-12-15 3 views
0

Ich arbeite gerade an einer Suche nach meiner Django-Site und möchte eine Abfrage durchführen, um zu sehen, wie oft sie in einem Beitragsnamen und einer Beschreibung erscheint und die Ergebnisse mit den Posts mit der Suchanfrage zurückgibt das meiste an der Spitze (dh wenn ich nach "Auto" suche, sollte ein Posten mit Auto erwähnt 5 Mal vor einem Posten erscheinen, der "Auto" einmal erwähnt).Gefilterte Ergebnisse nach Gesamtvorkommen sortieren

Hier ist mein views.py:

def stack_list(request, query): 
    context_dict = {} 

    stacks_list = Stack.objects.filter(
     Q(name__icontains=query) | 
     Q(description__icontains=query) 
    ).annotate(total_occurance=Count('name')+Count('description') 
    ).order_by('total_occurance').distinct() 

    context_dict['stacks_list'] = stacks_list 

    return render(request, 'stack/index_search_results.html', context_dict) 

und meine html:

{% for stack in stacks_list %} 
    <p>{{ stack.name }} 
    {{ stack.description }}</p> 
{% endfor %} 

Allerdings, wenn ich eine Abfrage versuchen, es organisieren nicht es in absteigender Reihenfolge. Irgendwelche Ideen, wo ich falsch liege?

+0

In aufsteigender Reihenfolge? Oder nicht bestellt? –

+0

Es scheint überhaupt nicht bestellt zu werden – ng150716

+0

Versuchen Sie, die '.distinct()' zu entfernen. Es scheint, dass ein Problem auftritt, wenn Sie distinct mit order_by verwenden. (https://docs.djangoproject.com/de/1.10/ref/models/querysets/#distinct) –

Antwort

0

Warum nicht Ad-hoc-Tools für Suchzwecke verwenden? Zum Beispiel Django Postgres full text search oder Django Haystack für komplexere Suche und Facettierung (meiner Meinung nach haben dieses Tool einige Nachteile - wenn ich mit elasticsearch arbeite, verwende ich Elasticsearch DSL Python-Bibliothek). Hoffe es hilft, tut mir leid, wenn Sie versuchen, den Fall genau aus diesem Grund zu lösen.

+0

Ja, ich schaue in Heuhaufen, danke Für die anderen Optionen werde ich sie jetzt definitiv durchsehen. Ich bin ein bisschen ein Anfänger auf der Suche, aber gibt es einen großen Unterschied (in großen Websites) mit einem Drittanbieter-Tool wie Heuhaufen oder Elasticsearch DSL vs Filterung in Ansichten? – ng150716

+0

Ja, natürlich. Suchmaschinen wie elasticsearch oder sphinx geben Ihnen viel mehr Flexibilität und Power in Abfragen, viele Metriken, Filter, Sortieroptionen, Aggregationen. Und am wichtigsten ist es, die Suchergebnisse zu bewerten. Aber in kleinen Projekten kann es redurdant sein, und schwer zu verwalten, Engine-Server, Indicies, so empfehle ich versuchen Django die Volltextsuche Unterstützung für Postgres. In großen Projekten sollten Sie auf jeden Fall eine separate Lösung verwenden. –

+0

'' 'Stack.objects.filter ( Q (name__icontains = Abfrage) | Q (description__icontains = Abfrage) ) .annotate ( name_occurance = Count ('name'), desc_occurance = Count ('description'), total_occurance = Summe ('name_occurance', 'desc_occurance') ) .order_by ('total_occurance') '' ' –