Utilisation de l'indexing de text intégral pour parsingr les blobs binarys

Si je stocke des files binarys (par exemple doc, html, xml, xps, docx, pdf) dans une varbinary(max) dans SQL Server, comment puis-je utiliser l'indexing de text intégral pour parsingr les files binarys?

Imaginez que je crée une table pour stocker des files binarys:

 CREATE TABLE Documents ( DocumentID int IDENTITY, Filename nvarchar(32000), Data varbinary(max), ) 

Comment puis-je tirer parti du système IFilter fourni par Windows pour explorer ces files binarys et extraire des informations utiles et consultables?

La motivation pour cela, bien sûr, est que le service d'indexing de Microsoft est décrié et remplacé par Windows Search. Le service d'indexing a fourni un fournisseur OLEDB ( MSIDX que SQL Server pourrait utiliser pour interroger le catalogue Service d'indexing.) Le fournisseur OLE DB du service d'indexing

Windows Search, d'autre part n'a aucun moyen d'interroger le catalogue. SQL Server n'a aucun moyen d'accéder à Windows Search.

Heureusement, les fonctionnalités de Windows Search (et du service d'indexing avant) ont été embeddedes dans SQL Server. Le service d'indexing de text intégral SQL Server utilise le même mécanisme IFilter qui existe depuis 19 ans.

La question est: comment l'utiliser pour explorer les blobs stockés dans la database.

SQL Server fulltext peut indexer les colonnes varbinary et image .

Vous pouvez voir la list de tous les types de files actuellement pris en charge par SQL Server:

 SELECT * FROM sys.fulltext_document_types 

Par exemple:

 | document_type | class_id | path | version | manufacturer | |---------------|--------------------------------------|----------------------------------------------------------------------------------|-------------------|-----------------------| | .doc | F07F3920-7B8C-11CF-9BE8-00AA004B9986 | C:\Windows\system32\offfilt.dll | 2008.0.9200.16384 | Microsoft Corporation | | .txt | C7310720-AC80-11D1-8DF3-00C04FB6EF4F | c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\msfte.dll | 12.0.6828.0 | Microsoft Corporation | | .xls | F07F3920-7B8C-11CF-9BE8-00AA004B9986 | C:\Windows\system32\offfilt.dll | 2008.0.9200.16384 | Microsoft Corporation | | .xml | 41B9BE05-B3AF-460C-BF0B-2CDD44A093B1 | c:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\Binn\xmlfilt.dll | 12.0.9735.0 | Microsoft Corporation | 

Lors de la création de la colonne varbinary (ou image ) pour contenir votre file binary, vous devez avoir une autre colonne de string qui donne le type de file via son extension (par exemple ".doc")

 CREATE TABLE Documents ( DocumentID int IDENTITY, Filename nvarchar(32000), Data varbinary(max), DataType varchar(50) --contains the file extension (eg ".docx", ".pdf") ) 

Lors de l'ajout de la colonne binary à l'index de text intégral, SQL Server a besoin que vous lui indiquiez quelle colonne contient la string de type de données :

 ALTER FULLTEXT INDEX ON [dbo].[Documents] ADD ([Data] TYPE COLUMN [DataType]) 

Vous pouvez tester en important un file binary du système de files sur le server:

 INSERT INTO Documents(filename, DataType, data) SELECT 'Managing Storage Spaces with PowerShell.doc' AS Filename, '.doc', * FROM OPENROWSET(BULK N'C:\Managing Storage Spaces with PowerShell.doc', SINGLE_BLOB) AS Data 

Vous pouvez afficher l'état du catalogue en utilisant:

 DECLARE @CatalogName varchar(50); SET @CatalogName = 'Scratch'; SELECT CASE FULLTEXTCATALOGPROPERTY(@CatalogName, 'PopulateStatus') WHEN 0 THEN 'Idle' WHEN 1 THEN 'Full population in progress' WHEN 2 THEN 'Paused' WHEN 3 THEN 'Throttled' WHEN 4 THEN 'Recovering' WHEN 5 THEN 'Shutdown' WHEN 6 THEN 'Incremental population in progress' WHEN 7 THEN 'Building index' WHEN 8 THEN 'Disk is full. Paused.' WHEN 9 THEN 'Change tracking' ELSE 'Unknown' END+' ('+CAST(FULLTEXTCATALOGPROPERTY(@CatalogName, 'PopulateStatus') AS varchar(50))+')' AS PopulateStatus, FULLTEXTCATALOGPROPERTY(@CatalogName, 'ItemCount') AS ItemCount, CAST(FULLTEXTCATALOGPROPERTY(@CatalogName, 'IndexSize') AS varchar(50))+ ' MiB' AS IndexSize, CAST(FULLTEXTCATALOGPROPERTY(@CatalogName, 'UniqueKeyCount') AS varchar(50))+' words' AS UniqueKeyCount, FULLTEXTCATALOGPROPERTY(@CatalogName, 'PopulateCompletionAge') AS PopulateCompletionAge, DATEADD(second, FULLTEXTCATALOGPROPERTY(@CatalogName, 'PopulateCompletionAGe'), 0) AS PopulateCompletionDate 

Et vous pouvez interroger le catalogue:

 SELECT * FROM Documents WHERE FREETEXT(Data, 'Bruce') 

IFilters supplémentaires

SQL Server possède un set limité de filters embeddeds. Il peut également utiliser les implémentations IFilter enregistrées sur le système (par exemple, Microsoft Office 2010 Filter Pack qui fournit un support docx , msg , un , pub , vsx , xlsx et zip ).

Vous devez activer l'utilisation des filters au niveau du operating system en activant l'option :

 sp_fulltext_service 'load_os_resources', 1 

et redémarrez le service SQL Server.

load_os_resources int

Indique si les séparateurs de mots du operating system, les stemmers et les filters sont enregistrés et utilisés avec cette instance de SQL Server. Un des:

0: utilisez uniquement des filters et des séparateurs de mots spécifiques à cette instance de SQL Server.
1: Charger les filters du operating system et les séparateurs de mots.

Par défaut, cette propriété est désactivée pour empêcher les modifications de comportement par inadvertance par les mises à jour apscopes au operating system. L'activation de l'utilisation des ressources du operating system permet d'accéder aux ressources pour les langues et les types de documents enregistrés auprès du service d'indexing Microsoft pour lequel aucune ressource spécifique à l'instance n'est installée. Si vous activez le chargement des ressources du operating system, assurez-vous que les ressources du operating system sont des binarys signés approuvés; Dans le cas contraire, ils ne peuvent pas être chargés lorsque verify_signature est défini sur 1.

Si vous utilisez SQL Server avant SQL Server 2008, vous devez également redémarrer le service d'indexing de text intégral après avoir activé cette option:

 net stop msftesql net start msftesql 

Microsoft fournit des packs de filters contenant IFilter pour les types de files Office 2007:

  • Packs de filters Microsoft Office 2007
  • Packs de filters Microsoft Office 2010

Et Adobe fournit un IFilter pour l'indexing des files PDF ( Foxit en fournit un , mais le leur n'est pas gratuit):

  • Adobe PDF iFilter 64 11.0.01

Lecture bonus

  • KB945934: Comment save Microsoft Filter Pack IFilters avec SQL Server
  • MS Blogs: Obtention d'un IFilter personnalisé avec SQL Server 2008 / R2 (IFilterSample)