2011-01-10 3 views
12

Was ist der beste Weg, um eine PHP-Suche mySQL & zu bauen?Der beste Weg, um eine SMART mySQL & PHP Suchmaschine zu erstellen?

Ich bin derzeit mit Dingen wie

% Begriff%

Ich will es in der Lage sein, das Ergebnis zu finden, auch wenn sie etwas falsch buchstabieren, zum Beispiel:

Feld Wert = "One: Stop Shop:

Sie suchen:

One Shop-Stop-

ODER

One Stop Shop

Etc .. Ich möchte eine wirklich intelligente Suche, so dass sie die Informationen auch dann, wenn sie nicht finden, die genaue Sache suchen.

Was ist der beste Weg, um eine intelligente Suche wie folgt zu erstellen?

+0

Warum nicht versuchen, einige Tutorials wie: http://www.youtube.com/watch?v=6pW7mGr8oAU oder http: //www.devshed.com/c/a/MySQL/Building-a-Search-Engine-with-MySQL-and-PHP-5/1/ – Jason

+1

Warum sollten Sie das Rad neu erfinden, wenn es perfekt vorgefertigte Räder gibt? ? Nachschlagen Lucene (http://lucene.apache.org/java/docs/index.html) und Sphinx (http://sphinxsearch.com/) –

Antwort

6

like '%term%' ist schrecklich langsam und nicht optimierte, könnten Sie zum Volltext für diese Spalte und use boolean mode for this

Wie

match(column) against('+One +Shop +Stop' in boolean mode) 

Beachten Sie auf die min Wortlängen 4 hinzugefügt werden soll, so, müssen Sie überlegen, es zu drei ändern, und die Volltextsuche für myisam nur

Andere Open-Source-Suchmaschine wie sphinx für diese auch ideal ist

+0

Ajreal hat Recht. Sie müssen dem Feld, nach dem Sie suchen möchten, einen Volltextindex hinzufügen. Führen Sie dann eine Übereinstimmungserklärung aus, um die eigentliche Suche durchzuführen. Sie können sogar nach Relevanz sortieren. google für mehr Details. – dqhendricks

+3

Stellen Sie sicher, dass Sie über genügend Testdaten verfügen, wenn Sie Volltextindizes testen. Wenn die Ergebnisse größer als 50% der Gesamtzahl der Datensätze sind, zählt dies als fehlgeschlagene Suche. Dies könnte Ihre Gesundheit beeinträchtigen, wenn Sie es nicht wissen. Mir geht es jetzt aber gut. – Cups

5

Sie können nicht effizient sein, indem Sie Ihre Rohdaten durchsuchen. Diese Art der Textsuche hängt davon ab, wie die Daten indexiert werden (hier kommt der Google-Bot für Google).

Also, Schritt 1 ist Indexierung. Wenn sich Ihre Daten auf einigen Webseiten befinden, können Sie Standard-Crawler verwenden (oder sogar einen eigenen Crawler erstellen, ich würde Python zum Erstellen eines Crawlers vorschlagen). Wenn sich Ihre Daten in einer Datei befinden (nicht im Web durchsuchbar), müssen Sie für die Indizierung ein Programm schreiben, um alle Daten zu lesen und zu indizieren.

Schritt 2 sucht. Der Suchansatz hängt von der Indexierungsstrategie ab.

Wenn Sie für PHP-MySQL-basiertes System suchen, die Codes dieser Projekte überprüfen:

http://www.phpdig.net/

http://sphinxsearch.com/

Wenn Sie mehr, Suche in IEEE Xplore/ACM Publikationen wissen wollen Archiv. Sie werden viele Veröffentlichungen zu diesem Thema erhalten.

+0

Was ist, wenn ich über 300.000 Seiten habe? – Latox

+0

Wenn Sie wirklich mehr als 300.000 Seiten indexieren müssen, lesen Sie besser Themen wie "Distributed Search Techniques". Die Verwendung von MySQL wird für große Datenmengen nicht sehr effizient sein. Sie benötigen ein eigenes Dateisystem. Glücklicherweise können Sie ein offenes Sourse-Dateisystem verwenden. Praktisch haben wir einen spezialisierten Crawler (nicht öffentlich geöffnet). Wir verarbeiten Gigabytes an Daten. Wir haben unser eigenes Dateisystem und wir stellen unsere gesamten Daten und Crawler in die Amazon Cloud ein. Die Kosten der Amazon Cloud sind es wert. –

+0

Wenn Sie nicht in der Stimmung für Papiere suchen, erhalten Sie mindestens eine Kopie von "Lucene in Action" (ISBN 1-932394-28-1). Sie können eine Zusammenfassung erhalten. Außerdem können Sie Lucene (Java-basiert) verwenden. Aber in Ihrer Frage haben Sie nach einer PHP-MySQL-Lösung gefragt. –

2

Sie können die SOUNDEX() Funktion verwenden, ist es sowohl in PHP und MYSQL verfügbar SOUNDEX() with MYSQL

+1

Dies kann im OP-Fall nützlich sein oder auch nicht. Zum Beispiel sind die Soundex-Codes für "stop" und "shop" unterschiedlich. –

5

AJreal Recht ist ...nur dachte ich ein Beispiel hinzufügen würde, um zu helfen:

$query = sprintf("SELECT *, " 
        . " MATCH(data) AGAINST('%s' IN BOOLEAN MODE) AS relevance " 
        . " FROM table_name" 
        . " ORDER BY relevance DESC LIMIT 20 ", 

hoffe, das hilft

Verwandte Themen