Postgresql: Volltextsuche innerhalb von lob möglich?

8

Wir möchten PostgreSQL zum Speichern von Dokumenten verwenden. Da einige von ihnen bis zu 2 GB groß sein können, müssen wir den lob-Datentyp verwenden, wobei die großen Objekte in einer separaten Tabelle ( pg_largeobject ) gespeichert werden, auf die eine OID verweist, wie in Dokumente auf großen Objekten .

Für uns ist es sehr wichtig, dass diese Dokumente ( .pdf , .doc , ...) durchsucht werden können. Mit der integrierten PostgreSQL-Volltextsuche können Tabellen und Spalten gesucht werden, aber ist das möglich? um auch die großen Objekte in der Tabelle pg_largeobject zu durchsuchen?

Wenn nicht, müssen wir Oracle verwenden.

    
vera 29.10.2012, 09:18
quelle

2 Antworten

3

Es gibt mindestens zwei Probleme hier.

  1. Bei großen Objekten, die als lob oder oid-references gespeichert sind, funktioniert die Volltextsuche nicht wirklich. Sie können den Inhalt von pg_largeobject nicht im Volltext indizieren.

  2. Die Volltextsuche ist ein Indexsystem für text . Es kann keine PDF-, Microsoft Word-Dokumente oder andere zufällige Binärdateien indizieren. Es verfügt nicht über Rückrufe für Text-Extraktions-Tools usw.

Sie können entweder:

  • Erstellen Sie eine Tabelle, die aus diesen Dateien extrahierten Text mithilfe externer Tools zusammen mit einem oid , das auf die Datei selbst verweist, und einem Volltextindex der extrahierten Texttabelle; oder

  • Verwenden Sie ein leistungsfähigeres, voll funktionsfähiges externes Suchsystem wie Solr (basierend auf Lucene ), das entwickelt wurde, um verschiedene Formate zu bewältigen, eigene Textextraktion durchzuführen, usw.

Craig Ringer 29.10.2012 09:24
quelle
1

In PostgreSQL basiert die Volltextsuche meist auf einer sehr wichtigen Funktion to_tsvector() . Diese Funktion konvertiert das Textdokument in den Datentyp tsvector . In der Regel ist tsvector physische Größe etwa 1% des ursprünglichen Textes.

Alle weiteren Textsuchmethoden basieren auf der Erstellung von Indizes oberhalb der berechneten oder physikalischen tsvector -Werte. In diesem Sinne können Sie die erforderlichen tsvector -Werte überall berechnen (sogar auf einem Client!) Und sie in speziell erstellten Spalten für Indexierungszwecke speichern. Mit anderen Worten, Sie müssen Ihre Originaltexte nicht wirklich in der Datenbank speichern - tsvector ist alles was Sie brauchen, um zu bestimmen, in welchem ​​Dokument enthaltener Text Sie gesucht haben (aber es wird Ihnen nicht die Position innerhalb eines einzelnen Dokuments mitteilen). Was ist cool daran ist, dass indexiertes Dokument kann alles sein - auch Word, Excel, PDF, was auch immer, solange Sie Textinhalt des Dokuments erhalten und berechnen tsvector zu speichern und zu indizieren.

Ein kleiner Nachteil der Neuberechnung von tsvector (vor allem auf der Client-Seite) ist, dass Sie jedes Mal neu berechnen müssen, wenn Sie Ihr Originaldokument ändern.

    
mvp 29.10.2012 10:14
quelle