Wie implementiere ich die Volltextsuche in Django?

8

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.

Siehe:

%Vor%

Nun, was wäre, wenn ich nicht jedes Wort verketten möchte, nach dem durch ein logisches UND, aber mit einem logischen ODER gesucht wird? Wie würde ich das tun? Gibt es eine Möglichkeit, dies mit Djangos eigenen Queryset-Methoden zu tun oder muss man auf rohe SQL-Abfragen zurückgreifen?

Ist es im Allgemeinen eine gute Lösung, eine Volltextsuche wie diese durchzuführen, oder würden Sie eine Suchmaschine wie Solr, Whoosh oder Xapian empfehlen? Was sind ihre Vorteile?

    
jnns 17.03.2010, 10:09
quelle

6 Antworten

15

Ich empfehle Ihnen, eine Suchmaschine zu übernehmen.

Wir haben die Heuhaufen-Suche verwendet, eine modulare Suchanwendung für django, die viele Suchmaschinen unterstützt (Solr, Xapian, Whoosh, etc ...). )

Vorteile:

  • Schneller
  • führt Suchanfragen durch, auch ohne die Datenbank abzufragen.
  • Suchbegriffe hervorheben
  • "Mehr wie diese" Funktionalität
  • Rechtschreibvorschläge
  • Besseres Ranking
  • usw. ...

Nachteile:

  • Suchindizes können ziemlich schnell an Größe zunehmen
  • Eine der besten Suchmaschinen (Solr) läuft als Java-Servlet (Xapian nicht)

Wir sind ziemlich glücklich mit dieser Lösung und es ist ziemlich einfach zu implementieren.

    
Andrea Zilio 17.03.2010, 10:37
quelle
5

Tatsächlich verwendet die Abfrage, die Sie gepostet haben OR statt AND - Sie verwenden \ , um die Q -Objekte zu trennen. UND wäre & .

Im Allgemeinen würde ich sehr empfehlen, eine richtige Suchmaschine zu verwenden. Wir hatten einen guten Erfolg mit Haystack an der Spitze von Solr - Haystack verwaltet die gesamte Solr-Konfiguration und legt eine nette API offen, die sehr ähnlich zu Djangos eigenem ORM ist.

    
Daniel Roseman 17.03.2010 10:31
quelle
4

Beantworten Sie Ihre allgemeine Frage: Verwenden Sie dafür unbedingt eine geeignete Anwendung.

Mit Ihrer Suchanfrage untersuchen Sie immer den gesamten Inhalt der Felder (Titel, Text, Tags). Sie profitieren nicht von Indizes usw.

Mit einer geeigneten Volltextsuchmaschine (oder wie immer Sie sie nennen) wird Text (Wörter) jedes Mal, wenn Sie neue Datensätze einfügen, indexiert. So werden Abfragen viel schneller, besonders wenn Ihre Datenbank wächst.

    
Felix Kling 17.03.2010 10:37
quelle
4

SOLR ist sehr einfach einzurichten und mit Django zu integrieren. Heuhaufen macht es noch einfacher.

    
Sriram 17.03.2010 11:05
quelle
2

Für die Volltextsuche in Python sehen Sie PyLucene . Es ermöglicht sehr komplexe Abfragen. Das Hauptproblem hier ist, dass Sie einen Weg finden müssen, Ihrer Suchmaschine mitzuteilen, welche Seiten sich geändert haben und den Index schließlich aktualisieren.

Alternativ können Sie Google Sitemaps dazu verwenden, Google zu empfehlen, Ihre Website schneller zu indizieren und anschließend ein benutzerdefiniertes Abfragefeld einzubetten deine Seite. Der Vorteil ist, dass Sie Google nur die geänderten Seiten mitteilen müssen und Google die ganze Arbeit erledigt (Indexierung, Analyse der Abfragen usw.). Darüber hinaus sind die meisten Menschen gewohnt, Google für die Suche zu verwenden. Außerdem wird Ihre Website auch bei den globalen Google-Suchanfragen aktuell bleiben.

    
Aaron Digulla 17.03.2010 10:29
quelle
2

Ich glaube, dass die Volltextsuche auf einer Anwendungsebene eher eine Frage dessen ist, was Sie haben und wie Sie erwarten, dass es skaliert. Wenn Sie eine kleine Website mit geringer Nutzung betreiben, ist es meiner Meinung nach günstiger, eine benutzerdefinierte Volltextsuche durchzuführen, anstatt eine Anwendung zu installieren, um die Suche für Sie durchzuführen. Und die Anwendung würde beim Speichern von Daten mehr Abhängigkeit, Wartung und zusätzlichen Aufwand erzeugen. Indem Sie Ihre Suche selbst durchführen und nette benutzerdefinierte Funktionen hinzufügen. Wenn Ihr Text beispielsweise genau einem Titel entspricht, können Sie den Nutzer auf diese Seite verweisen, anstatt die Ergebnisse anzuzeigen. Eine andere wäre, Titel: oder Autor: Präfixen zu Schlüsselwörtern zu erlauben.

Hier ist eine Methode, die ich verwendet habe, um relevante Suchergebnisse aus einer Web-Abfrage zu generieren.

%Vor%     
Stefan Lundström 17.03.2010 13:57
quelle