Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Volltextsuchen in RDBMS

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

Avatar for Gerrit Beine

Gerrit Beine

January 01, 2004
Tweet

More Decks by Gerrit Beine

Other Decks in Programming

Transcript

  1. Volltextsuchen in RDBMS Realisierung und Verwendung von Volltextsuchen in den

    Relationalen DBMS M$ SQL Server 2000 PostgreSQL MySQL
  2. Übersicht • Vergleich der DBMS • Was ist eine Volltextsuche?

    • Realisierung in den DBMS • Zusammenfassung
  3. Vergleichsmöglichkeiten • Werbung durch Hersteller • Aufstellung von Feature Listen

    • Benchmarks • Erfahrungswerte sammeln • Propaganda von Anwendern
  4. Was vergleicht man? • Einsatzgebiet • Einsatzzweck • Kosten •

    Support • Geschwindigkeit • Funktionsumfang
  5. 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
  6. 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*
  7. 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
  8. 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
  9. 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
  10. 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
  11. Benchmarks • Traue keiner Statistik... • Benchmarks sind einseitig •

    Ergebnisse durch Know-How beeinflußbar • eWeek Server Database Clash 2002 • AS3AP Benchmark 2000
  12. 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
  13. 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
  14. Was ist eine Volltextsuche? • Unscharfe Abfragen • Keine eindeutigen

    Ergebnisse • Suchergebnisse werden bewertet • Suche nach Worten
  15. LIKE sucks SELECT ... COL LIKE „Begriff“ SELECT ... COL

    LIKE „Begriff%“ SELECT ... COL LIKE „%Begriff%“ • LIKE sucht nach Zeichenketten • nicht optimierbar • „teurer“ Full Table Scan
  16. FTI-Techniken • Zeitpunkt der Erstellung • Automatisch (implizit) • auf

    Anforderung • Art der Erstellung • Textuelle Indizierung • Konzeptionelle Indizierung • Typ des FTI
  17. 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
  18. 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
  19. 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
  20. Konzeptuelle Indizierung • beruht auf KI-Verfahren • Linguistische Analyse •

    Stemming • Präfix und Suffixe erkennen • Wortstamm finden • Begriffshierarchien • Thesaurus • Wörterbücher
  21. 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
  22. 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
  23. MS SQL Server - Abfragen SELECT * FROM TABLE WHERE

    FTI_COL LIKE „%Begriff%“ -- wird zu SELECT * FROM TABLE WHERE CONTAINS (FTI_COL, 'Begriff')
  24. 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
  25. 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
  26. MySQL - Anlegen -- beim Anlegen einer Tabelle CREATE TABLE

    fttest ( number int NOT NULL default '0', text text NOT NULL, FULLTEXT (text) );
  27. 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);
  28. MySQL - Abfragen -- einfache Suche SELECT * FROM fttest

    WHERE MATCH (text) AGAINST ('datenbank');
  29. MySQL - Abfragen -- einfache Suche mit Bewertung SELECT text,

    MATCH text AGAINST ('datenbank') AS SCORE FROM fttest WHERE MATCH (text) AGAINST ('datenbank');
  30. MySQL - Abfragen -- Suche im Boolean Mode SELECT *

    FROM fttest WHERE MATCH (text) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);
  31. 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
  32. MySQL - Operatoren -- Suche mit Operatoren 'datenbank microsoft' '+datenbank

    +microsoft' '+datenbank -microsoft' '+datenbank microsoft' '“datenbank microsoft“' 'daten*' '+datenbank +(„microsoft sql“)'
  33. 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
  34. 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
  35. 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);
  36. Erstellen des Trigger CREATE TRIGGER tsvectorupdate BEFORE UPDATE OR INSERT

    ON fttest FOR EACH ROW EXECUTE PROCEDURE tsearch2(fti, text);
  37. PostgreSQL - Abfrage SELECT * FROM fttest WHERE fti @@

    to_tsquery('default', 'datenbank');
  38. PostgreSQL - Stopwords -- Konfiguration erstellen INSERT INTO pg_ts_cfg (ts_name,

    prs_name, locale) VALUES ('default_german', 'default', 'de_DE');
  39. 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)
  40. PostgreSQL - Stopword-Abfrage -- mit Stopwords SELECT to_tsvector('default_german', 'das ist

    das haus vom nikolaus'); to_tsvector ------------------------------------- 'haus':4 'nikolaus':6 (1 row)
  41. 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');
  42. Dictionary-Abfrage -- ohne Dictionary SELECT to_tsvector('das sind die häuser vom

    nikolaus'); to_tsvector ------------------------------------- 'häuser':4 'nikolaus':6 (1 row)
  43. Dictionary-Abfrage -- mit Dictionary SELECT to_tsvector('default_german', 'das sind die häuser

    vom nikolaus'); to_tsvector ------------------------------------- 'haus':4 'nikolaus':6 (1 row)
  44. Zusammenfassung • Volltextsuchen sind rechenintensive Operationen • Aktualität vs. Geschwindigkeit

    • Integration von tsearch in PostgreSQL ermöglicht große Flexibilität