Всем привет
Всем привет. Так уж получилось, что в 2023 году мне снова удалось поработать с технологиями о которых в мире 1С, в частности на инфостарте, совсем нет информации. Поэтому хочу немного рассказать о своем опыте работы с Manticore Search.
Проблема
Проблема возникла при работе над проектом разработки бэкенда для мобильного приложения. Очень коротко о цели проекта: необходимо разработать конфигурацию, которая будет иметь в себе легковесные копии необходимых объектов основной конфигурации (Управление торговлей 11.x) и предоставлять HTTP API для работы мобильных клиентов.
Поступила задача создать метод для реализации подсказки ввода в поисковой строке. Суть следующая: при вводе текста в строку поиска (это может быть слово, или фраза), мобильный клиент отправляет запрос к бэкенду с содержанием поисковой строки и получает в ответ список первых N подходящих результатов.
Задача, на первый взгляд, звучит просто, но есть несколько нюансов, которые все усложняют:
- Поиск должен осуществляться по нескольким полям (наименование, код, артикул и т.д.)
- Фраза может быть в любой части искомых полей. Например, в результат поиска по фразе "Корм для кошек" должна попасть позиция с именем "Сухой корм Pro Plan Sterilised для стерилизованных кошек и котов, с кроликом, 10 кг"
- Ответ от сервера должен быть максимально быстрый. Приемлемое время формирования сообщения, без учета транспорта, должно быть не более 100 мс. Это необходимо для обеспечения комфортной работы мобильного клиента.
Вариант решения с помощью конструкции ПОДОБНО + % сразу отбросим, так как этот вариант далеко не самый быстрый да и куча проблем с многословными фразами. Поэтому, для решения этой проблемы, нужна система полнотекстового поиска, желательно с HTTP API для удобной и простой интеграции с 1С.
После некоторого поиска на просторах интернета я нашел несколько вариантов, которые, должны помочь решить мою проблему:
Elasticsearch
Очень известный Open Source продукт. Большой, мощный, нафиг не нужный. Сложная настройка, тянет за собой в нагрузку много других, не нужных для меня инструментов. Для каких-то больших проектов, возможно, лучшее решение, но в моей ситуации - это, скорее, лишняя трата времени.
Sphinx 3.x
3-я итерация поискового движка Sphinx. На официальном сайте утверждается, что он является Open Source Search Server, но ссылки на GitHub я не нашел. Есть открытая версия Sphinx 2.x, но этот проект не поддерживается с 2018 года, поэтому рассматривать его не вижу смысла.
Из плюсов:
- довольно легковесное решение
- на вид достаточно просто настраивается
- есть документация с примерами
Изначально я рассматривал именно это решение, пока не наткнулся на Manticore Search.
Manticore Search
Open Source продукт (есть ссылка на GitHub). По сути своей является форком от Sphinx 2.x который пошел по своей дороге.
Плюсы такие же как и у Sphinx 3.x, только есть исходный код в свободном доступе.
Трудно сказать, что именно повлияло на мой выбор в пользу именно этого инструмента. Скорее внешний вид главной страницы продукта и его документация (чем то напомнили мне стиль продуктов Grafana, к которым я испытываю теплые чувства, см. Как я мониторинг разворачивал). Ну и, возможно, несколько прочтенных статей на хабре. Например Manticore — альтернатива Эластику на C++ с 21-летней историей и Андрей Карпов считает, что код проекта Manticore качественнее, чем код проекта Sphinx.
Как это работает
Я разворачивал Manticore Search с помощью docker compose. Это, по моему мнению, самый простой и быстрой способ. Вообще Manticore Search имеет кучу способов установки для любой ОС. Все варианты можно найти тут.
Мой docker-compose.yml такой же как в официальной документации с незначительными отличиями в разделе портов. Порт интерфейса MySQL 9306 мне не нужен, поэтому я его убрал.
Дальнейшая работа с Manticore Search проходит следующим образом (всё взаимодействие можно осуществлять через HTTP API):
- Создать таблицу с описанием полей для полнотекстового индекса.
- Заполнить таблицу "документами" и обновлять/удалять их по мере изменения данных.
- Выполнять запросы поиска по правилам, описанным в документации.
Интеграция с 1С
В архиве, приложенном к статье, реализована демо интеграция с простым примером использования. Для разработки использовалась свежая платформа 8.3.23.
Ее код я старался делать максимально пригодным для встраивания в любую систему. Интеграция очень свежая и еще только проходит путь тестирования, поэтому могут быть скрытые проблемы, которые пока еще не выявлены. Так же, если вам требуется больший функционал, то вы можете доработать мой код самостоятельно или вообще написать свою интеграцию.
Подсистема Manticore состоит из следующих элементов:
Настройка осуществляется заполнением константы АдресСервераManticore и включением константы ИспользоватьManticore.
Регистр сведений СоответствиеИдентификаторовManticore служит для хранения соответствия идентификаторов, возвращаемых Manticore, с ссылками объектов 1С указанных в составе типов определяемого типа ОбъектManticore.
Регистр сведений ОчередьОтправкиManticore служит для добавления объектов 1С указанных в составе типов определяемого типа ОбъектManticore в очередь для дальнейшей отправки в Manticore.
Подписка на событие ДобавитьВОчередьОтправкиManticore добавляет объекты 1С указанные в составе типов определяемого типа ОбъектManticoreОбъект в регистр сведений ОчередьОтправкиManticore.
Регламентное задание ОтправкаОбъектовВManticore выполняет две задачи:
- Создает таблицы по настройкам, определенным в общем модуле ManticoreПереопределяемый.
- Получает объекты 1С из регистра сведений ОчередьОтправкиManticore. Преобразовывает их в "документы Manticore" и создает или обновляет добавляя при этом связи в регистр сведений СоответствиеИдентификаторовManticore.
Для добавления какого либо объекта метаданных, например номенклатуры, в объекты выгрузки необходимо выполнить следующее:
- Добавить ссылочный тип в состав типов определяемого типа ОбъектManticore.
- Добавить объектный тип объекта в состав типов определяемого типа ОбъектManticoreОбъект.
- В процедуре ПриОпределенииНастроекИнтеграцииManticore(НастройкиИнтеграцииManticore) общего модуля ManticoreПереопределяемый добавить элемент настройки для объекта метаданных.
Выполнение поиска осуществляется вызовом функции Manticore.Поиск(ОбъектМетаданных, СтрокаПоиска, Лимит, Смещение)
Так же при встраивании подсистемы не забудьте добавить ее объекты в базовые права. Или создайте необходимые роли удовлетворяющие требованиям вашей системы.
Демонстрация работы
Пример работы обработчика авто подбора из демо.
Итог
На изучение документации и реализации первой рабочей версии интеграции с 1С я потратил около 4-х дней. Поэтому считаю, что Manticore Search отличная система полнотекстового поиска с относительно низким порогом вхождения и возможностью быстрой развертки и интеграции.
При этом она имеет огромное количество настроек для тонкого конфигурирования и множество дополнительных возможностей для реализации более узких задач.
P.S.
Я специально не затрагивал все возможности использования Manticore Search. Так как в ней имеется куча инструментов и настроек для описания которых не хватит формата статьи. Все эти возможности можно изучить в официальной документации.
Относительно высокая цена за демку указана ввиду моих больших стараний. В общем и целом я очень подробно описал схему интеграции. Поэтому вы можете реализовать её самостоятельно, без моего участия.