AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird Volltextsuche

Ein Thema von Morphie · begonnen am 20. Feb 2013 · letzter Beitrag vom 20. Feb 2013
Antwort Antwort
Morphie

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

Firebird Volltextsuche

  Alt 20. Feb 2013, 08: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
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Firebird Volltextsuche

  Alt 20. Feb 2013, 08:22
Vieleicht solltest du jede Datensatzänderung in eine Zwischentabelle eintragen, die dann vom Indexdienst verzögert abgeabeitet wird.

Tabellen Name
ID
Alter Zustand
Neuer Zustand
  Mit Zitat antworten Zitat
Morphie

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

AW: Firebird Volltextsuche

  Alt 20. Feb 2013, 08:42
Vieleicht solltest du jede Datensatzänderung in eine Zwischentabelle eintragen, die dann vom Indexdienst verzögert abgeabeitet wird.

Tabellen Name
ID
Alter Zustand
Neuer Zustand
Eigentlich hatte ich ja vor, dem Index-Dienst einfach ein Event mit der ID des Datensatzes zu senden, doch wie ich jetzt feststellen muss (ich habe vorher noch nie mit Events gearbeitet) kann man keine Parameter übergeben. Daher muss ich wohl zwangsläufig mit einer "Warteschlangen"-Tabelle arbeiten...

edit: oder einfach ein weiteres Boolean-Feld in den Tabellen: Indiziert: ja / nein
Dieses über einen Trigger bei jeder Änderung / Insert auf 0 setzen. Nach dem indizieren hat das Feld den Wert 1 = indiziert.

Geändert von Morphie (20. Feb 2013 um 08:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz