Thomas Wiedmann http://www.twiedmann.de
• Sie befinden sich hier: Startseite > SQL-Backstube > Thesaurus-Synonym-Wortliste

Die SQL-Backstube

Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.

01.08.2010: Thesaurus-Synonym-Wortliste

Problemstellung

Von diversen Textverarbeitungen kennt man ja Wortsynonyme als Auswahlliste. Wie könnte das benötigte Datendesign dazu aussehen?

Getestet mit folgenden Datenbanken:

* IBM DB2 9.1
* MySQL 5.1.30

Datenbank-Tabellen

Die Datenbank-Tabellen hierfür sehen wie folgt aus:

Listing 1: (IBM DB2, MySQL)

  1. /**
  2. * Worte
  3. */
  4. CREATE TABLE wort (
  5. wort_id INT NOT NULL,
  6. wort VARCHAR(50),
  7. PRIMARY KEY (wort_id)
  8. );
  9. /**
  10. * Wortsynonyme / Thesaurus
  11. */
  12. CREATE TABLE wort_synonym (
  13. wort_synonym_id INT NOT NULL,
  14. wort_synonym_gruppe INT NOT NULL,
  15. wort_id INT NOT NULL,
  16. PRIMARY KEY (wort_synonym_id),
  17. CONSTRAINT fk_wort_01
  18. FOREIGN KEY (wort_id)
  19. REFERENCES wort (wort_id)
  20. );

SQL Tuning

Damit die SQL-Abfragen auch bei einer größeren Datenmenge schnell und performant von der Datenbank abgearbeitet werden können, benötigen wir noch diese Indices.

Listing 2:

  1. /**
  2. * Indices
  3. */
  4. CREATE INDEX sx_wort_01 ON wort (wort, wort_id);
  5. CREATE INDEX sx_wort_synonym_01 ON wort_synonym (wort_synonym_gruppe,wort_id);

Testdaten

Nun die Wortlisten und die Synonym-Gruppen, um die SQL-Abfrage des Thesaurus zu testen. Es gibt zwei Gruppen computer und bildschirm mit jeweils fünf Wörtern.

Listing 3:

  1. /**
  2. * Worte einfügen
  3. */
  4. INSERT INTO wort VALUES
  5. ( 1, 'computer'),
  6. ( 2, 'blechidiot'),
  7. ( 3, 'datenverarbeitungsanlage'),
  8. ( 4, 'elektronengehirn'),
  9. ( 5, 'rechner'),
  10. ( 6, 'bildschirm'),
  11. ( 7, 'anzeigegerät'),
  12. ( 8, 'display'),
  13. ( 9, 'monitor'),
  14. (10, 'schirm');
  15. /**
  16. * Thesaurus-Gruppen
  17. */
  18. INSERT INTO wort_synonym VALUES
  19. ( 1, 1, 1),
  20. ( 2, 1, 2),
  21. ( 3, 1, 3),
  22. ( 4, 1, 4),
  23. ( 5, 1, 5),
  24. ( 6, 2, 6),
  25. ( 7, 2, 7),
  26. ( 8, 2, 8),
  27. ( 9, 2, 9),
  28. (10, 2,10);

SQL - Abfrage

Hier nun die SQL-Abfrage, die zu einem bestimmen Wort (z.B. blechidiot) alle alternativen Worte aus dieser Synonymgruppe herausfindet. Ein Problem dabei ist, dass das Suchwort sich nicht auch in der Ergebnismenge befindet. Das Suchwort soll sich nicht selbst finden.

Listing 4:

  1. /**
  2. * Synonyme finden
  3. */
  4. SELECT w2.wort AS synonym
  5. FROM wort w
  6. JOIN wort_synonym ws
  7. ON ws.wort_id = w.wort_id
  8. JOIN wort_synonym ws2
  9. ON ws2.wort_synonym_gruppe = ws.wort_synonym_gruppe
  10. AND ws2.wort_id <> ws.wort_id
  11. JOIN wort w2
  12. ON w2.wort_id = ws2.wort_id
  13. WHERE w.wort = 'blechidiot'
  14. ORDER BY w2.wort;

Diese SQL-Abfrage liefert jetzt alle alternativen Worte zu blechidiot entsprechen der hinterlegten Wortgruppe (siehe Spalte wort_synonym_gruppe).

Listing 5:

  1. +--------------------------+
  2. | synonym |
  3. +--------------------------+
  4. | computer |
  5. | datenverarbeitungsanlage |
  6. | elektronengehirn |
  7. | rechner |
  8. +--------------------------+
  9. 4 rows in set (0.01 sec)

Die SQL-Abfrage (siehe Listing 4:) ist bewußt einfach gehalten. Auf die Problematiken der Groß- und Kleinschreibung bin ich diesmal nicht eingegangen.



Sitemap - Inhaltsverzeichnis

© 2002-2017 by Thomas Wiedmann : kontakt (at) twiedmann (punkt) de (Stand : 11.01.2015).