Кто такая Мантикора?

07.03.24

Задачи пользователя - Поиск данных

Статья об опыте развертывания и интеграции с базой данных Manticore Search для быстрого полнотекстового поиска.

Скачать исходный код

Наименование Файл Версия Размер
Demo
.zip 37,35Mb
3
.zip 1.0.0.1 37,35Mb 3 Скачать

Всем привет

Всем привет. Так уж получилось, что в 2023 году мне снова удалось поработать с технологиями о которых в мире 1С, в частности на инфостарте, совсем нет информации. Поэтому хочу немного рассказать о своем опыте работы с Manticore Search.

 

Проблема

Проблема возникла при работе над проектом разработки бэкенда для мобильного приложения. Очень коротко о цели проекта: необходимо разработать конфигурацию, которая будет иметь в себе легковесные копии необходимых объектов основной конфигурации (Управление торговлей 11.x) и предоставлять HTTP API для работы мобильных клиентов.

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

Задача, на первый взгляд, звучит просто, но есть несколько нюансов, которые все усложняют:

  1. Поиск должен осуществляться по нескольким полям (наименование, код, артикул и т.д.)
  2. Фраза может быть в любой части искомых полей. Например, в результат поиска по фразе "Корм для кошек" должна попасть позиция с именем "Сухой корм Pro Plan Sterilised для стерилизованных кошек и котов, с кроликом, 10 кг"
  3. Ответ от сервера должен быть максимально быстрый. Приемлемое время формирования сообщения, без учета транспорта, должно быть не более 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 мне не нужен, поэтому я его убрал.

 
 docker-compose.yml

Дальнейшая работа с Manticore Search проходит следующим образом (всё взаимодействие можно осуществлять через HTTP API):

  1. Создать таблицу с описанием полей для полнотекстового индекса.
  2. Заполнить таблицу "документами" и обновлять/удалять их по мере изменения данных.
  3. Выполнять запросы поиска по правилам, описанным в документации.

 

Интеграция с 1С

В архиве, приложенном к статье, реализована демо интеграция с простым примером использования. Для разработки использовалась свежая платформа 8.3.23

Ее код я старался делать максимально пригодным для встраивания в любую систему. Интеграция очень свежая и еще только проходит путь тестирования, поэтому могут быть скрытые проблемы, которые пока еще не выявлены. Так же, если вам требуется больший функционал, то вы можете доработать мой код самостоятельно или вообще написать свою интеграцию.

Подсистема Manticore состоит из следующих элементов:

 

Настройка осуществляется заполнением константы АдресСервераManticore и включением константы ИспользоватьManticore.

Регистр сведений СоответствиеИдентификаторовManticore служит для хранения соответствия идентификаторов, возвращаемых Manticore, с ссылками объектов 1С указанных в составе типов определяемого типа ОбъектManticore.

Регистр сведений ОчередьОтправкиManticore служит для добавления объектов 1С указанных в составе типов определяемого типа ОбъектManticore в очередь для дальнейшей отправки в Manticore.

Подписка на событие ДобавитьВОчередьОтправкиManticore добавляет объекты 1С указанные в составе типов определяемого типа ОбъектManticoreОбъект в регистр сведений ОчередьОтправкиManticore.

Регламентное задание ОтправкаОбъектовВManticore выполняет две задачи:

  1. Создает таблицы по настройкам, определенным в общем модуле ManticoreПереопределяемый.
  2. Получает объекты 1С из регистра сведений ОчередьОтправкиManticore. Преобразовывает их в "документы Manticore" и создает или обновляет добавляя при этом связи в регистр сведений СоответствиеИдентификаторовManticore.

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

  1. Добавить ссылочный тип  в состав типов определяемого типа ОбъектManticore.
  2. Добавить объектный тип объекта в состав типов определяемого типа ОбъектManticoreОбъект.
  3. В процедуре ПриОпределенииНастроекИнтеграцииManticore(НастройкиИнтеграцииManticore) общего модуля ManticoreПереопределяемый добавить элемент настройки для объекта метаданных.

 

Выполнение поиска осуществляется вызовом функции Manticore.Поиск(ОбъектМетаданных, СтрокаПоиска, Лимит, Смещение)

 

Так же при встраивании подсистемы не забудьте добавить ее объекты в базовые права. Или создайте необходимые роли удовлетворяющие требованиям вашей системы.

 

Демонстрация работы

Пример работы обработчика авто подбора из демо.

 

Итог

На изучение документации и реализации первой рабочей версии интеграции с 1С я потратил около 4-х дней. Поэтому считаю, что Manticore Search отличная система полнотекстового поиска с относительно низким порогом вхождения и возможностью быстрой развертки и интеграции.

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

 

P.S.

Я специально не затрагивал все возможности использования Manticore Search. Так как в ней имеется куча инструментов и настроек для описания которых не хватит формата статьи. Все эти возможности можно изучить в официальной документации.

Относительно высокая цена за демку указана ввиду моих больших стараний. В общем и целом я очень подробно описал схему интеграции. Поэтому вы можете реализовать её самостоятельно, без моего участия.

manticore manticoresearch мантикора поиск поиск данных

См. также

Быстрый поиск дублей с четким/нечетким поиском по любому сочетанию реквизитов/реквизитов таб. частей с отбором и быстрой заменой значений в ЛЮБЫХ базах 8.1-8.3 (УТ 10.3, БП 2, ЗУП 2.5, КА 1.1, УТ 11, БП 3, УНФ 1.6/3.0, КА 2, ЗУП 3 и т.д.)

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Платные (руб)

Обработки помогут Вам легко и, главное, быстро (в 5 раз и быстрее штатной обработки 1С), выполнить поиск дублирующих данных в Ваших базах 1С на платформах 8.1-8.3. Это позволит уменьшить объем лишней информации в справочниках и документах, планах видов характеристик и др., упростит работу с данными пользователям. А так же можно, одним нажатием, узнать в каких ссылочных объектах есть вообще дубли! Понятное расположение команд и настроек, в сочетании с описанием и справкой, еще упростят процесс. А так же обновления Вы получаете бесплатно в течение года с момента приобретения данных обработок! (Обновление от 27.11.2023, версия 6.12)

10800 руб.

14.05.2012    156016    327    252    

559

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

21600 руб.

15.05.2017    42689    10    24    

38

PowerOffice

Поиск данных Корректировка данных Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

PowerOffice - обработка для поиска, просмотра и обработки данных для пользователей. Доступ к объектам на просмотр и редактирование данных определяется правами пользователя.

1 стартмани

05.06.2023    1995    23    PowerBoy    1    

15

Получение ссылки по бинарной строке PostgreSQL или MSSQL

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

Получение ссылки в 1С по бинарной строке из PostgreSQL в виде строки формата bytea или из MSSQL в виде шестнадцатиричной строки. Кроме ссылочных объектов ссылки могут быть получены и для перечислений. Это может быть полезно при анализе логов журнала регистрации или СУБД.

1 стартмани

04.04.2023    2661    2    berserg    2    

12

Поиск документов с ошибками проведения, универсальный

Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Абонемент ($m)

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

1 стартмани

18.08.2022    3045    24    KVIKS    3    

10

Поиск и замена значений + Поиск дублирующихся элементов справочников с подключением к внешней базе

Поиск данных Корректировка данных Платформа 1С v8.3 Управляемые формы Платформа 1C v8.2 Конфигурации 1cv8 Платные (руб)

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

3600 руб.

30.03.2022    8627    3    0    

5
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. JohnyDeath 301 30.11.23 10:55 Сейчас в теме
Интересно.
Под капотом, на сколько я понял, MySql и его полнотекстовый поиск "MATCH".
Не смотрели в сторону sqlite и его реализации полнотекстового поиска
Пример: https://blog-programmista.ru/post/45-polnotekstovyj-poisk-v-sqlite.html
Саму базу sqlite можно держать в одном файлике и подрубать с помощью ВК от Александра Орефкова

Мне просто интересны результаты на одинаковых данных. Если они примерно равны, то, думаю, можно будет посмотреть и в сторону более легковесного решения.
prior; andreysidor4uk; +2 Ответить
2. andreysidor4uk 194 30.11.23 11:22 Сейчас в теме
(1) Увы не смотрел и даже не знал =) Если бы наткнулся, то возможно бы рассмотрел предложенный вами вариант.

Но в общем и целом сама Мантикора довольно лёгкая и не требует много ресурсов, плюс довольна проста в освоении, имеет удобное API и ряд дополнительных приятных функций для хорошего поиска. Например подключение морфологических словарей, леммизаторов и т.д.
5. JohnyDeath 301 30.11.23 17:48 Сейчас в теме
(2) смастерил обработку, которая выполняет нечеткий поиск по номенклатуре через v8sqlite.
Будет интересно посмотреть на результаты сравнения с вашими данными. У меня просто и номенклатуры не много и зверя из топика не стоит.
В самой обработке нужно:
1. выбрать каталог, где будет создан файл БД sqlite
2. Нажать "Подключить" (подключение ВК и подключение к БД)
3. Нажать "Заполнить". При этом БД sqlite заполняется данными наименования и кода из справочника "Номенклатуры"
4. Пробовать нечеткий поиск в реквизите "Строка поиска". Поиск начинает срабатывать только после ввода 3-го символа.

Ранее заполненную БД sqlite повторно можно не заполнять, а просто подключаться и работать.
В обработке специально всё сделано "на клиенте"
Прикрепленные файлы:
sqlite_fts.epf
prior; mrChOP93; mszsuz; +3 Ответить
7. andreysidor4uk 194 30.11.23 20:41 Сейчас в теме
(5) Спасибо =) Сделал пару быстрых тестов с замерами:
Тест на демо базе, где около 500-та позиций показал, что интеграция с Manticore возвращает список первых 10ти элементов(уже преобразованных в 1Совские ссылки) за 10-14 мс. Sqlite за 1-3 мс.
На другой базе, где 64к позиций, интеграция с Manticore так же возвращает результат за 10-14 мс., а Sqlite уже за 9-12 мс.
Можно сделать вывод, что с ростом количества данных скорость будет падать. Плюс в обработке Sqlite прямые запросы сразу в нужную таблицу, без "интеграционных навесок", а они, думаю, добавят еще 2-3 мс. к результату.
Ну и Manticore, на первый взгляд, лучше ранжирует результаты запроса, но это на первый взгляд.
prior; mrChOP93; comptr; JohnyDeath; +4 Ответить
13. gaglo 06.12.23 10:09 Сейчас в теме
(2)
подключение морфологических словарей,

