Einzelnen Beitrag anzeigen

Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#1

Firebird Volltextsuche

  Alt 20. Feb 2013, 09:00
Datenbank: Firebird • Version: 2.5 • Zugriff über: .NET / egal
Hi,

ich möchte eine eigene Firebird Volltextsuche programmieren, und würde gerne von euch wissen, was ihr von meinem Konzept haltet.
Ich weiß natürlich, dass es schon einige Volltextsuchen für Firebird (zumindest Ansatzweise) gibt, aber ich möchte meine eigene programmieren.
Ich brauche die Lösung erst mal nur für Windows-Systeme. Linux-Support könnte irgendwann mal folgen.

Die Volltextsuche soll folgendes können:
- Alle Textfelder (auch Textblobs) mehrerer zusammengehöriger Tabelle in einen Index indizieren
- Felder, bzw. indizierte Werte anhand einer Gewichtung bewerten. (Wie wichtig ist der indizierte Inhalt aus Feld A im Gegensatz zu Feld B)
- Definierte Spalten von der Indizierung ausschließen
- Eine automatische Indizierung bei Datensatzveränderung (über Trigger)
- Die automatische Indizierung temporär ausschalten (für Batch-Imports)
- Indizierung aller noch nicht indizierten Daten (Batchimports) im Hintergrund (über Intervalle)
- GUI zur Administration der Volltextsuche
- Status zur Indizierung anzeigen

Angenommen es gibt eine Tabelle "BELEG" mit den Spalten "BELEGNR", "KUNDENNR", "NAME1" (...)
Dann möchte ich in einer weiteren Tabelle "FTS$INDEX" alle einzelnen Wörter (Teil-Strings) aus der "BELEG"-Tabelle indiziert haben.

Zusätzlich habe ich eine Tabelle "POSITION" mit den Spalten "POSITIONSNR", "ARTIKELNR", "POSITIONSTEXT" (...), die mit der "BELEG"-Tabelle verknüpft ist. Diese Tabelle soll ebenfalls in "FTS$INDEX" indiziert werden.

Ziel ist es, anhand aller Teil-Strings für einen "BELEG", den passenden Datensatz zu finden, ohne zu wissen, welche Textfelder, Untertabellen usw. es überhaupt für die Tabelle "BELEG" gibt.

Soweit habe ich das ganze schon über Trigger / Stored Procedures umgesetzt und es funktioniert auch. Allerdings ist mir aufgefallen, dass die Performance bei Batch-Imports ziemlich in die Knie geht, da ich nach jeder Datensatzänderung den Index für den geänderten Datensatz neu aufbaue (vorhanden Index löschen und anschließend neu indizieren). (Dazu habe ich schon mal ein Thema verfasst)
Es muss also eine andere Technik her.

Folgendes habe ich mir dazu überlegt:
Die Indizierung darf nicht mehr vom Firebird Server übernommen werden, sondern muss als Dienst ausgelagert werden.
Die Indizierung soll zwar weiterhin nach jeder Datensatzänderung automatisch gestartet werden (Firebird-Event an den Dienst senden), allerdings soll das a.) asynchron ablaufen und b.) bei Bedarf ausgeschaltet werden können.
Wird die automatische Indizierung abgeschaltet, z.B. wegen eines Batch-Imports, soll der Index-Dienst die Indizierung nach dem Vorgang nachholen. Das läuft dann wie gesagt alles schön im Hintergrund und asynchron.

Es kann natürlich sein, dass der Index-Dienst (aus irgendwelchen Gründen) nicht gestartet wurde, oder die Volltextsuche in eine vorhandene Datenbank eingebaut werden soll. Dann muss der Index-Dienst über einen Intervall prüfen, ob es Datensätze gibt, die noch nicht indiziert wurden.

Außerdem soll es ein Programm geben, mit dem man die Volltextsuche konfigurieren kann:
- Welche Tabellen sollen indiziert und gruppiert werden?
- Welche Spalten sollen ausgeschlossen werden?
- Welche Gewichtung hat welche Spalte? (Danach kann man später das Suchergebnis sortieren und bekommt die wichtigsten Treffer zuerst angezeigt)
- In welchem Zeitintervall soll nach nicht-indizierten Datensätzen gesucht werden?
- Welche Datenbanken sollen indiziert werden?
- Welcher Zeichensatz soll verwendet werden?
...

Dieses Programm soll auf dem Server in der TNA gelegt werden. Wenn eine Indizierung stattfindet, kann der Administrator das hier ggf. sehen (aber das sind nur unwichtige Feinheiten...)

Im Anhang mal ein Bild, wie ich mir das in etwa vorgestellt habe.

Seht ihr irgendwo Schwierigkeiten, die ich noch nicht eingeplant habe?
Miniaturansicht angehängter Grafiken
index.png  
  Mit Zitat antworten Zitat