Slide 1

Slide 1 text

Volltextsuchen in RDBMS Realisierung und Verwendung von Volltextsuchen in den Relationalen DBMS M$ SQL Server 2000 PostgreSQL MySQL

Slide 2

Slide 2 text

Übersicht • Vergleich der DBMS • Was ist eine Volltextsuche? • Realisierung in den DBMS • Zusammenfassung

Slide 3

Slide 3 text

Vergleichsmöglichkeiten • Werbung durch Hersteller • Aufstellung von Feature Listen • Benchmarks • Erfahrungswerte sammeln • Propaganda von Anwendern

Slide 4

Slide 4 text

Was vergleicht man? • Einsatzgebiet • Einsatzzweck • Kosten • Support • Geschwindigkeit • Funktionsumfang

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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*

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

Benchmarks • Traue keiner Statistik... • Benchmarks sind einseitig • Ergebnisse durch Know-How beeinflußbar • eWeek Server Database Clash 2002 • AS3AP Benchmark 2000

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

Ergebnis • Oracle und MySQL schaffen Dauertest (8 Stunden) fehlerfrei • Oracle und MySQL klare Testsieger

Slide 14

Slide 14 text

AS3AP Benchmark - 2000

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Was ist eine Volltextsuche? • Unscharfe Abfragen • Keine eindeutigen Ergebnisse • Suchergebnisse werden bewertet • Suche nach Worten

Slide 17

Slide 17 text

LIKE sucks SELECT ... COL LIKE „Begriff“ SELECT ... COL LIKE „Begriff%“ SELECT ... COL LIKE „%Begriff%“ • LIKE sucht nach Zeichenketten • nicht optimierbar • „teurer“ Full Table Scan

Slide 18

Slide 18 text

FTI-Techniken • Zeitpunkt der Erstellung • Automatisch (implizit) • auf Anforderung • Art der Erstellung • Textuelle Indizierung • Konzeptionelle Indizierung • Typ des FTI

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Konzeptuelle Indizierung • beruht auf KI-Verfahren • Linguistische Analyse • Stemming • Präfix und Suffixe erkennen • Wortstamm finden • Begriffshierarchien • Thesaurus • Wörterbücher

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

MS SQL Server - Anlegen

Slide 26

Slide 26 text

MS SQL Server - Anlegen

Slide 27

Slide 27 text

MS SQL Server - Anlegen

Slide 28

Slide 28 text

MS SQL Server - Anlegen

Slide 29

Slide 29 text

MS SQL Server - Anlegen

Slide 30

Slide 30 text

MS SQL Server - Abfragen SELECT * FROM TABLE WHERE FTI_COL LIKE „%Begriff%“ -- wird zu SELECT * FROM TABLE WHERE CONTAINS (FTI_COL, 'Begriff')

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

MySQL - Anlegen -- beim Anlegen einer Tabelle CREATE TABLE fttest ( number int NOT NULL default '0', text text NOT NULL, FULLTEXT (text) );

Slide 34

Slide 34 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);

Slide 35

Slide 35 text

MySQL - Abfragen -- einfache Suche SELECT * FROM fttest WHERE MATCH (text) AGAINST ('datenbank');

Slide 36

Slide 36 text

MySQL - Abfragen -- einfache Suche mit Bewertung SELECT text, MATCH text AGAINST ('datenbank') AS SCORE FROM fttest WHERE MATCH (text) AGAINST ('datenbank');

Slide 37

Slide 37 text

MySQL - Abfragen -- Suche im Boolean Mode SELECT * FROM fttest WHERE MATCH (text) AGAINST ('+MySQL -YourSQL' IN BOOLEAN MODE);

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

MySQL - Operatoren -- Suche mit Operatoren 'datenbank microsoft' '+datenbank +microsoft' '+datenbank -microsoft' '+datenbank microsoft' '“datenbank microsoft“' 'daten*' '+datenbank +(„microsoft sql“)'

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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);

Slide 43

Slide 43 text

Erstellen des Trigger CREATE TRIGGER tsvectorupdate BEFORE UPDATE OR INSERT ON fttest FOR EACH ROW EXECUTE PROCEDURE tsearch2(fti, text);

Slide 44

Slide 44 text

PostgreSQL - Abfrage SELECT * FROM fttest WHERE fti @@ to_tsquery('default', 'datenbank');

Slide 45

Slide 45 text

PostgreSQL - Stopwords -- Konfiguration erstellen INSERT INTO pg_ts_cfg (ts_name, prs_name, locale) VALUES ('default_german', 'default', 'de_DE');

Slide 46

Slide 46 text

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');

Slide 47

Slide 47 text

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)

Slide 48

Slide 48 text

PostgreSQL - Stopword-Abfrage -- mit Stopwords SELECT to_tsvector('default_german', 'das ist das haus vom nikolaus'); to_tsvector ------------------------------------- 'haus':4 'nikolaus':6 (1 row)

Slide 49

Slide 49 text

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');

Slide 50

Slide 50 text

Dictionary-Abfrage -- ohne Dictionary SELECT to_tsvector('das sind die häuser vom nikolaus'); to_tsvector ------------------------------------- 'häuser':4 'nikolaus':6 (1 row)

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

Zusammenfassung • Volltextsuchen sind rechenintensive Operationen • Aktualität vs. Geschwindigkeit • Integration von tsearch in PostgreSQL ermöglicht große Flexibilität

Slide 53

Slide 53 text

May the Source be with you! Noch Fragen?