我将文档二进制文件(主要是PDF文件)存储在SQL Server数据库中,并使用Acrobat IFilter和全文索引来搜索文件的内容。
然而,其中一些PDF是使用非常便宜的软件进行扫描的,这些软件没有进行OCR,而且是文档的图像,而不是带有可搜索文本的正确文档。我想确定数据库中哪些记录没有可搜索的文本,以便可以进行OCR和重新上传。
我可以使用sys.dm_fts_index_keywords_By_Document
获取做的文档ID至少有一个全文条目。我尝试使用文档表加入不同的ID列表以查找不匹配的记录,但结果却非常慢 - 我有大约20,000个文档(几百页)并且查询运行了在我取消它之前超过20分钟。
有更好的方法吗?
答案 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