Найти в Дзене
Битрикс24 изнутри

How-To: Индексируем содержимое файла диска

Разбираемся как устроен поиск и как индексировать docx и другие форматы
Оглавление

Вы замечали что иногда поиск по документам на диске (и не только) в коробочной версии Битрикс24 не всегда ищет по содержимому, а в последних версиях он вообще не ищет по содержимому документов? А уж об индексации pdf/jpg и других форматов так и вообще можно забыть. Нет, на самом деле это немножечко не так и эта особенность поддается корректировке.

Заинтересовались? Поехали!

Как устроен поиск в Битриксе?

Исторически в платформе всегда использовался поиск средствами модуля Поиск. Когда создается элемент инфоблока специальный механизм применяется к элементу и собрает с него поисковый контент, который токенизирует и складывает в отдельные таблицы b_search* и когда пользователь начинает вводить поисковый запрос, он разбивается на токены и ищется в этих таблицах. Время шло и со временем поиск перестал удовлетворять по критериям скорости и объема информации. Так поиск получил возможность интеграции с sphinx.

Для 1С-Битрикс: управления сайтом такого варианта вполне хватало: был либо поисковый запрос либо параметры фильтрации, однако пользовательский сценарий работы в Битрикс24 подразумевает использование обоих механизмов, что делает текущие варианты не эффективным. Разработчики Битрикс24 решили перейти на фильтрацию с полнотекстовым поиском в MySQL что дает возможность одновременного использования фильтрации и поиска.

Презентацию можно сказать по ссылке: скачать презентацию

Таким образом каждый элемент битрикс24 в своей таблице (или отдельной таблице) содержит некоторый столбец с текстом, по которому выполняется полнотекстовый поиск. Когда вы создаете сделку/контакт/загружаете файл в соответствующей таблице в этот столбец записывается конкатенация параметров и когда производится поиск то он осуществляется именно по этому столбцу.

Как включить индексацию диска?

Для базовой настройки индексации достаточно активировать эту возможность в настройках модуля Диск.

Админ.панель - Настройки - Настройки продукта - Настройки модулей - Диск
Админ.панель - Настройки - Настройки продукта - Настройки модулей - Диск

Достаточно простое действие: отмечаем нужные опции, задаем максимальный размер документа и переходим в публичную часть общего диска.

Индексация документов в действии
Индексация документов в действии

Не сказать что процесс длительный, но может занимать несколько дней. Зависит конечно же от размера ваших документов и того где они находятся.

Например для 10 маленьких локальных документов это может быть 10 минут, а для тысяч документов расположенных в облаке этот процесс может растянуться на недели или даже месяцы.

Как именно индексируются документы?

Если с текстовыми полями все более менее понятно: берем значения и пишем в поле, то как происходит извлечение информации из файлов?

При включенной индексации содержимого файлов для каждого загружаемого файла последовательно вызывается обработчик события OnSearchGetFileContent модуля search. Результат первого обработчика и будет является контентом документа (остальные обработчики даже не будут вызваны). Для файлов таким обработчиком внезамно является модуль Интранет (на событие подписан класс CIntranetSearchConverters с его одноименным методом OnSearchGetFileContent, найти который вы можете по пути: /bitrix/modules/intranet/tools/search.php)

Думаю не нужно объяснять, что для работы с MSOffice форматами, выбором языка программирования PHP будет не лучшим решением. Разработчики битрикса это в целом тоже понимают, поэтому для извлечения контента они используют внешние команды.

Что такое внешняя команда?

Это любое linux приложение вызванное через php-функцию exec от пользователя под которым запущен apache, которое получает на вход путь к документу и выводит на экран текстовое содержимое.

Например для конвертации doc-формата используется linux приложение catdoc. Часть из них вы можете найти в настройках модуля интранет, другая часть зашита в ядро продукта

Из коробки помимо перечисленных форматов индексируются так же: docx, odt, odp, ods, rtf, xlsx, pptx.
Из коробки помимо перечисленных форматов индексируются так же: docx, odt, odp, ods, rtf, xlsx, pptx.

Не расстраивайтесь, если вашего формата в списке нет, вы можете использовать или даже написать любое приложение, которое по пути к файлу будет проводить индексацию документа, т.е. возвращать его описание или содержимое.

Из хороших идей, можно сделать:

  • ML-парсер изображений (писать в духе поисковых систем: "на изображении человек"
  • Распознавать текст на картике
  • Проводить распознавание речи для аудиофайлов

Не устраивает качество?

И хотя в битрикс24 имеется стандартные способы индексации, всегда можно их изменить. Например, меня не очень устраивает стандартная индексация docx файла: она медленная и не полная. Я обычно в таких случаях ставлю на linux-овую виртуальную машину libreoffice (последняя, на момент работ была 6.4) и прописываю доп. строчку в настройках модуля Интранет:

Расширение: docx
Внешняя команда: libreoffice6.4 --headless --convert-to "txt:Text (encoded):UTF8" # FILE_NAME# --cat --outdir /tmp
Каталог программы: /usr/bin

P.S. Между # и FILE_NAME# не должно быть пробела - это дзен ставит хеш-теги

Только убедитесь, что выполнение команды под пользователем bitrix на файле docx формата выводит его содержимое в консоль :)