Приветствую Вас ГостьСреда, 08.05.2024, 03:49

Каталог статей


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

Полнотекстовый поиск - это неоднозначная вещь...

Он используется как в динамических списках, так и в глобальном поиске:

Результаты полнотекстового поиска возвращаются порциями, и, кроме этого, они отсортированы в определенном порядке. Это сделано для того, чтобы с большой долей вероятности пользователь получал требуемые ему данные в начале первой порции.

Поиск хорошо работает при соблюдении следующих обстоятельств:

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

Это основные условия. Есть еще и другие нюансы, например проблемы совместимости платформы и конфигурации. 

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

Так же не стоит забывать, что при использовании отборов типа "ПОДОБНО" индексы не используются, так что если ищут в основном по названиям, то полнотекстовый поиск не особо поможет.

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

Имеет смысл серьезно подумать над тем, нужно ли его использовать...

Если все-таки решились, то надо сделать соответствующие настройки:

В полнотекстовый поиск входят объекты, у которых свойство "Полнотекстовый поиск" = "Использовать" (на закладке Прочее). Данное свойство имеют не только объекты, но и их реквизиты. По умолчанию для новых реквизитов и объектов это свойство устанавливается в значение Использовать.

Полнотекстовый поиск может быть использован в поиске при вводе по строке.

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

  • Способ поиска строки (по умолчанию – Начало), 
  • Полнотекстовый поиск (по умолчанию – Не использовать)
  • Режим получения данных выбора (по умолчанию – Непосредственно).

Возможность задействовать полнотекстовый поиск, а также возможность выполнять поиск фоновым заданием наиболее полезна при больших объемах данных.

Если база данных невелика, то можно не использовать полнотекстовый поиск, но при этом искать в любом месте поля ввода, а не только по началу строки (Способ поиска строки – Любая часть).

Структура индекса

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

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

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

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

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

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

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

Интерактивное построение полнотекстового индекса 

Для интерактивного управления индексом нужно выполнить команду главного меню приложения Все функции > Стандартные > Управление полнотекстовым поиском

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

В форме управления полнотекстовым поиском можно Обновить индекс. Если ранее индекс не был создан, то эта операция приведет к его созданию. После обновления индекса на форме будет обновлена дата актуальности индекса.

Программное обновление индекса

Нам потребуется 2 регламентных задания: первое - обновление дополнительного индекса, второе - слияние индексов.

Настроим первое регламентное задание на обновление индекса без слияния (дополнительный индекс):

Процедура ОбновлениеИндекса() Экспорт
    
    Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
        Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
            ПолнотекстовыйПоиск.ОбновитьИндекс( , Истина);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
 

Пояснения:

Сначала проверяем разрешен ли полнотекстовый поиск.

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

В случае необходимости индексирования вызывается метод ОбновитьИндекс() менеджера полнотекстового поиска.

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

Второй параметр метода определяет, какое количество данных будет индексироваться: сразу все, которые необходимо проиндексировать, или порциями. Наша задача – выполнить индексирование как можно быстрее, поэтому указываем, что индексирование будет выполняться порциями (значение Истина).

Размер одной порции фиксирован – 10 000 объектов. Таким образом, если в данный момент требуется проиндексировать, например, 15 000 объектов, то при вызове этого метода из них будет проиндексировано только 10 000 (первая порция), а оставшиеся объекты будут проиндексированы при следующем вызове этого метода (при следующем запуске нашего регламентного задания).

Второе регламентное задание будет задание по слиянию индексов. Текст процедуры будет почти таким же:

Процедура СлияниеИндексов() Экспорт
    
    Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
        Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
            ПолнотекстовыйПоиск.ОбновитьИндекс(Истина);
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
 

Отличие в параметрах метода  ПолнотекстовыйПоиск.ОбновитьИндекс:

  • Первый параметр равен Истина, что говорит о том, что надо выполнить слияние
  • Второй параметр = Ложь (по умолчанию)

Более подробно о полнотекстовом поиске можно почитать здесь: https://infostart.ru/1c/articles/1278933/https://infostart.ru/1c/articles/1056842/

 

 

Категория: Администрирование | Добавил: leshic (17.02.2022)
Просмотров: 312 | Рейтинг: 0.0/0
Всего комментариев: 0
Имя *:
Email *:
Код *:
Вход на сайт
Поиск
Категории раздела
СКД [48]
Регистры [7]
Формы [40]
Администрирование [35]
Запросы [10]
Объекты конфигурации и типы данных [20]
Взаимодействие с другими базами, приложениями и источниками данных [16]
Программирование [29]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0