124 документа
← К списку

Глава 20. Механизм полнотекстового поиска в данных

страница

Глава 20. Механизм полнотекстового поиска в данных

20.1. Общие сведения

Механизм полнотекстового поиска в данных системы «1С:Предприятие» позволяет осуществлять поиск в базе данных с указанием поисковых операторов (И, ИЛИ, НЕ, РЯДОМ и др.).

Механизм полнотекстового поиска основан на использовании двух составляющих:

● полнотекстового индекса, который создается в базе данных и затем периодически, по мере необходимости, обновляется;

● средств выполнения полнотекстового поиска.

Объектами полнотекстового поиска являются данные следующих объектов конфигурации:

● планы обмена,

● справочники,

● документы,

● планы видов характеристик,

● планы счетов,

● планы видов расчета,

● регистры сведений,

● регистры накопления,

● регистры бухгалтерии,

● регистры расчета,

● бизнес-процессы,

● задачи.

Для каждого из перечисленных объектов конфигурации реализовано свойство Полнотекстовый поиск, которое позволяет включать или исключать данные объекта в/из полнотекстового индексирования.

Для фиксации изменений объектов полнотекстового поиска система «1С:Предприятие» ведет журнал регистрации изменений. Запись в этот журнал осуществляется в процессе записи объектов в базу данных. В файлы регистрации изменений попадают только те объекты, которые настроены для полнотекстового индексирования. Если в результате отката транзакции запись объекта в базу данных будет отменена, то запись в журнале регистрации изменений останется.

Полнотекстовое индексирование выполняется в привилегированном режиме (в контексте сервера) и не требует монопольного захвата базы данных. В процессе полнотекстового индексирования выполняется чтение файлов регистрации изменений и получение измененных объектов из базы данных, а также транслитерация слов и замещение букв в словах, введенных латиницей, на кириллицу (при этом индекс хранит обе формы слова). Индексированию подлежат только реквизиты следующих типов:

● строка,

● дата,

● число,

● ссылочные типы,

● хранилище значения.

Для каждого объекта и реквизита в полнотекстовый индекс добавляется:

● имя объекта метаданных или его реквизита;

● синоним объекта метаданных или его реквизита (на всех языках конфигурации);

● представление объекта метаданных (на всех языках конфигурации).

Стандартные и пользовательские реквизиты индексируются на всех языках, что позволяет проводить поиск на всех языках конфигурации (например, русский и английский).

Примечание. При полнотекстовом индексировании и поиске слова с буквой «ё» буквы «ё» заменяются на «е».

