Übersicht
Der Datenbank-Konnektor ist eine Funktion, mit der Datensätze aus JDBC-kompatiblen relationalen Datenbanken (MySQL, PostgreSQL, Oracle, SQL Server usw.) in den Index von Fess aufgenommen werden und damit eine Datenbank-Suche (Volltextsuche über Datenbankinhalte) realisiert wird. Die per SELECT-Anweisung abgerufenen Spalten werden dabei auf Suchfelder gemappt.
Der Datenbank-Konnektor bietet die Funktionalität, Daten aus JDBC-kompatiblen relationalen Datenbanken abzurufen und im Fess-Index zu registrieren.
Für diese Funktion ist das Plugin fess-ds-db erforderlich.
Unterstützte Datenbanken
Alle JDBC-kompatiblen Datenbanken werden unterstützt. Wichtige Beispiele:
MySQL / MariaDB
PostgreSQL
Oracle Database
Microsoft SQL Server
SQLite
H2 Database
Voraussetzungen
Das Plugin
fess-ds-dbmuss installiert seinEin JDBC-Treiber für die Zieldatenbank ist erforderlich
Lesezugriff auf die Datenbank ist erforderlich
Bei großen Datenmengen ist ein geeignetes Query-Design wichtig
Plugin-Installation
Methode 1: Installation über die Administrationsoberfläche
„System“ -> „Plugins“ öffnen
JAR-Datei hochladen
Fess neu starten
Methode 2: JAR-Datei direkt platzieren
JDBC-Treiber-Installation
Der JDBC-Treiber ist nicht im Plugin enthalten. Beschaffen Sie den Treiber für Ihre Datenbank separat und platzieren Sie ihn selbst.
Das Datenspeicher-Crawling läuft im Crawler-Prozess, daher muss der Treiber im Classpath des Crawler-Prozesses liegen. Eines der folgenden Verzeichnisse ist geeignet:
app/WEB-INF/lib/app/WEB-INF/env/crawler/lib/
Starten Sie Fess neu, um den Treiber zu laden.
Bemerkung
Fehlt der Treiber, schlägt das Crawling mit der Meldung The JDBC driver ... is not on the crawler classpath. fehl.
Konfiguration
Konfigurieren Sie über die Administrationsoberfläche unter „Crawler“ -> „Datenspeicher“ -> „Neu erstellen“.
Grundeinstellungen
| Einstellung | Beispielwert |
|---|---|
| Name | Products Database |
| Handler-Name | DatabaseDataStore |
| Aktiviert | Ein |
Parameter-Einstellungen
Beispiel für MySQL/MariaDB:
Beispiel für PostgreSQL:
Parameterliste
| Parameter | Erforderlich | Beschreibung |
|---|---|---|
driver | Ja | Klassenname des JDBC-Treibers (ohne Angabe wird eine DataStoreException ausgelöst) |
url | Ja | JDBC-Verbindungs-URL (erforderlich für die Verbindung) |
sql | Ja | SQL-Query zum Abrufen der Daten (ohne Angabe wird eine DataStoreException ausgelöst) |
username | Nein | Datenbank-Benutzername |
password | Nein | Datenbank-Passwort |
fetch_size | Nein | JDBC-Fetch-Größe. MIN_VALUE weist MySQL an, das Resultset zeilenweise zu lesen; andere Treiber lehnen negative Werte ab, und das Crawling wird nach einer Warnung mit dem Standardwert des Treibers fortgesetzt. Negative oder nicht numerische Werte werden gemeldet und ignoriert |
query_timeout | Nein | Query-Timeout in Sekunden. 0 bedeutet keine Begrenzung (JDBC-Standard). Ohne Angabe des Parameters wird kein Timeout gesetzt |
default_mimetype | Nein | Standard-MIME-Typ für die Inhaltsextraktion aus BLOB- und Binärspalten |
column_label.mimetype | Nein | Gibt den Spaltennamen an, der den MIME-Typ für die Extraktion aus BLOB- und Binärspalten enthält (Beispiel: column_label.mimetype=content_type) |
column_label.filename | Nein | Gibt den Spaltennamen an, der den Dateinamen für die Extraktion aus BLOB- und Binärspalten enthält (MIME-Typ wird aus der Dateiendung abgeleitet) |
info.* | Nein | Zusätzliche JDBC-Verbindungseigenschaften (Beispiel: info.ssl=true). Der Schlüssel ohne info. wird an den JDBC-Treiber übergeben |
readInterval | Nein | Verzögerung in Millisekunden zwischen der Verarbeitung jeder Zeile. Standard: 0 |
script_type | Nein | Skript-Engine-Typ. Eine neue Konfiguration ist mit |
Bemerkung
Hängt eine Query, gibt das Stoppen des Jobs den Crawler-Thread nicht frei. Die Stopp-Anforderung wird nur zwischen den Zeilen geprüft und kann daher einen Aufruf, der im Treiber blockiert, nicht unterbrechen. Setzen Sie query_timeout für Queries, die lange laufen können.
Skript-Einstellungen
Ordnen Sie die SQL-Spaltennamen den Index-Feldern zu:
Verfügbare Felder:
<column_name>- Ergebnisspalten der SQL-Query (direkt über den Spaltenbezeichner zugänglich, ohne Präfix wiedata.)crawlingConfig- die Datenspeicher-KonfigurationcrawlingContext- der Crawling-Kontext;crawlingContext.docenthält das gerade erzeugte Dokument
Bemerkung
Die Spaltennamen müssen mit den Spaltenbezeichnern (Aliasnamen) in der SELECT-Klausel übereinstimmen. Bei Aggregatfunktionen oder Ausdrücken vergeben Sie mit AS einen expliziten Aliasnamen (Beispiel: COUNT(*) AS total).
Bemerkung
Die Groß-/Kleinschreibung der Spaltenbezeichner unterscheidet sich je nach Datenbank. PostgreSQL wandelt nicht in Anführungszeichen gesetzte Bezeichner in Kleinbuchstaben um, H2 in Großbuchstaben, und MySQL liefert sie wie deklariert. Ein Name, der nicht aufgelöst werden kann, lässt das Feld unbesetzt, statt einen Fehler auszulösen - vergeben Sie daher mit AS einen expliziten Aliasnamen, wenn Portabilität wichtig ist.
Warnung
Skripte können auf die gesamte Parameterzuordnung des Datenspeichers zugreifen, nicht nur auf die Ergebnisspalten der SQL-Query. driver, url, username, password und sql sind alle als gleichnamige Variablen sichtbar, sodass eine Spalte unbeabsichtigt überdeckt werden kann oder ein Parameterwert dort erscheint, wo eine fehlende Spalte erwartet wurde. Existieren beide, gewinnt der Wert der Spalte.
Laden von BLOB- und Binärdaten
Binärspalten (BLOB, BYTEA, Byte-Array, Binär-Stream) werden einer Inhaltsextraktion unterzogen - derselbe Extraktor wie beim Datei-Crawling - und als Text indiziert.
CLOB, NCLOB und Zeichen-Streams durchlaufen keinen Extraktor. Sie werden unverändert als Text gelesen; die unten beschriebenen MIME-Typ-Hinweise gelten für sie nicht.
Spalten vom Array-Typ werden zu ihren mit Leerzeichen verbundenen Elementen. NULL-Werte werden zu leeren Zeichenketten.
Bemerkung
Ob eine BLOB-Spalte als java.sql.Blob oder als Byte-Array ankommt, entscheidet der JDBC-Treiber - MySQL und PostgreSQL liefern ein Byte-Array. Beide werden auf dieselbe Weise extrahiert.
Bemerkung
CLOB und NCLOB werden vollständig und ohne Größenbegrenzung in den Speicher gelesen. Bei sehr großen Textspalten sollten Sie im SQL mit SUBSTRING oder Ähnlichem kürzen. Für den Weg über den Extraktor gilt die maximale Inhaltslänge des Crawlers.
Damit Text aus BLOB- und Binär-Streams korrekt extrahiert werden kann, muss der Datentyp (MIME-Typ) bestimmt werden. Die folgende Prioritätsreihenfolge wird verwendet:
column_label.mimetype=<Spaltenname>- Der Wert der angegebenen Spalte wird als MIME-Typ verwendetcolumn_label.filename=<Spaltenname>- Der Wert der angegebenen Spalte wird als Dateiname behandelt, der MIME-Typ wird aus der Dateiendung abgeleitetdefault_mimetype- Standard-MIME-Typ, der verwendet wird, wenn die obigen Methoden keinen Typ ergeben
Beispiel (BLOB der Spalte file_data wird mit dem MIME-Typ aus Spalte content_type extrahiert):
SQL-Query-Design
Effiziente Queries
Bei großen Datenmengen ist die Query-Performance wichtig. SQL-Abfragen werden unverändert an die Datenbank gesendet (kein Parameter-Binding):
Inkrementelles Crawling
Methode zum Abrufen nur der aktualisierten Datensätze:
Warnung
Die Query auf diese Weise einzuschränken macht aus dem Crawling noch kein inkrementelles Crawling. Wenn ein Crawl endet, löscht Fess die Dokumente dieser Datenspeicher-Konfiguration, die nicht Teil des soeben gelaufenen Crawls waren - eine gefilterte Query lässt also nur die passenden Zeilen im Index zurück.
Fügen Sie delete_old_docs=false zu den Datenspeicher-Parametern hinzu, um die von früheren Crawls indexierten Dokumente zu behalten. Aus der Datenbank gelöschte Zeilen werden dann allerdings auch nicht mehr aus dem Index entfernt; führen Sie deshalb regelmäßig ein vollständiges Crawling durch.
URL-Generierung
Die Dokument-URL wird im Skript generiert:
Warnung
url=url tut nur dann das Erwartete, wenn das SELECT-Ergebnis eine Spalte mit dem Bezeichner url enthält. Ohne eine solche Spalte wird der gleichnamige Datenspeicher-Parameter - also die JDBC-Verbindungs-URL - zur Dokument-URL. Vergeben Sie einen Aliasnamen für die Spalte, etwa SELECT page_url AS url, oder benennen Sie sie im Skript, etwa url=page_url.
Multibyte-Zeichenunterstützung
Bei der Verarbeitung von Daten mit Multibyte-Zeichen wie Japanisch:
MySQL
PostgreSQL
PostgreSQL verwendet standardmäßig UTF-8. Bei Bedarf:
Sicherheit
Schutz der Datenbank-Anmeldedaten
Warnung
Das direkte Speichern von Passwörtern in Konfigurationsdateien stellt ein Sicherheitsrisiko dar.
Empfohlene Methoden:
Automatische Verschlüsselung nutzen
Der Wert eines Parameters, dessen Name auf
app.encrypt.property.patternpasst (Standard.*password|.*key|.*token|.*secret), wird beim Speichern über die Administrationsoberfläche verschlüsselt und mit dem Präfix{cipher}abgelegt.passwordpasst auf dieses Muster und wird daher nicht im Klartext gespeichert, wenn es über die Administrationsoberfläche gesetzt wird.Umgebungsvariablen verwenden
Eine Umgebungsvariable, deren Name mit
FESS_ENV_beginnt, wird innerhalb eines Datenspeicher-Parameters als${Variablenname}expandiert:Welche Namen expandiert werden, steuert
crawler.data.env.param.key.pattern(Standard^FESS_ENV_.*).Nur-Lese-Benutzer verwenden
Bemerkung
Das Anheben von org.codelibs.fess.ds auf DEBUG legt keine Anmeldedaten offen: Die Werte von Parametern, die auf app.encrypt.property.pattern passen, sowie in der JDBC-URL eingebettete Anmeldedaten werden im Log maskiert.
Prinzip der minimalen Rechte
Gewähren Sie dem Datenbankbenutzer nur die minimal erforderlichen Berechtigungen:
Anwendungsbeispiele
Produktkatalog-Suche
Parameter:
Skript:
Wissensdatenbank-Artikel
Parameter:
Skript:
Fehlerbehebung
Schlägt ein Crawling fehl, gibt die Meldung im Log an, welcher Schritt fehlgeschlagen ist.
JDBC-Treiber nicht gefunden
Symptom: The JDBC driver ... is not on the crawler classpath.
Lösung:
Überprüfen Sie, ob der JDBC-Treiber in
app/WEB-INF/lib/oderapp/WEB-INF/env/crawler/lib/platziert istÜberprüfen Sie, ob der in
driverangegebene Klassenname korrekt istStarten Sie Fess neu
Verbindungsfehler
Symptom: Failed to connect to <URL>.
Zu überprüfen:
Ist die Datenbank gestartet?
Sind Hostname und Portnummer korrekt?
Sind Benutzername und Passwort korrekt?
Firewall-Einstellungen prüfen
Query-Fehler
Symptom: Failed to execute the query.
Zu überprüfen:
Testen Sie die SQL-Query direkt in der Datenbank
Überprüfen Sie, ob die Spaltennamen korrekt sind
Überprüfen Sie, ob die Tabellennamen korrekt sind
Fehlende Parameter
Symptom: The driver parameter is required., The url parameter is required. oder The sql parameter is required.
Ein erforderlicher Parameter ist nicht gesetzt. Überprüfen Sie das Parameterfeld.
Nur einzelne Zeilen schlagen fehl
Eine fehlgeschlagene Zeile bricht das Crawling nicht ab; sie wird unter „System“ -> „Fehlerhafte URL“ protokolliert. Verwendet wird die Dokument-URL, sofern die Skripte eine erzeugt haben, und datastore://<ID der Datenspeicher-Konfiguration>/<Zeilennummer>, wenn nicht.
Dokumente erscheinen nicht in den Suchergebnissen
Überprüfen Sie, ob die Skripte
url,titleundcontentsetzenÜberprüfen Sie, ob die Groß-/Kleinschreibung der Spaltenbezeichner mit der in den Skripten verwendeten übereinstimmt (siehe „Skript-Einstellungen“)
Überprüfen Sie die Anzahl der Dokumente im Protokoll des Crawl-Jobs
Weiterführende Informationen
Übersicht der Datenspeicher-Konnektoren - Übersicht der Datenspeicher-Konnektoren
CSV-Konnektor - CSV-Konnektor
JSON-Konnektor - JSON-Konnektor
Datenspeicher-Crawl - Leitfaden zur Datenspeicher-Konfiguration
Crawler-Konfiguration: Web-, Dateiserver- und Datenbank-Crawling - Grundlegende Crawler-Konfiguration
Suchfunktionen - Suchfunktionen