SQL Server 全文可以索引varbinary和image列。
您可以看到 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
在系统上注册的实现(例如提供docx、msg、one、pub、vsx、xlsx和zip支持的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 为IFilter
Office 2007 文件类型提供了过滤器包:
Adobe 提供了一个IFilter
用于索引 PDF 的工具(Foxit 提供了一个,但他们的不是免费的):
奖金阅读