А есть ли морфология русского языка, готовая к подключению?
А вы ее попробовали?
Если я, конечно, правильно понял этот термин.
ИМХО, с включенной морфологией запрос "сухие корма" должен Возвратить результаты типа "сухой корм для котов и бабочек".
andreysidor4uk; +1 Ответить
14. andreysidor4uk 194 06.12.23 10:47 Сейчас в теме
(13) Да, из коробки есть словари для русского и многих других языков. Ссылка на доку
У меня подключены типовые русские словари, но их работу не проверял.
Сделал сейчас быстрый тест. С окончаниями работает хорошо, но Ваш пример не прошел, возможно требуется дополнительная настройка. Уверен, что этот вопрос можно решить.
У меня еще стоит задача сделать, что бы корректно работало с ошибками в словах, например запрос по слову "лапатка" должен содержать в себе позиции с именем "лопатка". Мантикора поддерживает такую функциональность, но для этого надо приложить некоторые усилия. Полагаю, что вместе с этой задачей решу и проблему с морфологией. Но это задача не приоритетная. Поэтому решу вопрос, скорее всего, уже в начале следующего года. Постараюсь отписаться по этому поводу.
prior; gaglo; +2 Ответить
3. SerVer1C 764 30.11.23 13:23 Сейчас в теме
(1) SQLite больше подходит именно для хранения и редкой выборки данных. Мне кажется, он не выдержит множество запросов одновременно.
andreysidor4uk; +1 Ответить
4. JohnyDeath 301 30.11.23 13:37 Сейчас в теме
(3) SQLite как раз-таки создавался для частой и быстрой выборки (есть, кстати, опция создания БД в памяти).
А вот для частой вставки он не годится. Но в данной задаче, насколько я её понял, нужно много и часто читать и редко вставлять.
andreysidor4uk; +1 Ответить
10. ningauble 01.12.23 03:12 Сейчас в теме
(1) Под капотом там оригинальный поисковый полнотекстовый движок, написанный Андреем Аксёновым в проекте sphinx. Мантикора развивает эти идеи.
Но при этом, что сфинкс, что мантикора умеют работать по протоколу mysql, т.е. можно прицепиться стандартным клиентом и общаться с движком в формате sql, вплоть до обновления rt-индексов.
Krio2; JohnyDeath; +2 Ответить
6. unichkin 1565 30.11.23 20:41 Сейчас в теме
Общие модули начинать с латиницы - такое себе.. Зачем заставлять коллег ломать пальцы.
Опечатка в СоответствиеИдентификторовManticore
mrChOP93; JohnyDeath; andreysidor4uk; +3 Ответить
8. andreysidor4uk 194 30.11.23 20:48 Сейчас в теме
(6) С опечаткой спасибо)
По поводу латиницы - момент спорный. Я думаю пальцы 1Сника привыкли к таким историям вводя, например '&' или '<' или '>'.
9. unichkin 1565 01.12.23 00:24 Сейчас в теме
(8) да уж, и зачем себе люди раскладки ставят с вводом этих символов, непонятно, они же "привыкли"..
Могу сказать как человек который работает без приспособ позволяющих вводить спец. символы без переключения - это всегда неудобно.. И привыкнуть к такому нельзя.
Рекомендую от всей души заводить русский контекстный префикс в подобных случаях, и не мучить ни себя, ни того кто потом будет с этим работать.
Вижу по структуре, что поход библиотечный, и уже только это вызывает одобрение. Но мой посыл - раз уж делаете хорошо - делайте до конца.
Всем добра)
mrChOP93; Serg2000mr; andreysidor4uk; +3 Ответить
11. andreysidor4uk 194 01.12.23 07:17 Сейчас в теме
(9) Спасибо, ваш посыл мне очень даже понятен. Я руководствовался простой логикой, что если инструмент в оригинале называется Manticore, то и модули и все где он упоминается должно так называться. =))
Я сам тоже не пользуюсь "приспособами" для ввода этих символов, есть лишь пара автозамен, с которыми это логично выглядит (например БЮ -> <>). Я просто смирился с тем фактом, что нужно постоянно переключать раскладку для ввода спец. символов.
12. dammit666 15 01.12.23 07:42 Сейчас в теме
(11) Можно запомнить коды:
Alt+38="&"
Alt+60="<"
Alt+62=">"
и так далее
aleksey2; popov2000; andreysidor4uk; +3 Ответить
15. dimaster 39 22.03.24 10:23 Сейчас в теме
можно ли реализовать поиск по такой схеме (по артикулам аналогов):
аналоги в тч либо регистр сведений либо иная реализация

- товар1; артикул1
-- товар2Аналог1; артикул2
-- товар3Аналог2; артикул3

причем артикулы могут быть вообще разные, близко не похожие

пользователь начинает вбивать артикул, ему подбираются товары по похожим артикулам + аналоги этих товаров
16. andreysidor4uk 194 26.03.24 10:27 Сейчас в теме
(15) Не могу дать однозначный ответ. Но вообще система поиска довольно мощная, есть много фич для хитрого поиска, по этому я думаю, что вашу задачу решить возможно.
Оставьте свое сообщение