Перейти к основному содержимому

Полнотекстовый поиск

Полнотекстовый поиск данных — это инструмент «1С:Исполнителя», позволяющий выполнять поиск записей в базе данных по их текстовым представлениям.

Механизм полнотекстового поиска включает:

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

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

Включение настройки «Автозапуск запланированных заданий»

По умолчанию «1С:Исполнитель» индексирует следующие объекты:

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

Выполнение полнотекстового поиска

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

Для выполнения полнотекстового поиска вызовите метод Искать() и укажите поисковое выражение в виде строки или экземпляра структуры ЗапросПолнотекстовогоПоиска. Вы также можете настроить результаты поиска и задать область поиска.

Пример поиска по справочнику Сотрудники:

@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(СтрокаПоиска: Строка): ЧитаемыйМассив<Сущность.Ключ>
возврат ПолнотекстовыйПоиск.Искать(ПоисковыйЗапрос = СтрокаПоиска, ИндексСтраницы = 0,
РазмерСтраницы= 50, ОбластьПоиска = [Тип<Сотрудники.Ссылка>])
;

Настройки результатов полнотекстового поиска

Чтобы настроить результаты поиска, используйте свойства типа НастройкиРезультатаПолнотекстовогоПоиска:

@НаСервере @ДоступноСКлиента
статический метод ВыполнитьПоиск(Запрос: Строка): Массив<Строка>
// Настройка результатов полнотекстового поиска
знч НастройкиРезультата = новый НастройкиРезультатаПолнотекстовогоПоиска(
ПолучатьЗаголовки = Истина,
ПолучатьФрагменты = Истина,
НастройкиФрагментов = новый НастройкиФрагментовПолнотекстовогоПоиска(
ВидФрагмента = ВидФрагментаПолнотекстовогоПоиска.Html,
МаксимальноеКоличествоФрагментов = 10,
РазмерФрагмента = 150,
ОткрывающийТег = "<strong>",
ЗакрывающийТег = "</strong>"))

знч МассивФрагментовТекста = <Строка>[]

// Выполнение поиска с заданными настройками
знч РезультатПоиска = ПолнотекстовыйПоиск.Искать(
новый ЗапросПолнотекстовогоПоиска(
Запрос = Запрос,
ИндексСтраницы = 0,
РазмерСтраницы = 50),
НастройкиРезультата)

// Заполнение массива найденных фрагментов текста
для Элемент из РезультатПоиска.Порция
МассивФрагментовТекста.Добавить(Элемент.Представление())
;

возврат МассивФрагментовТекста
;

Представление результатов полнотекстового поиска

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

  • Собраны в стандартное представление с помощью метода Представление() типа ЭлементРезультатаПолнотекстовогоПоиска. По умолчанию составной фрагмент оформляется так:

    • Все разрывы фрагментов обозначаются троеточием ....
    • Табличные части выводятся в сокращенном виде: Представление: ...Вхождение1... ...Вхождение2....
    • Если запись найдена по основному тексту, среди фрагментов будут свойства с выделенными (подсвеченными) вхождениями.
    • Если запись найдена не по основному тексту, тогда выводятся несколько первых наиболее приоритетных свойств без выделения вхождений.
  • Разделены по свойствам: будет заполнен массив ЭлементРезультатаПолнотекстовогоПоиска.ФрагментыПоСвойствам. В одном свойстве может быть более одного текстового фрагмента. Фрагмент может быть полным значением свойства. Вместе с фрагментом также предоставляется список вхождений.

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

    @НаСервере @ДоступноСКлиента
    статический метод ВыполнитьПоиск(Запрос: Строка): Массив<Строка>
    знч МассивФрагментовТекста = <Строка>[]

    // Выполнение поиска
    знч РезультатПоиска = ПолнотекстовыйПоиск.Искать(
    новый ЗапросПолнотекстовогоПоиска(
    Запрос = Запрос,
    ИндексСтраницы = 0,
    РазмерСтраницы = 50)
    )

    // Заполнение массива найденных фрагментов текста
    // c настройкой их представления
    для Элемент из РезультатПоиска.Порция
    знч Представление = РезультатПолнотекстовогоПоиска.ПостроитьПредставление(
    ИсточникФрагментов = Элемент,
    РазрывТекстаВСередине = "...",
    РазделительСвойств = "<br/>")
    МассивФрагментовТекста.Добавить(Представление)
    ;

    возврат МассивФрагментовТекста
    ;

Поддержка актуальности индекса полнотекстового поиска

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

Для работы с полнотекстовым индексом в «1С:Исполнителе» предусмотрены следующие методы типа ПолнотекстовыйПоиск:

  • ИндексАктуален() — возвращает Истина, если поисковый индекс актуален, то есть он существует, полностью построен и соответствует текущему состоянию данных приложения.
  • ИндексБылАктуален() — возвращает Истина, если были проиндексированы данные хотя бы по одному событию, которое появилось в логе изменений за последний период. Данный метод рекомендуется использовать, если поисковый индекс меняется слишком часто.
  • КоличествоИзменений() — возвращает количество непроиндексированных изменений на текущий момент времени.
  • ПерестроитьИндекс() — запускает фоновое задание для полного перестроения поискового индекса.
  • ПолучитьТекущуюТочкуИзменений() — возвращает точку в логе изменений полнотекстового поиска на текущий момент времени.
  • ЖдатьЗавершенияОбновленияИндекса() — ожидает обновления индексной базы до момента, обозначенного параметром ТочкаИзменений.

Пример 1. Перестроение индекса полнотекстового поиска:

@НаСервере @ДоступноСКлиента
статический метод ПерестроитьПолнотекстовыйИндекс()
ПолнотекстовыйПоиск.ПерестроитьИндекс()
;

Пример 2. Полное обновление индекса полнотекстового поиска:

@НаСервере @ДоступноСКлиента
статический метод ОбновитьПолнотекстовыйИндекс()
знч Точка = ПолнотекстовыйПоиск.ПолучитьТекущуюТочкуИзменений()
пока не ПолнотекстовыйПоиск.ЖдатьЗавершенияОбновленияИндекса(Точка, )
;
;

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