查找具有空全文索引的记录

时间:2014-07-28 23:26:47

标签: sql-server full-text-indexing

我将文档二进制文件(主要是PDF文件)存储在SQL Server数据库中,并使用Acrobat IFilter和全文索引来搜索文件的内容。

然而,其中一些PDF是使用非常便宜的软件进行扫描的,这些软件没有进行OCR,而且是文档的图像,而不是带有可搜索文本的正确文档。我想确定数据库中哪些记录没有可搜索的文本,以便可以进行OCR和重新上传。

我可以使用sys.dm_fts_index_keywords_By_Document获取的文档ID至少有一个全文条目。我尝试使用文档表加入不同的ID列表以查找不匹配的记录,但结果却非常慢 - 我有大约20,000个文档(几百页)并且查询运行了在我取消它之前超过20分钟。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我设法提出了一个解决方案,只用了大约2分钟来运行一套40,000个文档。

1)创建临时表以存储sys.dm_fts_index_keywords_by_document中的document_id值。

2)通过document_id分组来填充它。几乎所有文档都至少有一些条目,所以选择一个关键字计数阈值,表示全文索引没有有意义的信息(我使用30但大多数"坏"文档只有3-5)。在我的特定情况下,存储PDF二进制文件的表是PhysicalFile

3)如果需要,将临时表连接到其他表中列出您需要的信息的表。在我的特定情况下,MasterDocument包含文档标题,我还包括一些查找表。

create table #PhysicalFileIDs (PhysicalFileID int, KeywordCount int)

insert into #PhysicalFileIDs (PhysicalFileID, KeywordCount)
    select document_id, count(keyword) from sys.dm_fts_index_keywords_by_document (db_id(), object_id('PhysicalFile'))
    group by document_id having count(keyword) < 30

select MasterDocument.DocumentID, MasterDocument.Title, ProfileType.ProfileTypeDisplayName, #PhysicalFileIDs.KeywordCount
    from MasterDocument
    inner join #PhysicalFileIDs on Masterdocument.PhysicalFileID = #PhysicalFileIDs.PhysicalFileID
    inner join DocumentType on MasterDocument.DocumentTypeID = DocumentType.DocumentTypeID
    inner join ProfileType on ProfileType.ProfileTypeID = DocumentType.ProfileTypeID

drop table #PhysicalFileIDs