Найти записи с пустым полнотекстовым индексом

Я храню двоичные файлы документов (в основном файлы PDF) в базе данных SQL Server и использую Acrobat IFilter и полнотекстовое индексирование, чтобы сделать содержимое файлов доступным для поиска.

Однако некоторые из этих PDF-файлов были отсканированы с помощью действительно дешевого программного обеспечения, которое не выполняло оптическое распознавание символов, и представляют собой изображения документов, а не настоящие документы с текстом, доступным для поиска. Я хотел бы определить, какие записи в базе данных не имеют текста для поиска, чтобы их можно было распознать и повторно загрузить.

Я могу получить идентификаторы документов, которые имеют хотя бы одну полнотекстовую запись, используя sys.dm_fts_index_keywords_By_Document. Я попытался объединить отдельный список идентификаторов с таблицей документов, чтобы найти записи, которые не совпадают, но это оказалось невероятно медленным — у меня около 20 000 документов (несколько сотен страниц), и запрос выполнялся более 20 раз. минут, прежде чем я отменил его.

Есть лучший способ это сделать?


person Paul Abbott    schedule 28.07.2014    source источник
comment
Я прошел через это и не смог найти лучшего ответа ... мой набор рекордов был не таким большим, но это все равно заняло некоторое время. Выполните и уходите в течение дня... Я предлагаю сделать это как оператор вставки, чтобы все строки были сброшены в таблицу, которую вы можете вызвать позже. Бонусные баллы тому, у кого есть ответ на этот вопрос.   -  person Twelfth    schedule 29.07.2014
comment
На данный момент я не подключен к подходящей базе данных, но я часто обнаруживал, что могу извлечь код sql для процедуры, поставляемой MS, и т. д. Возможно, если вы сделаете это, вы сможете определить полезное подмножество полного запроса, который будет беги быстрее.   -  person Gary Walker    schedule 29.07.2014
comment
Только что вспомнил, что могу подключить RDP к подходящей машине. sys.dm_fts_index_keywords_By_Document находится в основных, системных, табличных функциях, но его нельзя экспортировать в сценарий создания функции, поэтому здесь нет помощи.   -  person Gary Walker    schedule 29.07.2014


Ответы (1)


Мне удалось найти решение, которое заняло всего около 2 минут для набора из 40 000 документов.

1) Создайте временную таблицу для хранения значений document_id из sys.dm_fts_index_keywords_by_document.

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
person Paul Abbott    schedule 17.11.2014