Hi,
ich bin gerade dabei mir eine Volltextsuche in Firebird zu bauen.
Ich habe das ganze bis jetzt so aufgebaut, dass über verschiedene Trigger automatisch ein Suchindex erstellt wird.
Die Indextabelle sieht in etwa so aus:
Code:
CREATE TABLE INDEXTABELLE (
ID BIGINT NOT NULL, /* Autowert */
REFERENZID BIGINT NOT NULL, /* Die ID aus dem dazugehörigen Datensatz in einer anderen Tabelle */
FELDNAME VARCHAR(32) NOT NULL,
WERT VARCHAR(255) NOT NULL,
);
Beim Anlegen und Updaten eines Datensatzes in meiner Tabelle werden automatisch alle Textfelder in einzelne Wörter aufgeteilt und in die Index-Tabelle in das Feld "WERT" geschrieben. Außerdem wird der Feldname abgespeichert, damit man die Suche optional auf einzelne Felder einschränken kann...
Jetzt habe ich also eine Tabelle mit tausenden Datensätzen, soweit klappt alles.
Ich weiß jetzt nur nicht recht, wie man die Suchabfrage am besten zusammenbaut, wenn man mehrere Suchbegriffe eingibt.
Gefunden werden sollen die Datensätze, die alle Suchbegriffe beinhalten.
Kann mir da jemand einen Tipp geben? Gibt es spezielle Funktionen dafür? Ich steh im Moment etwas auf dem Schlauch.
Edit:
Ich habe hier mal etwas gebastelt, was zu relativ guten Ergebnissen führt... Allerdings muss ich hierbei die Abfrage zur Laufzeit zusammensetzen, was mich etwas stört...
Code:
SELECT FIRST 50 * FROM MYTABLE P
INNER JOIN
(SELECT REFERENZID, COUNT(*) X FROM
(SELECT * FROM INDEXTABELLE WHERE WERT LIKE '%SUCHBEGRIFF1%'
UNION
SELECT * FROM INDEXTABELLE WHERE WERT LIKE '%SUCHBEGRIFF2%')
UNION
SELECT * FROM INDEXTABELLE WHERE WERT LIKE '%SUCHBEGRIFF3%')
GROUP BY REFERENZID) I ON (P.ID = I.RELATIONID)
ORDER BY I.X DESC;
Die ganzen UNIONS müssen also je nachdem wie viele Suchbegriffe ich eingebe, entsprechen dynamisch erstellt werden... Unschön finde ich =/
Gibts ne andere Lösung?