Dokumenten Verwaltung mit Filestream und der Volltextsuche

In diesem Artikel geht es um die Speicherung von Dateien und dem Auffinden dieser im SQL Server. Um Dateien nicht komplett in der Datenbank zu speichern, bietet sich Filestream an. Bei dieser Technologie werden lediglich Meta Daten innerhalb der Datenbank gespeichert und die eigentliche Datei befindet sich in einem File-Share und werden dort physikalisch als Datei abgelegt. So spart man sich den Speicherplatz innerhalb der Datenbank.
Um diese Dateien aber auch wiederzufinden, bzw. nach dem Inhalt zu suchen, kann die Volltext-Indizierung eingesetzt werden.

Folgendes Fallbeispiel stellt sich:
Wir verfügen über verschiedenste Dokumente, bspw. im DOC, TXT und RTF Format die innerhalb der Datenbank im Filestream gespeichert und auch vollständig durchsucht werden sollen

Zu erst muss Filestream über den SQL Server Configuration Manager aktiviert werden.
Siehe hierfür BOL:
http://msdn.microsoft.com/de-de/library/cc645923.aspx

Zuerst brauchen wir eine Datenbank:
CREATE DATABASE [DMS] ON PRIMARY
( NAME = N'DMS',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL\DATA\DMS.mdf' ,
SIZE = 3072KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DMS_log',
FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL\MSSQL\DATA\DMS_log.ldf' ,
SIZE = 1024KB , FILEGROWTH = 10%)
GO

Nun wird das Filestream Feature auf der Datenbank mit dem Access Level 2 (Zugriff auch von externen Ressourcen, wie bspw. .NET) aktiviert:
EXEC sys.sp_configure N'filestream access level', N'2'
GO
RECONFIGURE WITH OVERRIDE
GO

Nun wird eine weitere Dateigruppe für die Speicherung der Filestream Daten angelegt mit der entsprechenden Ressource. Hier wird auch konfiguriert, wo sich der Filestream Ordner im Netzwerk oder Lokal befindet:
ALTER DATABASE [DMS] ADD FILEGROUP [dateien] CONTAINS FILESTREAM
GO
ALTER DATABASE [DMS] ADD FILE ( NAME = N'Dateien', FILENAME = N'C:\filestream\Dateien' ) TO FILEGROUP [dateien]
GO

Nun benötigen wir noch eine Tabelle in der die Daten gespeichert werden sollen:
CREATE TABLE Dokumente (
uid uniqueidentifier default newid() not null primary key ROWGUIDCOL,
name varchar(255) not null,
erweiterung varchar(255) not null,
datei varbinary(MAX) FILESTREAM NOT NULL,
hinzugefuegt datetime default getdate() not null)
ON [PRIMARY] FILESTREAM_ON [dateien];
GO

Um Filestream Daten speichern zu können, ist die Angabe von ROWGUIDCOL als Index notwendig.

Nun werden noch 3 Dateien über OPENROWSET hinzugefügt:
INSERT INTO dbo.Dokumente(name, erweiterung, datei)
SELECT
'Mein RTF Dokument' AS Name,
'rtf' AS Erweiterung,
* FROM OPENROWSET(BULK N'C:\temp\dokument.rtf', SINGLE_BLOB) AS datei;
GO

INSERT INTO dbo.Dokumente(name, erweiterung, datei)
SELECT
'Word 2003 Dokument' AS Name,
'doc' AS Erweiterung,
* FROM OPENROWSET(BULK N'C:\temp\beschreibung.doc', SINGLE_BLOB) AS datei;
GO

INSERT INTO dbo.Dokumente(name, erweiterung, datei)
SELECT
'Mein TXT Dokument' AS name,
'txt' AS erweiterung,
* FROM OPENROWSET(BULK N'C:\temp\test.txt', SINGLE_BLOB) AS datei
GO

Nun sind diese 3 Dateien im Filestream Container enthalten.
Mit folgender Query kann der Pfad ermittelt werden:
SELECT name, datei.PathName() FROM dbo.Dokumente

Ergebnis:

Die RTF Datei die eingefügt wurde, sieht folgendermaßen aus:

Nun ist das nächste Ziel, die Datei wiederzufinden indem nach „Welt“ gesucht wird.
Dafür benötigen wir den Volltext Index (Achtung: Dieser muss installiert sein!)

Zuerst wird ein Volltext Katalog benötigt:
CREATE FULLTEXT CATALOG FS_Datei_FT_Katalog AS DEFAULT;
GO

Nun wird der eigentliche Volltext Index erstellt. Dieser geht über die Felder Name, Datei und Erweiterung innerhalb der Tabelle damit diese durchsucht werden können. Da das Feld „datei“ Filestream Daten enthält, wird dieses mit dem Feld Erweiterung als Typ gebunden. So kann der Volltext Index unterscheiden, um was für Daten es sich handelt.
CREATE FULLTEXT INDEX ON [dbo].[Dokumente] KEY INDEX [PK__Dokument__DD7012647F60ED59]
ON ([FS_Datei_FT_Katalog]) WITH (CHANGE_TRACKING AUTO)
GO
ALTER FULLTEXT INDEX ON [dbo].[Dokumente] ADD ([datei] TYPE COLUMN [erweiterung])
GO
ALTER FULLTEXT INDEX ON [dbo].[Dokumente] ADD ([erweiterung])
GO
ALTER FULLTEXT INDEX ON [dbo].[Dokumente] ADD ([name])
GO
ALTER FULLTEXT INDEX ON [dbo].[Dokumente] ENABLE
GO

Um zu prüfen welche Erweiterungen der Volltext Index unterstützt, kann dies mit folgender Abfrage überprüft werden:
SELECT * FROM sys.fulltext_document_types;

Weitere Treiber können bei Bedarf nachinstalliert werden. Siehe hier (bspw. für Office 2007 oder 2010 Dokumente):
http://support.microsoft.com/default.aspx?scid=kb;en-us;945934

Nun kann der Volltext Index die Dateien durchsuchen:
select name, datei.PathName() from dbo.dokumente where FREETEXT(datei, '"*welt*"')

Ergebnis:

Weitere Informationen:
Volltext Filter: http://technet.microsoft.com/en-us/library/ms142571.aspx
Filestream: http://technet.microsoft.com/en-us/library/bb933993.aspx

Das wars.

Schreibe einen Kommentar