Сохраните двоичный файл в SQL Server как BLOB и текст (или получите текст из полнотекстового индекса)

В настоящее время мы сохраняем файлы (PDF, DOC) в базу данных как поля BLOB. Я хотел бы получить необработанный текст файла, чтобы иметь возможность манипулировать им для выделения хитов и других функций.

Кто-нибудь знает простой способ либо разобрать файлы, либо сохранить необработанный текст при сохранении либо с помощью кода SQL, либо .net. Я обнаружил, что у Adobe есть утилита filtdump, которая преобразует PDF в текст. Filtdump кажется инструментом командной строки, и я не вижу способа использовать файловый поток. И каким будет экстрактор для документов Office и других типов файлов?

-or-

Есть ли способ извлечь необработанный текст из полнотекстового индекса SQL без использования сторонних фильтров?

Обратите внимание, что я пытаюсь создать решение .net и MSSql без использования стороннего инструмента, такого как Lucene.


person Glennular    schedule 26.03.2010    source источник
comment
Если вы добавите комментарии к ответам, которые появились до сих пор, мы сможем улучшить наши ответы.   -  person egrunin    schedule 30.03.2010


Ответы (5)


Функция полнотекстового поиска SQL Server использует фильтры IFilter для извлечения обычного текста из форматов файлов PDF или Office. Вы можете установить IFilters на свой сервер или, если ваш код работает на той же машине, что и SQL Server, он у вас уже есть.

Вот статья, в которой показано, как использовать фильтры IFilter из .NET: http://www.codeproject.com/KB/cs/IFilter.aspx

person Yaroslav    schedule 04.04.2010

Если нет абсолютной необходимости выполнять потоковую передачу непосредственно из SQL Server в ваше приложение, сложной частью является синтаксический анализ форматов файлов PDF или DOC.

Библиотека iTextSharp даст вам доступ к внутренностям файла PDF:

http://itextsharp.sourceforge.net/

Вот коммерческий продукт, который утверждает, что анализирует документы Word:

Aspose.Words

Отредактировано для добавления:

Я думаю, вы также спрашиваете, есть ли способы заставить полнотекстовое индексирование SQL Server работать за вас, добавляя фильтры IFilter. Это звучит как хорошая идея. Я сам этого не делал, но MS, по-видимому, долгое время поддерживала фильтр Word, и теперь Adobe выпустила (бесплатный) PDF-фильтр. Здесь много информации:

Центральный фильтр

10 способов оптимизировать полнотекстовое индексирование SQL Server

SQL Server Full Текстовый поиск: языковые особенности — немного устарело, но понятно.

person egrunin    schedule 26.03.2010
comment
Поскольку SQL уже извлекает текст через собственные фильтры, зачем использовать другие инструменты? - person Glennular; 02.04.2010

Вы можете из своего приложения C # открыть файл .doc и сохранить его как текст и поместить как текст, так и документ .doc в базу данных.

person Tom Groszko    schedule 26.03.2010
comment
Это поможет только для формата .doc. Есть ли более универсальный метод? - person Glennular; 02.04.2010

Если вы используете SQL 2008, вы можете рассмотреть возможность использования нового FILESTREAM особенность.

Ваши данные хранятся в столбце varbinary(max), но вы также можете получить доступ к необработанным данным через обычный дескриптор Win32.

Вот пример кода, показывающий, как получить дескриптор.

person David Gardiner    schedule 30.03.2010
comment
FILESTREAM должен обрабатывать необработанный файл. Который мы передаем в SQL и обратно в его исходном формате (двоичном или текстовом). Я хотел бы получить индексированный текст двоичного файла, который индексирует индексатор. - person Glennular; 02.04.2010

У меня была такая же проблема... Я решил ее, добавив в свое приложение следующее:

  • EPocalipse.IFilter.dll (для всего, кроме Office документы 2007 г. из-за проблем с 64-кратной Windows)
  • OpenXML SDK 2.0 ( для документов Office 2007)

Я использую их для захвата обычного текста, а затем сохраняю его в базе данных вместе с двоичными данными. Имейте в виду, что я, конечно, не эксперт, поэтому может быть лучший способ сделать это, но это работает для всего, кроме «Быстрого сохранения» документов Word до 2007 года, которые, по-видимому, не читаются iFilters. Я просто прошу своих пользователей повторно сохранить документ, если возникает эта ошибка, и все работает нормально.

Дайте мне знать, если вам нужен пример кода... Я бы разместил его прямо сейчас, но он немного длинный.

person emmilely    schedule 31.03.2010
comment
Поскольку SQL уже извлекает текст через собственные фильтры, зачем использовать другие инструменты? Считаете ли вы, что эти два фильтра вместе решают большинство форматов файлов, которые будут проиндексированы? - person Glennular; 02.04.2010
comment
Я считаю, что SQL Server использует iFilters для чтения текста, поэтому DLL EPocalipse использует те же фильтры, что и SQL Server. Я согласен, было бы намного проще просто заставить SQL Server возвращать простой текст, но я не смог найти способ сделать это. iFilters должны иметь возможность читать текст всего, что может индексировать Microsoft, и я даже припоминаю, что видел что-то об их использовании для чтения текста в изображениях, но мне нужно было иметь дело только с файлами .doc, .docx и .pdf, поэтому Я не могу это проверить. - person emmilely; 07.04.2010