Ich möchte eine Suchfunktion in einer Django-Blogging-Anwendung implementieren. Der Status quo ist, dass ich eine Liste von Zeichenfolgen habe, die vom Benutzer bereitgestellt werden, und das Abfrage-Set wird von jeder Zeichenfolge eingegrenzt, um nur die Objekte einzuschließen, die der Zeichenfolge entsprechen.Wie implementiert man die Volltextsuche in Django?
Siehe:
if request.method == "POST":
form = SearchForm(request.POST)
if form.is_valid():
posts = Post.objects.all()
for string in form.cleaned_data['query'].split():
posts = posts.filter(
Q(title__icontains=string) |
Q(text__icontains=string) |
Q(tags__name__exact=string)
)
return archive_index(request, queryset=posts, date_field='date')
Nun, was ist, wenn ich will nicht jedes Wort do verketten, die durch eine logische gesucht und doch mit einem logischen ODER? Wie würde ich das tun? Gibt es eine Möglichkeit, dies mit Djangos eigenen Queryset-Methoden zu tun, oder muss man auf reine SQL-Abfragen zurückgreifen?
Im Allgemeinen ist es eine richtige Lösung, eine Volltextsuche wie diese zu machen, oder würden Sie eine Suchmaschine wie Solr, Whoosh oder Xapian empfehlen. Was sind ihre Vorteile?
Er sollte OR verwenden, wenn er eine Volltextsuche möchte. Sein Code ist klar, aber die Beschreibung ist ein bisschen verwirrend. –
Aber die .filter() -Anweisungen sind AND'ed zusammen, nicht wahr? Daher wird nach jedem Suchargument (Wort) im Titel des Posts ODER nach dem Inhalt ODER in den zugehörigen Tags gesucht. Um jedoch als Ergebnis angezeigt zu werden, muss ein Beitrag alle Suchargumente in seinem OR- oder Inhalt-OR-Tag enthalten. Das ist in Ordnung und genau das, was ich erreichen wollte. Ich bin nur neugierig darauf, wie man implementiert, dass ein Ergebnis nur eines der Wörter benötigt, die in einem seiner Attribute vorhanden sein müssen (nicht alle). – jnns