Laden...

[mySQL] Volltextsuche performant ausführen

Erstellt von MrSparkle vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.162 Views
MrSparkle Themenstarter:in
5.658 Beiträge seit 2006
vor 15 Jahren
[mySQL] Volltextsuche performant ausführen

Hallo allerseits,

weiß nicht, ob hier viele Leute mit mySQL arbeiten. Vielleicht ist es auch halbwegs egal, welche DB dahintersteht.

Im Grunde geht es um eine Tabelle mit mehreren hunderttausend Artikeln, die mit einer Volltextsuche über mehrere Spalte durchsucht werden sollen. Jetzt läuft das ganze erwartungsgemäßg nichteinmal annähernd in Echtzeit und ich würde gerne noch ein bißchen Performance rausholen.

Das mySQL-Handbuch ist in der Hinsicht nicht aufschlußreich. Beim MS SQL-Server würde ich die Performance über die diversen Überwachungstools checken und dann versuchen, die Indizes und die SQL-Abfrage anzupassen. Wie macht man sowas mit mySQL?

Danke schonmal!
Christian

Weeks of programming can save you hours of planning

G
497 Beiträge seit 2006
vor 15 Jahren

das MySQL-Handbuch ist da doch halbwegs ausführlich. Wenn du bisher mit selbsterstellem Standard-SQL (" like '%xyz%'") arbeitest, würd ich mir den MATCH-Befehl von MySQL mal anschauen.

http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
http://dev.mysql.com/doc/refman/5.1/en/fulltext-natural-language.html

Gelöschter Account
vor 15 Jahren

überprüfe mal die stopwortliste. evtl ist sie nicht ausreichend oder falsch.

MrSparkle Themenstarter:in
5.658 Beiträge seit 2006
vor 15 Jahren

Danke für die schnellen Antworten.

Die Stoppwort-Liste würde ich erstmal außer Acht lassen (müssen), da ich darauf momentan keinen Zugriff habe.

Momentan führe ich die Abfrage im "Boolean Mode" aus. Das ist ja relativ gut dokumentiert, allerdings nicht was die Performance-Optimierung betrifft...

Ich durchsuche drei Felder (Titel, Beschreibung und Bildunterschrift), die jeweils anders gewichtet werden sollen. Einen Volltext-Index gibt es, der über alle drei Felder angelegt wurde. Das Suchergebnis soll dann nach Relevanz sortiert werden.

Ich weiß nicht so recht, wo ich anfange, zu optimieren. Eh ich einfach wild rumprobiere, wollte ich mal nach euren Erfahrungen fragen.

Mir fällt erstmal folgendes ein:

  • Boolean-Mode vs. normale Volltextsuche
  • Ein Index über drei Felder vs. drei Indizes
  • Stoppwortliste ist klar, und kommt später

Wie geht man da am besten vor, um die optimale Performance zu erreichen, bzw. welche Möglichkeiten hat man überhaupt?

Danke nochmal!
Christian

Weeks of programming can save you hours of planning

MrSparkle Themenstarter:in
5.658 Beiträge seit 2006
vor 15 Jahren

Gibt es eigentlich auch eine Möglichkeit "ähnliche" Wort zu finden? So daß bspw. auch Artikel mit dem Namen "Renault 19" gefunden werden, wenn der Benutzer "Renault19" eingibt. Bzw. umgekehrt... Ist sowas machbar?

Weeks of programming can save you hours of planning

MrSparkle Themenstarter:in
5.658 Beiträge seit 2006
vor 15 Jahren

Aktueller Stand:

Hab jetzt erstmal eine Volltextsuche im Boolean-Mode implementiert, die halbwegs performant läuft. Der Boolean-Mode scheint jedenfalls wesentlich schneller zu sein.

Sehr langsam wird es allerdings, wenn man die Ergebnisse am Ende der Liste anzeigen möchte, also der Offset-Wert fürs LIMIT sehr hoch ist.

Ein weiteres Problem ist nach wie vor, daß man nur mit hohem Aufwand feststellen kann, wieviele Suchergebnisse überhaut gefunden wurden. Dadurch kann man bspw. keine Funktion anbieten, um zum Ende der Liste zu Navigieren. Das wird auch der Grund sein, daß soetwas bei Google auch nicht existiert.

Es gibt auch einige Erweiterungen für mySQL, die eine performante Volltextsuche (mit Ähnlichkeit, Stemming etc.) zur Verfügung stellen, z.B. Sphinx.

Hat jemand mit soetwas schon Erfahrungen gemacht?

Schöne Grüße,
Christian

Weeks of programming can save you hours of planning