Полнотекстовый поиск - это неоднозначная вещь...
Он используется как в динамических списках, так и в глобальном поиске:
Результаты полнотекстового поиска возвращаются порциями, и, кроме этого, они отсортированы в определенном порядке. Это сделано для того, чтобы с большой долей вероятности пользователь получал требуемые ему данные в начале первой порции.
Поиск хорошо работает при соблюдении следующих обстоятельств:
- Полнотекстовый индекс должен обслуживаться должным образом: сначала его создаем, а потом по регламенту обновляем индекс (не забыть настроить регл. задания).
- Поиск выполняется по колонкам, которые отображаются в таблице динамического списка.
- Если в динамическом списке есть связь с другими таблицами, то эти таблицы тоже должны быть проиндексированы.
- Поиск по ссылочным полям выполняется по полям представления, которые также должны быть добавлены в полнотекстовый индекс.
Это основные условия. Есть еще и другие нюансы, например проблемы совместимости платформы и конфигурации.
Если эти условия не выполняются, то полнотекстовый поиск не работает и система ищет данные сложным запросом методами SQL.
Так же не стоит забывать, что при использовании отборов типа "ПОДОБНО" индексы не используются, так что если ищут в основном по названиям, то полнотекстовый поиск не особо поможет.
Даже если полнотекстовый поиск настроен корректно, то поиск будет работать в пределах построенного индекса, который обновляется по расписанию, т.е. если интервал обновления большой, то только что созданный документ можем быть не найден. Еще документы могут не попадать в поиск, если при аварийном закрытии 1С сломался индекс и, при этом, продолжает обновляться, т.е. вроде как работает, но вроде как и нет.
Имеет смысл серьезно подумать над тем, нужно ли его использовать...
Если все-таки решились, то надо сделать соответствующие настройки:
В полнотекстовый поиск входят объекты, у которых свойство "Полнотекстовый поиск" = "Использовать" (на закладке Прочее). Данное свойство имеют не только объекты, но и их реквизиты. По умолчанию для новых реквизитов и объектов это свойство устанавливается в значение Использовать.
Полнотекстовый поиск может быть использован в поиске при вводе по строке.
Настроить параметры поиска при вводе по строке можно на закладке Поле ввода окна редактирования объектов конфигурации, которые используются в прикладном решении в качестве ссылочных полей. При этом можно настроить свойства:
- Способ поиска строки (по умолчанию – Начало),
- Полнотекстовый поиск (по умолчанию – Не использовать)
- Режим получения данных выбора (по умолчанию – Непосредственно).
Возможность задействовать полнотекстовый поиск, а также возможность выполнять поиск фоновым заданием наиболее полезна при больших объемах данных.
Если база данных невелика, то можно не использовать полнотекстовый поиск, но при этом искать в любом месте поля ввода, а не только по началу строки (Способ поиска строки – Любая часть).
Структура индекса
Полнотекстовый индекс состоит из двух индексов: основного и дополнительного. При выполнении полнотекстового поиска поиск осуществляется как в одном, так и в другом индексе. Отличие их заключается в следующем.
Основной индекс спроектирован так, чтобы обеспечивать максимальную скорость поиска при большом объеме данных. Однако оборотной стороной этого является то, что добавление данных в основной индекс осуществляется относительно медленно.
Дополнительный индекс является полной противоположностью основному: добавление данных в дополнительный индекс осуществляется быстро, однако при значительном объеме данных в дополнительном индексе поиск будет выполняться относительно медленно.
Наличие основного и дополнительного индексов предполагает следующую стратегию их использования. Основная масса данных находится в основном индексе, что позволяет выполнять поиск достаточно быстро. Новые данные, измененные или добавленные в систему, добавляются в дополнительный индекс непосредственно в процессе работы пользователей с требуемой периодичностью (например, раз в час или раз в минуту). Такое добавление происходит быстро и оказывает незначительное влияние на производительность системы. Пока объем данных в дополнительном индексе невелик, поиск по нему также выполняется быстро.
В период малой активности пользователей или в период выполнения регламентных действий с информационной базой (например, ночью) выполняется слияние основного и дополнительного индекса (например, раз в сутки). Эта операция может оказывать видимую нагрузку на систему или занимать продолжительное время (в зависимости от накопленных данных). В результате новые данные помещаются в основной индекс, а дополнительный индекс при этом очищается и готов к быстрому приему следующих данных.
Таким образом, чтобы пользователи могли искать во всех данных и не ощущали какого-либо замедления работы системы, дополнительный индекс необходимо обновлять относительно часто (например, раз в час или раз в минуту). В то же время чтобы пользователи выполняли поиск быстро, необходимо, чтобы дополнительный индекс содержал как можно меньше данных, т. е. нужно периодически выполнять слияние основного и дополнительного индексов (например, ночью, в период минимальной активности пользователей).
В результате для автоматизации полнотекстового индексирования нам понадобится два задания. Первое задание будет выполнять индексирование без слияния и запускаться каждую минуту (интервал требует уточнения для исключения перегрузки системы). Второе будет выполнять слияние индексов и запускаться один раз в сутки, ночью.
Интерактивное построение полнотекстового индекса
Для интерактивного управления индексом нужно выполнить команду главного меню приложения Все функции > Стандартные > Управление полнотекстовым поиском
По умолчанию все возможные объекты входят в полнотекстовый поиск и включена возможность использования поиска, но индекс по умолчанию не создается, так как этот процесс может выполняться достаточно длительное время.
В форме управления полнотекстовым поиском можно Обновить индекс. Если ранее индекс не был создан, то эта операция приведет к его созданию. После обновления индекса на форме будет обновлена дата актуальности индекса.
Программное обновление индекса
Нам потребуется 2 регламентных задания: первое - обновление дополнительного индекса, второе - слияние индексов.
Настроим первое регламентное задание на обновление индекса без слияния (дополнительный индекс):
Процедура ОбновлениеИндекса() Экспорт
Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
ПолнотекстовыйПоиск.ОбновитьИндекс( , Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Пояснения:
Сначала проверяем разрешен ли полнотекстовый поиск.
Потом проверяем актуальность данных: если после последнего индексирования данные, подлежащие полнотекстовому индексированию, не изменялись, то индекс будет актуален и повторное индексирование не требуется.
В случае необходимости индексирования вызывается метод ОбновитьИндекс() менеджера полнотекстового поиска.
Первый параметр этого метода отвечает за слияние индексов и по умолчанию имеет значение Ложь. Это значит, что слияние индексов выполняться не будет.
Второй параметр метода определяет, какое количество данных будет индексироваться: сразу все, которые необходимо проиндексировать, или порциями. Наша задача – выполнить индексирование как можно быстрее, поэтому указываем, что индексирование будет выполняться порциями (значение Истина).
Размер одной порции фиксирован – 10 000 объектов. Таким образом, если в данный момент требуется проиндексировать, например, 15 000 объектов, то при вызове этого метода из них будет проиндексировано только 10 000 (первая порция), а оставшиеся объекты будут проиндексированы при следующем вызове этого метода (при следующем запуске нашего регламентного задания).
Второе регламентное задание будет задание по слиянию индексов. Текст процедуры будет почти таким же:
Процедура СлияниеИндексов() Экспорт
Если ПолнотекстовыйПоиск.ПолучитьРежимПолнотекстовогоПоиска() = РежимПолнотекстовогоПоиска.Разрешить Тогда
Если Не ПолнотекстовыйПоиск.ИндексАктуален() Тогда
ПолнотекстовыйПоиск.ОбновитьИндекс(Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Отличие в параметрах метода ПолнотекстовыйПоиск.ОбновитьИндекс:
- Первый параметр равен Истина, что говорит о том, что надо выполнить слияние
- Второй параметр = Ложь (по умолчанию)
Более подробно о полнотекстовом поиске можно почитать здесь: https://infostart.ru/1c/articles/1278933/, https://infostart.ru/1c/articles/1056842/
|