PHP / MySql 'Erweiterte Suche' Seite

8

Ich arbeite an einer Seite für die erweiterte Suche auf einer Website, auf der Sie ein Keyword wie "Ich mag Äpfel" eingeben und die Datenbank mithilfe der folgenden Optionen durchsuchen kann:

  

Finden: Mit allen Wörtern, mit dem   genauer Satz, mit mindestens einem von   die Wörter, ohne die Wörter

Ich kann mich um den 'Exakten Ausdruck' kümmern:

%Vor%

'Mindestens eines der Wörter' by:

%Vor%

Aber es ist die "mit mindestens einem der Worte" und "ohne die Worte", dass ich feststeckt.

Irgendwelche Vorschläge zur Umsetzung dieser beiden?

Bearbeiten: In Bezug auf "Mindestens ein Wort" wäre es kein guter Ansatz, explode () zu verwenden, um die Schlüsselwörter in Wörter zu zerlegen und eine Schleife zum Hinzufügen von

auszuführen %Vor%

Weil es auch andere AND / OR-Klauseln in der Abfrage gibt und mir die maximale Anzahl von Klauseln nicht bekannt ist.

    
Click Upvote 02.01.2009, 11:55
quelle

5 Antworten

13

Ich würde vorschlagen, die MySQL FullText-Suche zu verwenden, die dies mit der Boolesche Volltextsuche Funktionalität sollten Sie in der Lage sein, Ihr gewünschtes Ergebnis zu erhalten.

Bearbeiten:

Angefordertes Beispiel basierend auf den von Ihnen angeforderten Bedingungen ("Es ist nur ein Feld und sie können eine der 4 Optionen auswählen (z. B. 1 Wort, exakte Wörter, mindestens 1 Wort, ohne den Begriff).")

Ich gehe davon aus, dass Sie PHP basierend auf Ihrem ursprünglichen Beitrag verwenden

%Vor%

hoffe, das hilft bei der vollständigen Verwendung der Operatoren in Booleschen Übereinstimmungen, siehe Boolescher Volltext Suchen

    
Mark Davidson 02.01.2009, 12:04
quelle
2

Sie könnten

verwenden

Mit mindestens einem der Wörter

%Vor%

Ohne das Wort

%Vor%     
Re0sless 02.01.2009 12:01
quelle
2

Ich bin mir nicht sicher, ob Sie diese Suchoptionen auf naive Art und Weise so einfach machen könnten wie die anderen beiden.

Es würde sich lohnen, eine bessere Suchmaschine zu implementieren, wenn Sie diese Szenarien unterstützen müssen. Ein einfacher Weg, der Sie wahrscheinlich erreichen könnte, ist etwas in dieser Richtung:

Wenn ein Element zur Datenbank hinzugefügt wird, wird es in die einzelnen Wörter aufgeteilt. An diesem Punkt werden "allgemeine" Wörter (das, a, etc ...) entfernt (wahrscheinlich basierend auf einer common_words Tabelle). Die restlichen Wörter werden zu einer Wörtertabelle hinzugefügt, wenn sie nicht bereits vorhanden sind. Es gibt dann eine Verbindung zwischen dem Worteintrag und dem Eintrag.

Bei der Suche kommt es dann darauf an, die Wort-IDs aus der Worttabelle zu erhalten und die Element-IDs in der Verbindungstabelle nachzuschlagen.

    
Giraffe 02.01.2009 12:03
quelle
1

Die Suche ist notorisch schwierig, gut zu machen.

Sie sollten in Erwägung ziehen, eine Suchmaschine von Drittanbietern zu verwenden, die etwas wie Lucene oder Sphider .

    
seanyboy 02.01.2009 12:07
quelle
0

Giraffe und Re0sless haben zwei gute Antworten gefunden.

Notizen: "SELECT *" saugt ... nur die Spalten auswählen, die Sie benötigen. Re0less setzt ein "OR" zwischen den Keywords.  - Sie sollten gängige Wörter ("", "i", "am", "und" usw.) eliminieren.  - mysql hat ein 8kb i belive Limit für die Größe der Abfrage, also sollten Sie für sehr lange SELECTS diese in separate Abfragen einfügen.  - versuche, doppelte Keywords zu eliminieren (wenn ich nach "Du weißt, dass es dir gefällt" sucht, sollte SELECT grundsätzlich nur einmal nach "du" suchen und gängige Wörter als "es" eliminieren)

Versuchen Sie auch, "LIKE" und "MATCH LIKE" zu verwenden (siehe mysql man page), es könnte Wunder für "unscharfe" Suchen tun

    
Quamis 02.01.2009 12:08
quelle

Tags und Links