Frage

Sagen Sie, wenn ich eine Tabelle der Bücher in einer MySQL-Datenbank hatte und ich wollte den ‚Titel‘ Feld für Schlüsselwörter (Eingabe durch den Benutzer in einem Suchfeld) suchen; Was ist der beste Weg, dies in PHP zu tun? Ist der MySQL LIKE Befehl der effizienteste Weg zu suchen?

War es hilfreich?

Lösung

Ja, der effizienteste Weg, in der Regel in der Datenbank sucht. Dazu müssen Sie drei Alternativen haben:

  • LIKE, ILIKE passen genau Substrings
  • RLIKE entsprechen POSIX Regexes
  • FULLTEXT- Indizes noch drei verschiedene Arten anzupassen die Suche in der Verarbeitung natürlicher Sprache gerichtet

So ist es hängt davon ab, was Sie tatsächlich werden für die Suche zu entscheiden, was wäre die beste sein. Für Buchtitel würde ich eine LIKE Suche nach dem genauen Teilzeichenfolge Spiel bieten, nützlich, wenn die Menschen wissen, das Buch sie suchen und auch eine Volltextsuche zu helfen, Titel ähnlich wie ein Wort oder einen Satz zu finden. Ich würde ihnen verschiedene Namen auf der Schnittstelle natürlich geben, wahrscheinlich so etwas wie genau für die String-Suche und ähnliche für die Volltextsuche.

Ein Beispiel über Volltext: http: // www .onlamp.com / pub / a / ONLamp / 2003/06/26 / fulltext.html

Andere Tipps

Hier ist eine einfache Möglichkeit, einige Schlüsselwörter auseinander brechen können einige Klauseln bauen zum Filtern einer Spalte auf diesen Keywords, entweder eine AND-Operation oder ODER-Verknüpfung zusammen.

$terms=explode(',', $_GET['keywords']);
$clauses=array();
foreach($terms as $term)
{
    //remove any chars you don't want to be searching - adjust to suit
    //your requirements
    $clean=trim(preg_replace('/[^a-z0-9]/i', '', $term));   
    if (!empty($clean))
    {
         //note use of mysql_escape_string - while not strictly required
         //in this example due to the preg_replace earlier, it's good
         //practice to sanitize your DB inputs in case you modify that
         //filter...
         $clauses[]="title like '%".mysql_escape_string($clean)."%'";
    }
}

if (!empty($clauses))
{   
    //concatenate the clauses together with AND or OR, depending on
    //your requirements
    $filter='('.implode(' AND ', $clauses).')';

    //build and execute the required SQL
    $sql="select * from foo where $filter";
}
else
{
    //no search term, do something else, find everything?
}
Betrachten

Sphinx . Es ist ein Open-Source-Volltext-Engine, die Ihre MySQL-Datenbank direkt verbrauchen können. Es ist viel besser skalierbar und flexibler als LIKE-Anweisungen Hand-Codierung (und weit weniger anfällig für SQL-Injection)

Sie können auch soundex Funktionen (soundex, klingt wie) in MySQL-Handbuch http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_soundex Seine funktionalen diese Begegnungen zurück, wenn zum Beispiel strenge Prüfung (durch LIKE oder =) brachte keine Ergebnisse zurück.

Paul Dixon Codebeispiel wird die Hauptidee über gut für den LIKE-basierten Ansatz.

Ich werde ihm nur Usability Idee hinzu: Geben Sie ein (AND | OR) Optionsfeld in der Schnittstelle festgelegt, standardmäßig auf, und dann, wenn ein Abfrage-Ergebnisse des Benutzers in Null (0) Spielen und mindestens zwei Worte enthalten, reagieren mit einer Option auf die Wirkung:

  

"Hinweis: Keine Spiele wurden für Ihren Suchbegriff gefunden. Suche erweitern in Ihrem Satz auf ein beliebiges Wort übereinstimmen?

Vielleicht gibt es einen besseren Weg, um Wort dieses, aber die Grundidee ist es, die Person zu einer anderen Abfrage zu führen (, das erfolgreich sein kann ), ohne dass der Benutzer in Bezug auf die Boolesche Logik denken von AND und OR.

Ich denke, wie der effizienteste Weg ist, wenn es ein Wort ist. wie schon gesagt, Multi Worte mit explodieren Funktion aufgeteilt werden. Es kann dann geschlungen und verwendet wird einzeln durch die Datenbank zu suchen. Wenn gleiche Ergebnis zweimal zurückgegeben wird, kann es durch das Lesen der Werte in einem Array überprüft werden. Wenn es bereits im Array vorhanden ist, ignorieren Sie es. Dann mit Zählfunktion, werden Sie wissen, wo während des Druckens mit einer Schleife zu stoppen. Sortierung kann mit similar_text Funktion erfolgen. Der Prozentsatz wird verwendet, um das Array zu sortieren. Das ist das Beste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top