Система «1С:Предприятие» располагает механизмом полнотекстового поиска данных, который позволяет искать информацию в базе данных использую поисковые операторы. В версии технологической платформы 8.3.11 механизм полнотекстового поиска претерпел некоторые усовершенствования, это и послужило поводом для написания статьи которая рассказывает о том, что это за механизм, как он устроен и как им пользоваться.
Общие сведения
Сам механизм полнотекстового поиска состоит из двух частей:
- полнотекстовый индекс, который создается в базе данных и обновляется по мере необходимости;
- средства выполнения полнотекстового поиска.
Искать же можно среди данных следующих объектов:
- планы обмена;
- справочники;
- документы;
- планы видов характеристик;
- планы счетов;
- планы видов расчета;
- регистры сведений;
- регистры накопления;
- регистры бухгалтерии;
- регистры расчета;
- бизнес-процессы;
- задачи.
Для перечисленных объектов, а также для подчиненных им объектов (для реквизитов, например) реализовано свойство «Полнотекстовый поиск», которое позволяет управлять полнотекстовым индексирование объектов (очень похоже на историю данных).
Изменение отмеченных объектов учитывается в журнале регистрации изменений. Информация из этого журнала используется при полнотекстовом индексировании, которое выполняется в привилегированном режиме на сервере, монопольный доступ к базе при этом не требуется. Индексацию проходят реквизиты типов:
- строка;
- дата;
- число;
- ссылочные типы;
- хранилище значения.
Для каждого объекта/реквизита в полнотекстовый индекс добавляется:
- имя объекта метаданных или его реквизита;
- синоним объекта метаданных иди его реквизита;
- представление объекта метаданных.
Полнотекстовое индексирование создает основной индекс, а последующие изменения данных — дополнительный. Это важная особенность, так как поиск по основному индексу выполняется быстрее чем по дополнительному. Для устранения этого недостатка в процессе индексирования предусмотрена возможность слияния индексов. Этот процесс может потребовать значительного времени (зависит от размера основного индекса), поэтому для его выполнения рекомендуется выбирать такое время, когда нагрузка на систему минимальна (ночь или выходные).
В клиент-серверном варианте работы поиск выполняется на сервере. Результаты возвращаются частями, размер которых определяется при выполнении команды полнотекстового поиска. Ранжирование результатов осуществляется по:
- «весу» объекта (чем больше ссылок на этот объект из реквизитов других объектов, тем больше вес);
- дате объекта (новые объекты вверху).
Использование механизма
Работа с полнотекстовым поиском осуществляется при помощи свойства глобального контекста — ПолнотекстовыйПоиск.
Отмечу, что примеры предназначен только для демонстрации имеющихся методов и имеет мало общего с реальными задачами, возникающими при работе с полнотекстовым поиском.
Некоторые методы требуют наличия у пользователя административных прав, подробнее об этом написано в синтаксис-помощнике.
Управление полнотекстовым поиском
Сначала рассмотрим методы которые позволяют получать информацию о полнотекстовом индексе и управлять им.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | &НаСервере Процедура РаботаСПолнотекстовымПоиском() //проверим доступность полнотекстового поиска Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Запретить Тогда //разрешим полнотекстовый поиск //в этом случае имеющийся индекс будет очищен ПолнотекстовыйПоиск.УстановитьРежимПолнотекстовогоПоиска(РежимПолнотекстовогоПоиска.Разрешить); Иначе //очистим весь индекси начнем все с начала ПолнотекстовыйПоиск.ОчиститьИндекс(); КонецЕсли; //дата актуальности индекса ДатаАктуальности = ПолнотекстовыйПоиск.ДатаАктуальности(); //получим максимальный размер индексируемых данных в байтах //по умолчанию 1048576 байт - 1 мегабайт МаксимальныйРазмерИД = ПолнотекстовыйПоиск.ПолучитьМаксимальныйРазмерИндексируемыхДанных(); //будем индексировать все данные ПолнотекстовыйПоиск.УстановитьМаксимальныйРазмерИндексируемыхДанных(0); //получим максимальное количество фоновых заданий //которое может быть запущено для обновления индекса КоличествоЗаданий = ПолнотекстовыйПоиск.ПолучитьКоличествоЗаданийИндексирования(); //доверим системе самой выбирать количество заданий ПолнотекстовыйПоиск.УстановитьКоличествоЗаданийИндексирования(0); //проверяем актуальность индекса Если НЕ ПолнотекстовыйПоиск.ИндексАктуален() Тогда //проверяем необходимость слияния Если НЕ ПолнотекстовыйПоиск.ОбновлениеИндексаЗавершено() Тогда //обновляем индекс со слиянием ПолнотекстовыйПоиск.ОбновитьИндекс(Истина, Ложь); Иначе //обновление без слияния ПолнотекстовыйПоиск.ОбновитьИндекс(); КонецЕсли; КонецЕсли; КонецПроцедуры |
Выполнение поиска и обработка результатов
Описание синтаксиса поисковых выражений можно посмотреть здесь.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | &НаСервере Процедура РаботаСоСпискомРезультатов() //поищем в базе по слову "Товары" и установим размер порции - 10 //размер порции по умолчанию - 20 РезультатыПоиска = ПолнотекстовыйПоиск.СоздатьСписок("Товары", 10); //для каждого результата буде тзаполнено описание //что помогает понять контекст РезультатыПоиска.ПолучатьОписание = Истина; //в тоже время, это ускорит поиск //РезультатыПоиска.ПолучатьОписание = Ложь; //выполняет поиск и получает первую часть результатов РезультатыПоиска.ПерваяЧасть(); //если результатов поиска слишком, то производится усечение результатов СлишкомМногоРезультатов = РезультатыПоиска.СлишкомМногоРезультатов(); //общее количество найденых результатов ОбщееКоличество = РезультатыПоиска.ПолноеКоличество(); //количество результатов в текущей порции КоличествоВЭтойПорции = РезультатыПоиска.Количество(); Попытка //навигация по результатам осуществляется так //параметр указывает откуда взять следующую/предыдущую часть РезультатыПоиска.СледующаяЧасть(50); //и так РезультатыПоиска.ПредыдущаяЧасть(35); Исключение //при достижении конца результатов будет вызвано исключение //тоже самое будет если строка поиска содержит ошибки КонецПопытки; //узнаем текущую позицию поиска ТекущееПоложения = РезультатыПоиска.НачальнаяПозиция(); Для Каждого Результат Из РезультатыПоиска Цикл //список полнотекстового поиска можно обойти в цикле //свойства элементов списка на картинке ниже КонецЦикла; //получает результаты поиска либо в виде объекта ЧтениеXML //либо в виде строки с текстом в формате HTML //в формате HTML найденные слова подсвечены, пример ниже ОтображениеПоиска = РезультатыПоиска.ПолучитьОтображение(ВидОтображенияПолнотекстовогоПоиска.HTMLТекст); КонецПроцедуры |
Дополнительные словари
Дополнительные словари расширяют системные словари, добавляя особые термины и слова, которые встречаются в конкретной конфигурации. В качестве словарей могут использоваться макеты из двоичных данных и текстовые макеты, а также константы строкового типа и типа ХранилищеЗначения. Что бы это ни было, оно должно иметь следующий вид:
1 2 3 4 5 6 7 8 9 10 11 |
Указать дополнительные словари можно в свойстве конфигурации «Дополнительные словари»:
Мобильная платформа
Полнотекстовый поиск на мобильной платформе работает с некоторыми ограничениями:
- не поддерживается поиск с учетом морфологии;
- нельзя подключить дополнительные словари;
- нельзя использовать операцию извлечения текста.
Кроме этого существуют еще некоторые особенности работы полнотекстового поиска на мобильной платформе:
- обновление индекса выполняется автоматически;
- обновление индекса выполняется посредством фонового задания, которое создается в том случае, если не выполняется серверный вызов или другое фоновое задание;
- если все объекта проиндексированы, то через 20 секунд бездействия платформа запускает слияние индексов.
Несмотря на автоматическое обновление индекса, иногда требуется принудительное обновление индекса, сделать это можно с помощью метода ОбновитьИндекс().
На этом все, надеюсь, что эта статья была Вам полезна.
Загрузка...
Механизм полнотекстового поиска в данных системы 1С:Предприятие 8 позволяет осуществлять поиск в базе данных с указанием поисковых операторов (И, ИЛИ, НЕ, РЯДОМ и др.).