О расположении файлов индекса полнотекстового поиска можно прочитать в статье на диске ИТС (http://its.1c.ru/db/metod8dev#content:1591:hdoc).

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

Поиск по основному индексу выполняется эффективно, в то время как поиск по дополнительному индексу выполняется медленнее. Поэтому в процессе индексирования предусмотрена возможность слияния индексов, которая позволяет добавить результат последних изменений данных к основному индексу. При этом следует учитывать, что эта операция может оказаться довольно длительной (если размер основного индекса большой), поэтому рекомендуется выполнять ее в периоды минимальной нагрузки на систему (в ночное время или по выходным).

Полнотекстовый поиск инициируется пользователем в контексте клиентского приложения, а выполняется в контексте сервера. Это означает, что в файловом варианте работы поиск будет выполняться на клиентском компьютере, а в клиент-серверном – в кластере серверов системы «1С:Предприятие».

Полнотекстовый поиск в данных осуществляется в соответствии с правами пользователя (в том числе и в соответствии с ограничениями прав доступа на уровне записей и полей базы данных). При этом поиск можно вести и по словам, которые были введены в базу данных с ошибками: например, если в слове вместо русской «с» стоит английская «c», если при наборе слова была нечаянно сменена раскладка клавиатуры и в результате слово приняло вид, например, «системf» вместо «система», эти слова все равно попадут в результат поиска. Также следует помнить, что механизм полнотекстового поиска в данных осуществляется всегда с начала слова.

Результаты поиска возвращаются частями, размер которых определяется при выполнении команды полнотекстового поиска.

Ранжирование полученных результатов осуществляется в порядке следующих приоритетов:

● «вес» объекта метаданных: чем больше ссылок на этот объект в реквизитах других объектов, тем выше его «вес»;

● дата объекта (более новые объекты будут находиться в начале).

20.2. Использование механизма

Полнотекстовый поиск в данных осуществляется средствами встроенного языка.

Свойство глобального контекста ПолнотекстовыйПоиск возвращает менеджер полнотекстового поиска – объекта типа МенеджерПолнотекстовогоПоиска.

Методы менеджера полнотекстового поиска позволяют:

● получить информацию о состоянии полнотекстового индекса;

● выполнить полнотекстовое индексирование;

● инициировать процесс выполнения полнотекстового поиска в данных.

Для получения информации о состоянии полнотекстового индекса предназначены следующие методы:

● ПолучитьРежимПолнотекстовогоПоиска() – возвращает значение Истина, если использование полнотекстового поиска разрешено, или Ложь – в противном случае.

● ДатаАктуальности() – дата последнего момента, когда были проиндексированы все данные и не было информации о новых объектах для индексирования.

● ИндексАктуален() – возвращает значение Истина, если индекс полнотекстового поиска полностью соответствует текущему состоянию информационной базы.

● ОбновлениеИндексаЗавершено() – возвращает значение Истина, если слияние полнотекстового индекса не требуется.

● УстановитьМаксимальныйРазмерИндексируемыхДанных() – позволяет установить максимальный размер (в байтах) данных, индексируемых полнотекстовым поиском. До первого вызова данного метода максимальный размер индексируемых данных равен 1 Мбайту.

● ПолучитьМаксимальныйРазмерИндексируемыхДанных() – возвращает максимальный размер данных (в байтах) который индексируется полнотекстовым поиском.

Для выполнения полнотекстового индексирования предназначены следующие методы:

● УстановитьРежимПолнотекстовогоПоиска() – устанавливает режим полнотекстового поиска (Разрешить или Запретить). Если поиск был запрещен, то вызов этого метода с параметром Истина автоматически очищает имеющийся полнотекстовый индекс.

● ОбновитьИндекс() – обновляет индекс полнотекстового поиска. Если индексы отсутствовали, выполняет полную переиндексацию всей базы данных. В параметрах метода передаются условия индексирования:

● РазрешитьСлияние – если передается значение Истина, будет выполнено слияние основного и дополнительного индексов.

● Порционное – значение Истина указывает, что индексирование будет выполняться порциями из 10 тысяч объектов. После индексирования данных одной порции процесс завершается. Время индексирования одной порции сильно зависит от данных.

● ОчиститьИндекс() – удаляет все файлы полнотекстового индекса. Этот метод рекомендуется использовать в тех случаях, когда данные были полностью или почти полностью обновлены (например, при выполнении загрузки информационной базы). После очистки индекса нужно выполнить индексирование (если требуется).

Инициирование процесса полнотекстового поиска в данных выполняется с помощью метода СоздатьСписок(). В метод передаются два параметра:

● СтрокаПоиска – строка, содержащая поисковое выражение;

● РазмерПорции – число, задающее количество объектов, которые будут возвращены в одной части полнотекстового поиска.

Описание синтаксиса поисковых выражений см. здесь.

Метод СоздатьСписок() возвращает объект СписокПолнотекстовогоПоиска, который позволяет выполнять полнотекстовый поиск и получать результаты полнотекстового поиска. Этот объект может быть использован многократно для выполнения поиска с различными условиями. Свойства объекта СтрокаПоиска и РазмерПорции позволяют изменять используемое поисковое выражение и размер порции получаемых данных.

Для выполнения полнотекстового поиска и получения «первых» результатов используется метод ПерваяЧасть(), который заполняет список первыми найденными элементами, в соответствии с размером порции. Для получения последующих результатов полнотекстового поиска используются методы СледующаяЧасть() и ПредыдущаяЧасть(), которые могут принимать в качестве параметра текущую начальную позицию и заполняют список полнотекстового поиска результатами поиска. Если параметр ТекущаяНачальнаяПозиция не указан, то используется имеющееся у объекта СписокПолнотекстовогоПоиска значение начальной позиции, которое, например, можно получить с помощью метода НачальнаяПозиция(). Использование параметра предпочтительнее, т. к. повышает скорость работы полнотекстового поиска.

Метод Количество() содержит количество элементов в текущей части (для последней части оно будет меньше либо равно размеру порции), а метод ПолноеКоличество() содержит полное количество элементов, найденных в результате полнотекстового поиска.

Метод СледующаяЧасть() заполняет список следующими элементами в соответствии со значением размера порции. При этом текущая позиция увеличивается на количество данных, содержащихся в полученной части. Если данных для получения очередной порции нет (достигнут конец данных), будет вызвано исключение, которое может быть обработано конструкцией Попытка … Исключение … КонецПопытки.

Метод ПредыдущаяЧасть() заполняет список предыдущими найденными элементами в соответствии с размером порции. Если данных для получения очередной порции нет (достигнуто начало данных), будет вызвано исключение, которое может быть обработано конструкцией Попытка … Исключение … КонецПопытки.

Метод СлишкомМногоРезультатов() возвращает значение Истина, если во время поиска, по соображениям производительности, было произведено усечение количества результатов, что может сказаться на точности поиска (не все объекты будут найдены). Анализ значения, возвращаемого этим методом, имеет смысл выполнять при получении последней порции найденных данных для информирования пользователя о том, что получены не все результаты, которые содержатся в базе данных.

Свойство ПолучатьОписание содержит признак получения описания для результатов поиска. Если он установлен в значение Истина, то для каждого из результатов поиска будет заполнено значение Описание, помогающее понять контекст найденных слов. В то же время установка этого свойства в значение Ложь ускоряет поиск.

Список полнотекстового поиска представляет собой коллекцию элементов списка полнотекстового поиска, которую можно обойти с помощью оператора Для Каждого … Из … Цикл.

Каждый элемент списка полнотекстового поиска представляется объектом ЭлементСпискаПолнотекстовогоПоиска и содержит следующие свойства:

● Значение – идентифицирует данные (объект или набор записей), в которых найдено поисковое выражение;

● Метаданные – объект метаданных, описывающий те данные, в которых найдено поисковое выражение;

● Представление – текстовое представление найденного объекта;

● Описание – содержит (с новой строки) пары <реквизит>:<значение>, где:

● <реквизит> – реквизит объекта, в значении которого найдено выражение поиска;

● <значение> – значение этого реквизита.

Результат поиска с помощью метода ПолучитьОтображение() можно представить в виде объекта ЧтениеXML или в виде строки с текстом в формате HTML, в котором средствами HTML найденные слова подсвечены (жирный шрифт и цвет фона).

20.3. Использование дополнительных словарей

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

В качестве дополнительных словарей могут выступать макеты из двоичных данных и текстовые макеты, а также константы строкового типа и типа ХранилищеЗначения. Указание дополнительных словарей выполняется в свойстве Дополнительные словари корневого объекта метаданных.

При этом они должны иметь следующее содержание:

Копировать в буфер обмена

рунетрунета рунете рунетом ВанессаВанессе Ванессы Ванессу ошибка баг сбой стрим поток

Элемент Dictionary

Предназначен для хранения собственно словаря. Словарь может содержать две секции:

● дополнительные слова (леммы) и их формы;

● ряды синонимов.

Элемент Words

Содержит слова в следующем виде:

● в элементе lemma слово хранится в его основной форме (именительном падеже);

● в элементе forms содержатся падежные формы слова.

По умолчанию нечеткий поиск не производится. Для того чтобы выполнить нечеткий поиск, следует использовать оператор «*». Пример: поиск руне* найдет и рунет, и рунета, и рунете, и рунетом.

Элемент Synonyms

Хранятся наборы синонимов. Каждый набор заключается в теги item.

Для того чтобы синонимы участвовали в полнотекстовом поиске, следует использовать оператор «!». При этом поиск !ошибка найдет и ошибка, и баг, и сбой. Описание синтаксиса поисковых выражений см. здесь.

Элементы Synonyms и Words могут идти в произвольном порядке.

Словари загружаются системой при первом вызове поиска или индексировании. Если в макете содержатся ошибки, то заполнение словарей будет остановлено на месте ошибки.

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

● файловый вариант информационной базы с прямым подключением – необходимо перезапустить все клиентские приложения, подключенные к информационной базе;

● файловый вариант с подключением через веб-сервер – необходимо перезапустить расширение веб-сервера (фактически перезапуска требует веб-сервер);

● клиент-серверный вариант (с любым видом подключения) – необходимо перезапустить сервер «1С:Предприятия».

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

20.4. Мобильная платформа

Полнотекстовый поиск на мобильной платформе имеет некоторые особенности и ограничения.

Полнотекстовый поиск не поддерживает:

● Поиск с учетом морфологии.

● Подключение дополнительных словарей.

● Операцию извлечения текста (объект ИзвлечениеТекст).

При использовании полнотекстового поиска на мобильной платформе следует помнить о следующих особенностях:

● Обновление индекса полнотекстового поиска выполняется автоматически, после создания или изменения объекта конфигурации, для которых установлено использование полнотекстового поиска.

● Для обновления индекса полнотекстового поиска создается специальное фоновое задание. Фоновое задание создается в том случае, если не выполняется серверный вызов и не выполняется другое фоновое задание. Обновление выполняется порциями по 10 000 объектов.

● В том случае, если все объекты в информационной базе проиндексированы, то мобильная платформа запускает слияние индексов по истечении 20 секунд бездействия.

Если требуется гарантированно выполнить индексирование данных, например, после синхронизации информационной базы с информационной базой на персональном компьютере, то следует явным образом выполнить обновление индекса полнотекстового поиска с помощью метода ОбновитьИндекс(Истина, Ложь) менеджера полнотекстового поиска.