4 Stimmen

Implementierung der Datenbanksuche durch Abfrage mit like

Ich plane, Datenbank-Suche über eine Website zu implementieren - ich weiß, es gibt Volltextsuche von mysql angeboten, aber stellt sich heraus, dass es nicht für innodb-Engine (die ich für Transaktionsunterstützung benötigen) unterstützt wird. Andere Optionen sind die Verwendung von Sphinx oder ähnlichen Indizierungsanwendungen. Sie erfordern jedoch eine Umgestaltung der Datenbankstruktur und können mehr Zeit in Anspruch nehmen, als ich zur Verfügung habe.

Also entschied ich mich, jede Tabelle zu nehmen und alle relevanten Spalten in einer neu hinzugefügten QUERY-Spalte zu verketten. Diese Abfragespalte sollte auch aus Spalten anderer relevanter Tabellen rekrutieren.

Um dies zu erreichen, verwende ich die "like"-Klausel in der Abfragespalte der zu durchsuchenden Tabelle, um die Ergebnisse bestimmter Domänen (Gruppe von Bezugstabellen) zu finden.

Da meine Datenbank nicht allzu groß sein soll (< 1 Mio. Zeilen in der größten Tabelle), erwarte ich angemessene Abfragezeiten.

Ist jemand mit dieser Methode einverstanden oder hat jemand eine bessere Idee?

6voto

Bill Karwin Punkte 493880

Sie werden mit der Lösung, LIKE mit Wildcards zu verwenden, nicht zufrieden sein. Sie ist hunderte oder tausende Male langsamer als eine Volltextsuche.

Siehe meine Präsentation Praktische Volltextsuche in MySQL .

Anstatt die Werte in eine QUERY-Spalte zu kopieren, würde ich empfehlen, die Werte in eine MyISAM-Tabelle zu kopieren, in der Sie einen FULLTEXT-Index definiert haben. Dazu könnten Sie Trigger verwenden.

Sie brauchen die Werte nicht miteinander zu verknüpfen, sondern nur die Primärschlüsselspalte und jede Ihrer durchsuchbaren Textspalten.

CREATE TABLE OriginalTable (
  original_id SERIAL PRIMARY KEY,
  author_id INT,
  author_date DATETIME,
  summary TEXT,
  body TEXT
) ENGINE=InnoDB;

CREATE TABLE SearchTable (
  original_id BIGINT UNSIGNED PRIMARY KEY, -- not auto-increment
  -- author_id INT,
  -- author_date DATETIME,
  summary TEXT,
  body TEXT,
  FULLTEXT KEY (summary, body)
) ENGINE=MyISAM;

1voto

Marcus Adams Punkte 51234

Sie müssen einen Index zu Ihrer Abfragespalte hinzufügen. Wenn am Anfang des Suchausdrucks ein Platzhalter steht, kann MySQL den Index nicht verwenden.

Wenn Sie eine andere Suche als "gleich" durchführen ( LIKE 'test' ) oder "beginnt mit" ( LIKE 'test%' ), muss MySQL jede Zeile scannen. Zum Beispiel kann eine "Enthält"-Suche ( LIKE '%test%' ) ist nicht in der Lage, den Index zu verwenden.

Sie könnten ein "endet mit" zulassen ( 'LIKE %test ), aber Sie müssten eine umgekehrte Spalte für den Index erstellen, damit Sie tatsächlich LIKE 'test%' um den Index zu verwenden.

Jede vollständige Suche wird langsam sein, und je mehr Zeilen, desto langsamer wird sie sein. Je größer das Feld ist, desto langsamer wird er sein.

Sie können die Einschränkung der Verwendung von LIKE . Daher könnten Sie eine Tabelle mit der Bezeichnung "Tags" erstellen, in der Sie einzelne Schlüsselwörter mit jedem Eintrag verknüpfen, anstatt den gesamten Text zu verwenden, aber ich würde auch bei Tags bei "gleich" und "beginnt mit" bleiben.

Verwendung von LIKE ohne Hilfe eines Indexes sollte auf die seltenen Ad-hoc-Abfragen oder sehr kleine Datensätze beschränkt sein.

0voto

magallanes Punkte 6033

Nein, das ist nicht optimal, da es dazu zwingt, alle Zeilen zu lesen. Aber, wenn Sie Tabelle ist klein (ich weiß nicht, was die Bedeutung von <1mn), dann könnte es in gewissem Umfang akzeptabel sein.

Außerdem können Sie die Suchfunktion einschränken. Zum Beispiel beschränken einige Websites die Nutzung der Suchfunktion auf maximal eine Anfrage pro Minute, während andere Sie zwingen, ein Captcha einzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X