Полнотекстовый поиск
Полнотекстовый поиск данных — это инструмент «1С:Шины», позволяющий выполнять поиск записей в базе данных по их текстовым представлениям.
Механизм полнотекстового поиска включает:
- программные средства для формирования полнотекстового индекса и его периодического обновления;
- программные средства для поиска по полнотекстовому индексу и оформления результатов поиска;
- полнотекстовый индекс, содержащий текстовые представления всех записей базы данных.
Для полноценной работы полнотекстового поиска в приложении необходимо включить настройку Автозапуск запланированных заданий:

По умолчанию «1С:Шина» индексирует следующие объекты:
- планы обмена,
- регистры сведений,
- хранимые структуры,
- файлы хранилища двоичных данных:
- офисные документы (doc, docx, pdf, odt, rtf, ...),
- простой текст (txt, md, csv, ...),
- электронные таблицы (xls, xlsx, ods, ...),
- презентации (ppt, pptx, odp, ...),
- архивы (zip, rar, 7z, ...).
Для каждого объекта вы можете указать, нужно ли учитывать его данные при индексировании. Для этого используйте следующие свойства:
- для реквизитов сущностей —
ИспользоватьВПолнотекстовомПоиске, - для файлов двоичного хранилища —
ДвоичныйОбъект.Свойства.ИспользованиеПолнотекстовогоПоиска.
Выполнение полнотекстового поиска
Для работы с функциями полнотекстового поиска во встроенном языке используется тип-одиночка ПолнотекстовыйПоиск. Методы данного типа позволяют выполнить все необходимые операции по управлению и использованию полнотекстового поиска: проверить актуальность поискового индекса, получить количество непроиндексированных изменений, перестроить индекс и вызвать функцию поиска.
Для выполнения полнотекстового поиска вызовите метод Искать() и укажите поисковое выражение в виде строки ил и экземпляра структуры ЗапросПолнотекстовогоПоиска. Вы также можете настроить результаты поиска и задать область поиска.
Пример поиска по справочнику Сотрудники:
@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(СтрокаПоиска: Строка): ЧитаемыйМассив<Сущность.Ключ>
возврат ПолнотекстовыйПоиск.Искать(ПоисковыйЗапрос = СтрокаПоиска, ИндексСтраницы = 0,
РазмерСтраницы= 50, ОбластьПоиска = [Тип<Сотрудники.Ссылка>])
;
Настройки результатов полнотекстового поиска
Чтобы настроить результаты поиска, используйте свойства типа НастройкиРезультатаПолнотекстовогоПоиска:
ПолучатьЗаголовки— указывает, нужно ли возвращать заголовки (краткое представление) по каждой найденной записи.ПолучатьФрагменты— указывает, нужно ли возвращать фрагменты текста с подсветкой найденных вхождений. Для получения оформленного набора фрагментов используйте методЭлементРезультатаПолнотекстовогоПоиска.Представление().ПолучатьФрагментыПоСвойствам— указывает, нужно ли заполнять массивЭлементРезультатаПолнотекстовогоПоиска.ФрагментыПоСвойствам, в котором фрагменты текста разделены по свойствам. Используйте данный режим, если вам требуется получить метаданные по свойствам и информацию по каждому фрагменту в контексте свойства.НастройкиФрагментов— позволяет настроить представление найденных фрагментов текста.
@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(Запрос: Строка): Массив<Строка>
// Настройка результатов полнотекстового поиска
знч НастройкиРезультата = новый НастройкиРезультатаПолнотекстовогоПоиска(
ПолучатьЗаголовки = Истина,
ПолучатьФрагменты = Истина,
НастройкиФрагментов = новый НастройкиФрагментовПолнотекстовогоПоиска(
ВидФрагмента = ВидФрагментаПолнотекстовогоПоиска.Html,
МаксимальноеКоличествоФрагментов = 10,
РазмерФрагмента = 150,
ОткрывающийТег = "<strong>",
ЗакрывающийТег = "</strong>"))
знч МассивФрагментовТекста = <Строка>[]
// Выполнение поиска с заданными настройками
знч РезультатПоиска = ПолнотекстовыйПоиск.Искать(
новый ЗапросПолнотекстовогоПоиска(
Запрос = Запрос,
ИндексСтраницы = 0,
Разм ерСтраницы = 50),
НастройкиРезультата)
// Заполнение массива найденных фрагментов текста
для Элемент из РезультатПоиска.Порция
МассивФрагментовТекста.Добавить(Элемент.Представление())
;
возврат МассивФрагментовТекста
;
Представление результатов полнотекстового поиска
Найденные в результате поиска фрагменты текста могут быть представлены следующими способами:
-
Собраны в стандартное представление с помощью метода
Представление()типаЭлементРезультатаПолнотекстовогоПоиска. По умолчанию составной фрагмент оформляется так:- Все разрывы фрагментов обозначаются троеточием
.... - Табличные части выводятся в сокращенном виде:
Представление: ...Вхождение1... ...Вхождение2.... - Если запись найдена по основному тексту, среди фрагментов будут свойства с выделенными (подсвеченными) вхождениями.
- Если запись найдена не по основному тексту, тогда выводятся несколько первых наиболее приоритетных свойств без выделения вхождений.
- Все разрывы фрагментов обозначаются троеточием
-
Разделены по свойствам: будет заполнен массив
ЭлементРезультатаПолнотекстовогоПоиска.ФрагментыПоСвойствам. В одном свойстве может быть более одного текстового фрагмента. Фрагмент может быть полным значением свойства. Вместе с фрагментом также предоставляется список вхождений. -
Собраны в одно представление с помощью метода
ПостроитьПредставление()типаРезультатПолнотекстовогоПоиска. Используйте данный метод, если вам требуется настроить вывод результатов поиска. Вы можете указать разделитель свойств и символы для разрыва текста слева, справа и в середине; включить в представление дополнительные свойства; вывести фрагменты по табличным частям в упрощенном виде. Пример:@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(Запрос: Строка): Массив<Строка>
знч МассивФрагментовТекста = <Строка>[]
// Выполнение поиска
знч РезультатПоиска = ПолнотекстовыйПоиск.Искать(
новый ЗапросПолнотекстовогоПоиска(
Запрос = Запрос,
ИндексСтраницы = 0,
РазмерСтраницы = 50)
)
// Заполнение массива найденных фрагментов текста
// c настройкой их представления
для Элемент из РезультатПоиска.Порция
знч Представление = РезультатПолнотекстовогоПоиска.ПостроитьПредставление(
ИсточникФрагментов = Элемент,
РазрывТекстаВСередине = "...",
РазделительСвойств = "<br/>")
МассивФрагментовТекста.Добавить(Представление)
;
возврат МассивФрагментовТекста
;
Поддержка актуальности индекса полнотекстового поиска
Чтобы поиск работал корректно, необходимо поддерживать индекс полнотекстового поиска в актуальном состоянии. Для этого необходимо добавлять в индекс новую информацию (новые объекты информационной базы), удалять устаревшие данные (которые располагались в удаленных объектах) и обновлять сведения об измененных объектах информационной базы.
Для работы с полнотекстовым индексом в «1С:Шине» предусмотрены следующие методы типа ПолнотекстовыйПоиск:
ИндексАктуален()— возвращаетИстина, если поисковый индекс актуален, то есть он существует, полностью построен и соответствует текущему состоянию данных приложения.ИндексБылАктуален()— возвращаетИстина, если были проиндексированы данные хотя бы по одному событию, которое появилось в логе изменений за последний период. Данный метод рекомендуется использовать, если поисковый индекс меняется слишком часто.КоличествоИзменений()— возвращает количество непроиндексированных изменений на текущий момент времени.ПерестроитьИндекс()— запускает фоновое задание для полного перестроения поискового индекса.ПолучитьТекущуюТочкуИзменений()— возвращает точку в логе изменений полнотекстового поиска на текущий момент времени.ЖдатьЗавершенияОбновленияИндекса()— ожидает обновления индексной базы до момента, обозначенного параметромТочкаИзменений.
Пример 1. Перестроение индекса полнотекстового поиска:
@НаСервере @ДоступноСКлиента
статический метод ПерестроитьПолнотекстовыйИндекс()
ПолнотекстовыйПоиск.ПерестроитьИндекс()
;
Пример 2. Полное обновление индекса полнотекстового поиска:
@НаСервере @ДоступноСКлиента
статический метод ОбновитьПолнотекстовыйИндекс()
знч Точка = ПолнотекстовыйПоиск.ПолучитьТекущуюТочкуИзменений()
пока не ПолнотекстовыйПоиск.ЖдатьЗавершенияОбновленияИндекса(Точка, 5с)
;
;
По умолчанию обновление полнотекстового индекса происходит автоматически при внесении изменений в приложение. Ручное обновление индекса может потребоваться, если, например, в кластере серверов запрещен автозапуск фоновых заданий.