Share
Embed
Volltextsuchen in RDBMS
Vergleich von Volltextsuchen in MySQL, PostgreSQL und MS SQL Server 2000 (Stand 2004)
#cc-by #from-slideshare
https://www.slideshare.net/gerritbeine/volltextsuchen-in-rdbms-2004
Gerrit Beine
January 01, 2004
Transcript
53 slides
-
Volltextsuchen in RDBMS Realisierung und Verwendung von Volltextsuchen in den
Relationalen DBMS M$ SQL Server 2000 PostgreSQL MySQL -
Übersicht • Vergleich der DBMS • Was ist eine Volltextsuche?
• Realisierung in den DBMS • Zusammenfassung -
Vergleichsmöglichkeiten • Werbung durch Hersteller • Aufstellung von Feature Listen
• Benchmarks • Erfahrungswerte sammeln • Propaganda von Anwendern -
Was vergleicht man? • Einsatzgebiet • Einsatzzweck • Kosten •
Support • Geschwindigkeit • Funktionsumfang -
Vergleichskriterien • Unixoides Serverbetriebssystem • Datenbanken für Community-Portal • Möglichst
geringe Kosten • Schneller Support bei Fragen • Gute Skalierung auch bei hoher Last • Unterstützung für Volltextsuchen -
MS SQL Server 2000 • Läuft nur auf MS Windows
• Verhältnismäßig preiswert (ab 1.500 US-$) • Proprietäres System • Keine Unterstützung für implizite FTI • Skaliert gar schauerlich unter hoher Last • Support... *hust* -
MySQL AB's MySQL 4.x • Läuft auf allen Unixoiden OS
• Verfügbar unter GPL • Kommerzielle Lizenz ab 220 Euro • Offenes System • Hervorragender Support durch Community • Kommerzieller Support durch Hersteller -
MySQL AB's MySQL 4.x • Skaliert hervorragend bei SELECT •
Schlechte Serialisierung bei hoher Last • Leistungseinbruch ab Lesen:Schreiben ~ 7:3 • Unterstützung für impliziten FTI -
PostgreSQL 7.4 • Läuft auf allen Unixoiden OS (inkl. Sony
Playstation) • Software kostenlos – BSD Lizenz • Offenes System • Support durch Community und Firmen • Skaliert hervorragend durch genetischen Query Optimizer -
PostgreSQL 7.4 • Keine Unterstützung für FTI • Unterstützung für
nutzerdefinierte Datentypen • Unterstützung von eingebetteten Sprachen (Perl, C, Python, TCL) • Unterstützung von GiST (Verallgemeinerter balancierter Suchbaum) • Addon für implizite FTI -
Benchmarks • Traue keiner Statistik... • Benchmarks sind einseitig •
Ergebnisse durch Know-How beeinflußbar • eWeek Server Database Clash 2002 • AS3AP Benchmark 2000 -
eWeek-Benchmark 2002 • 5 RDBMS getestet • Oracle 9i 9.0.1.1.1
• MS SQL Server 2000 Service Pack 2 • Sybase ASE 12.5.0.1 • IBM DB2 7.2 FixPack 5 • MySQL-Max 4.0.1-alpha -
Ergebnis • Oracle und MySQL schaffen Dauertest (8 Stunden) fehlerfrei
• Oracle und MySQL klare Testsieger -
Codequalität • Microsoft zufolge haben Microsoft Produkte die höchste Codequalität
• Reasoning zufolge hat MySQL die höchste Codequalität aller verfügbaren DBMS • Meiner Erfahrung nach sind 90% der Probleme an Servern durch Microsoft Produkte verursacht -
Was ist eine Volltextsuche? • Unscharfe Abfragen • Keine eindeutigen
Ergebnisse • Suchergebnisse werden bewertet • Suche nach Worten -
LIKE sucks SELECT ... COL LIKE „Begriff“ SELECT ... COL
LIKE „Begriff%“ SELECT ... COL LIKE „%Begriff%“ • LIKE sucht nach Zeichenketten • nicht optimierbar • „teurer“ Full Table Scan -
FTI-Techniken • Zeitpunkt der Erstellung • Automatisch (implizit) • auf
Anforderung • Art der Erstellung • Textuelle Indizierung • Konzeptionelle Indizierung • Typ des FTI -
Automatische Erstellung • Indizierung wird beim Einfügen des Datensatzes vorgenommen
• Overhead durch permanentes traversieren und sortieren des Index • Verlangsamt Schreiboperationen • Änderungen On-the-Fly verfügbar -
Erstellung auf Anforderung • Index muß manuell erstellt werden •
Index liegt außerhalb der Datenbank • Kein Overhead beim Schreiboperationen • Änderungen erst nach Neuerstellung verfügbar • Redundante Datenhaltung -
Textuelle Indizierung • Statistische Methoden • häufige Worte sind „wertlos“
• häufigste Worte werden gesucht und gefiltert • andere Worte werden indiziert • Stoppwortlisten • Worte in der Stoppwortliste werden ausgefiltert • andere Worte werden indiziert -
Konzeptuelle Indizierung • beruht auf KI-Verfahren • Linguistische Analyse •
Stemming • Präfix und Suffixe erkennen • Wortstamm finden • Begriffshierarchien • Thesaurus • Wörterbücher -
FTI-Typen • Herkömmliche Bäume nicht geeignet (B-Bäume, B+-Bäume, B*-Bäume) •
Andere Verfahren • Tries • Patricia-Bäume • Präfix-Bäume • GiST • Hash-Verfahren -
Volltextsuche in MS SQL Server • Unterstützung für FTI vorhanden
• ein FTI pro Tabelle • Generierung des FTI auf Anforderung • keine implizite Aktualisierung • keine Stoppworte • kein konzeptueller Index • Index außerhalb der Datenbank -
MS SQL Server - Abfragen SELECT * FROM TABLE WHERE
FTI_COL LIKE „%Begriff%“ -- wird zu SELECT * FROM TABLE WHERE CONTAINS (FTI_COL, 'Begriff') -
Volltextsuche in MySQL • Unterstützung für FTI vorhanden • beliebig
viele FTI pro Tabelle • Generierung zu jedem Zeitpunkt möglich • implizite Aktualisierung • Stoppwortlisten als Umgebungsvariable • BOOLE'sche Suche möglich • qualitativ gute Bewertungsfunktion -
Volltextsuche in MySQL • INSERT und UPDATE bis zu 10
mal langsamer • SELECT kann zum TABLE LOCK führen • Index ist 30% größer als Datenbestand • Kein konzeptueller Index -
MySQL - Anlegen -- beim Anlegen einer Tabelle CREATE TABLE
fttest ( number int NOT NULL default '0', text text NOT NULL, FULLTEXT (text) ); -
MySQL - Anlegen -- bei einer existierenden Tabelle CREATE TABLE
fttest ( number int NOT NULL default '0', text text NOT NULL ); ALTER TABLE fttest ADD FULLTEXT (text); -
MySQL - Abfragen -- einfache Suche SELECT * FROM fttest
WHERE MATCH (text) AGAINST ('datenbank'); -
MySQL - Abfragen -- einfache Suche mit Bewertung SELECT text,
MATCH text AGAINST ('datenbank') AS SCORE FROM fttest WHERE MATCH (text) AGAINST ('datenbank'); -
MySQL - Abfragen -- Suche im Boolean Mode SELECT *
FROM fttest WHERE MATCH (text) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE); -
MySQL - Operatoren '+' - Wort muß im Datensatz vorkommen
'-' - Wort darf nicht im Datensatz vorkommen '>', '<' - Berücksichtigt das Wort stärker oder schwächer '(', ')' - Gruppiert Worte, Nesting möglich '~' - Negiert ein Matching '“' - Phrasierung mehrerer Worte '*' - Wortanfang kennzeichnen -
MySQL - Operatoren -- Suche mit Operatoren 'datenbank microsoft' '+datenbank
+microsoft' '+datenbank -microsoft' '+datenbank microsoft' '“datenbank microsoft“' 'daten*' '+datenbank +(„microsoft sql“)' -
Volltextsuche in PostgreSQL • Keine Unterstützung für FTI • aber
dafür tsearch2 • neuer Datentyp tsvector • Unterstützung für Stemming • Verwendet GiST-Index • implizite Aktualisierung des FTI • Generierung zu jedem Zeitpunkt möglich -
Installation von tsearch2 $ tar -zxvf tsearch-v2.tar.gz $ mv tsearch2
$PGSQL_SRC/contrib/ $ cd $PGSQL_SRC/contrib/tsearch2 $ gmake $ gmake install $ createdb fttest $ psql fttest < tsearch2.sql -
Anlegen der Tabelle CREATE TABLE fttest ( number int NOT
NULL default '0', text text NOT NULL, fti tsvector ); CREATE INDEX idxFTI ON fttest USING gist(fti); -
Erstellen des Trigger CREATE TRIGGER tsvectorupdate BEFORE UPDATE OR INSERT
ON fttest FOR EACH ROW EXECUTE PROCEDURE tsearch2(fti, text); -
PostgreSQL - Abfrage SELECT * FROM fttest WHERE fti @@
to_tsquery('default', 'datenbank'); -
PostgreSQL - Stopwords -- Konfiguration erstellen INSERT INTO pg_ts_cfg (ts_name,
prs_name, locale) VALUES ('default_german', 'default', 'de_DE'); -
PostgreSQL - Stopwords INSERT INTO pg_ts_dict (SELECT 'de_stem', dict_init, 'postgresql/contrib/german.stop',
dict_lexize FROM pg_ts_dict WHERE dict_name = 'en_stem'); -
PostgreSQL - Stopword-Abfrage -- ohne Stopwords SELECT to_tsvector('das ist das
haus vom nikolaus'); to_tsvector ------------------------------------- 'das':1,3 'ist':2 'haus':4 'vom':5 'nikolaus':6 (1 row) -
PostgreSQL - Stopword-Abfrage -- mit Stopwords SELECT to_tsvector('default_german', 'das ist
das haus vom nikolaus'); to_tsvector ------------------------------------- 'haus':4 'nikolaus':6 (1 row) -
PostgreSQL - Dictionaries INSERT INTO pg_ts_dict (SELECT 'de_ispell', dict_init, 'DictFile="ispell/deutsch.med",'
'AffFile="ispell/deutsch.aff",' 'StopFile="postgresql/contrib/german.stop"', dict_lexize FROM pg_ts_dict WHERE dict_name = 'ispell_template'); -
Dictionary-Abfrage -- ohne Dictionary SELECT to_tsvector('das sind die häuser vom
nikolaus'); to_tsvector ------------------------------------- 'häuser':4 'nikolaus':6 (1 row) -
Dictionary-Abfrage -- mit Dictionary SELECT to_tsvector('default_german', 'das sind die häuser
vom nikolaus'); to_tsvector ------------------------------------- 'haus':4 'nikolaus':6 (1 row) -
Zusammenfassung • Volltextsuchen sind rechenintensive Operationen • Aktualität vs. Geschwindigkeit
• Integration von tsearch in PostgreSQL ermöglicht große Flexibilität