FB18 - Das Forum für Informatik

fb18.de / Off-Topic / Hard- und Softwarefragen

Suche Suche

Suche Suche 2008-01-13 23:55
Anonymer User
Hallo,
ich bin auf der Suche nach einer Vorgehensweise für das Speichern und Suchen in einer Datenbank.
Ich will diverse Produkte in einer MySQL-DB ablegen und sowohl über die Titel, die Beschreibungen und auch die Kategorien in denen die Produkte sich befinden eine Suche ermöglichen.
Außerdem würde ich gerne soetwas wie Synonyme ebenfalls abfangen können. D.h. wenn mein Produkt z.b. die Ziffer '3' im Titel hat, sollte auch die Suche nach 'drei' zum Erfolg führen.

Hat sowas schonmal jemand gemacht und kann von seinen Erfahrungen berichten? Gibt es evtl. eine Quelle für Synonyme? Wie optimiere ich am besten meine SQL-Anfragen damit die ganze Suche bei sagen wir mal 2.000.000 Produkten auch noch performant ist?

Viele Fragen, ich weiß :). Mir reicht auch schon ein Hinweis fürs weiterlesen.
Schönen Dank!

RE: Suche Suche 2008-01-14 00:01
Fred
Suche Suche
Suche Suche

RE: Suche Suche 2008-01-14 12:07
BoTaS
MySQL selbst hat für solche Aufgaben neben LIKE '%foo%' auch noch ein SOUNDS LIKE 'foo':
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#operator_sounds-like

Das beruht aber auf Soundex. Was recht ungenau ist, könnte also zu zu vielen Ergebnissen führen: http://de3.php.net/manual/de/function.soundex.php

Für Englisches hätte PHP z.B. noch http://de3.php.net/manual/de/function.metaphone.php
http://de3.php.net/manual/de/function.similar-text.php könnte auch noch was sein. Das hab ich aber noch nie benutzt.

Wenn man das außerhalb von MySQL macht, ist das natürlich schlecht, weil man jeden Datensatz angucken muss -> langsam.

Meine Erfahrung ist, dass das MySQL SOUNDS LIKE zumindest für Einträge wie Namen reicht. Es war performant. Aber da waren auch nur 5stellig Datensätze.

Für Synonyme könnte man vielleicht Seiten wie http://meta.rrzn.uni-hannover.de/asso.html anzapfen. Um Zahlen in Worte zu wandeln gibt es auch Bibliotheken.

RE: Suche Suche 2008-01-14 15:28
Pocmo
MySQL kommt auch von Haus aus mit einer Volltextsuche. Beispiel:

ALTER TABLE meine_tabelle FULLTEXT(mein_feld,jenes_feld);

SELECT
feld
FROM
meine_tabelle
WHERE MATCH(mein_feld, jenes_feld)
AGAINST ('…suchstring…')
IN BOOLEAN MODE)

Das hat den Vorteil, dass dann auch so sachen funktionieren wie:
+ vor ein Wort gesetzt: dieses Wort muss enthalten sein
- vor ein Wort gesetzt: dieses Wort darf nicht enthalten sein
> vor ein Wort gesetzt: dieses Wort wird in der Relevanz höher gewertet
< vor ein Wort gesetzt: dieses Wort wird in der Relevanz niedriger gewertet
~ (Tilde) vor ein Wort gesetzt: dieses Wort bekommt einen negativen Relevanzwert (wird aber nicht komplett ausgeschlossen)
* am Ende eines Wortes gesetzt: maskiert verschiedene Endungen dieses Wortes
" Zeichenketten in Anführungszeichen müssen genau in dieser Schreibweise vorkommen
( ) runde Klammern fassen Wörter zu Einheiten zusammen, um auf sie z.B. andere Operatoren anzuwenden

Also funktioniert sowas wie:
+haus -boot +(>untergang <seefahrt)

Weitere Infos sollte die MySQL-Dokumentation hergeben.