Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie würde ich eine einfache Site-Suche mit PHP und MySQL implementieren?

Jeder schlägt die MySQL-Volltextsuche vor, Sie sollten sich jedoch einer RIESIGEN Einschränkung bewusst sein. Die Volltext-Suchmaschine ist nur für die MyISAM-Engine verfügbar (nicht für InnoDB, die aufgrund ihrer referenziellen Integrität und ACID-Konformität die am häufigsten verwendete Engine ist).

Sie haben also ein paar Optionen:

1. Der einfachste Ansatz wird von Particle Tree skizziert . Sie können tatsächlich Ranglistensuchen aus reinem SQL heraus erhalten (kein Volltext, kein gar nichts). Die folgende SQL-Abfrage durchsucht eine Tabelle und ordnet die Ergebnisse basierend auf der Anzahl der Vorkommen einer Zeichenfolge in den Suchfeldern:

SELECT
    SUM(((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'term', '')))/4) +
        ((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'search', '')))/6))
    AS Occurrences
FROM
    posts AS p
GROUP BY
    p.id
ORDER BY
    Occurrences DESC

hat ihr Beispiel bearbeitet, um etwas mehr Klarheit zu schaffen

Variationen der obigen SQL-Abfrage, Hinzufügen von WHERE-Anweisungen (WHERE p.body LIKE '%whatever%you%want') usw. werden Ihnen wahrscheinlich genau das liefern, was Sie brauchen.

2. Sie können Ihr Datenbankschema ändern, um Volltext zu unterstützen. Was oft getan wird, um die referenzielle Integrität von InnoDB, ACID-Compliance und Geschwindigkeit zu erhalten, ohne Plugins wie Sphinx Fulltext Search Engine installieren zu müssen für MySQL besteht darin, die Kursdaten in eine eigene Tabelle aufzuteilen. Grundsätzlich hätten Sie eine Tabelle Quotes, die eine InnoDB-Tabelle ist, die anstelle Ihres TEXT-Felds "data" eine Referenz "quote_data_id" hat, die auf die ID einer Quote_Data-Tabelle zeigt, die eine MyISAM-Tabelle ist. Sie können Ihren Volltext in der MyISAM-Tabelle erstellen, die zurückgegebenen IDs mit Ihren InnoDB-Tabellen verknüpfen und voila, Sie haben Ihre Ergebnisse.

3. Installieren Sie Sphinx . Viel Glück damit.

Angesichts dessen, was Sie beschrieben haben, würde ich SEHR Ich empfehle Ihnen, den ersten Ansatz zu wählen, den ich vorgestellt habe, da Sie eine einfache datenbankgesteuerte Website haben. Die erste Lösung ist einfach und erledigt die Arbeit schnell. Lucene ist schwierig einzurichten, insbesondere wenn Sie es in die Datenbank integrieren möchten, da Lucene hauptsächlich zum Indizieren von Dateien und nicht von Datenbanken entwickelt wurde. Die benutzerdefinierte Google-Site-Suche führt dazu, dass Ihre Site tonnenweise an Reputation verliert (lässt Sie amateurhaft und gehackt aussehen), und der MySQL-Volltext wird Sie höchstwahrscheinlich dazu veranlassen, Ihr Datenbankschema zu ändern.