2

如果我在 SQL Server 的列中存储二进制文件(例如 doc、html、xml、xps、docx、pdf)varbinary(max),我如何使用全文索引来抓取二进制文件?

想象一下,我创建了一个表来存储二进制文件:

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

我如何利用IFilterWindows 提供的系统来抓取这些二进制文件并提取有用的、可搜索的信息?

当然,这样做的动机是微软的索引服务已被弃用,取而代之的是 Windows 搜索。索引服务提供了一个 OLEDB 提供程序MSIDX,SQL Server 可以使用它来查询索引服务目录。索引服务 OLE DB 提供程序

另一方面,Windows 搜索无法查询目录。SQL Server 无法访问 Windows 搜索。

幸运的是,Windows 搜索(以及之前的索引服务)的功能被引入了 SQL Server。SQL Server 全文索引服务使用IFilter已经存在 19 年的相同机制。

问题是:如何使用它来爬取存储在数据库中的 blob。

4

1 回答 1

3

SQL Server 全文可以索引varbinaryimage列。

您可以看到 SQL Server 当前支持的所有文件类型的列表:

SELECT * FROM sys.fulltext_document_types

例如:

| 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 |

创建包含二进制文件的varbinary(或image)列时,您必须有另一个字符串列通过其扩展名给出文件类型(例如“.doc”)

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

在将二进制列添加到全文索引时,SQL Server 需要告诉它哪一列包含数据类型字符串:

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

您可以通过从服务器上的文件系统导入二进制文件来进行测试:

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

您可以使用以下方式查看目录状态:

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

并且可以查询目录:

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

其他 IFilter

SQL Server 有一组有限的内置筛选器。它还可以使用IFilter在系统上注册的实现(例如提供docxmsgonepubvsxxlsxzip支持的Microsoft Office 2010 过滤器包)。

您必须通过启用以下选项来启用操作系统级过滤器:

sp_fulltext_service 'load_os_resources', 1

并重新启动 SQL Server 服务。

load_os_resources int

指示操作系统分词器、词干分析器和筛选器是否已注册并与此 SQL Server 实例一起使用。之一:

0:仅使用特定于此 SQL Server 实例的筛选器和断字符。
1:加载操作系统过滤器和分词器。

默认情况下,此属性被禁用,以防止对操作系统进行的更新导致无意的行为更改。启用操作系统资源可以访问使用 Microsoft 索引服务注册但未安装特定于实例的资源的语言和文档类型的资源。如果启用加载操作系统资源,请确保操作系统资源是受信任的签名二进制文件;否则,当verify_signature设置为 1时无法加载它们。

如果使用 SQL Server 2008 之前的 SQL Server,您还必须在启用此选项后重新启动全文索引服务:

net stop msftesql
net start msftesql

Microsoft 为IFilterOffice 2007 文件类型提供了过滤器包:

Adobe 提供了一个IFilter用于索引 PDF 的工具(Foxit 提供了一个,但他们的不是免费的):

奖金阅读

于 2016-07-28T15:45:39.887 回答