Доброго вечера!
Есть несколько микросервисов с разными БД. И поисковый сервис на мантикоре. Основной поиск идет по продуктам, который хранятся в БД 1, но так же есть необходимость искать по городу, который привязан к пользователю и хранится в БД 2.
Самое красивое, что приходит в голову, чтобы не дублировать данные о городах в продукты и потом их синхронизировать, это как-то добавить в индекс мантикоры данные о городах. Но сложность в том, что эти информация в другой БД.
Возможно ли каким-то образом сделать source с двумя БД или индекс по двум разным source?
Или же искать фильтрую по двум индексам одновременно?
Возможно ли каким-то образом сделать source с двумя БД
Да. Типа xmlpipe2, csvpipe или tsvpipe. Пишете небольшой скрипт, который делает то, что вам нужно, а на выходе даёт xml / csv или tsv.
индекс по двум разным source?
Да. Просто указываете 2 source в индексе. https://manual.manticoresearch.com/Creating_an_index/Local_indexes/Plain_and_real-time_index_settings#source
Сергей, спасибо большое за ответ!
Да. Типа xmlpipe2, csvpipe или tsvpipe. Пишете небольшой скрипт, который делает то, что вам нужно, а на выходе даёт xml / csv или tsv.
Я верно понимаю, что тут вы предлагаете сливать данные скриптом из двух БД в xml/csv а затем уже индексировать его?
Да. Просто указываете 2 source в индексе. Manticore Search Manual: Creating an index > Local indexes > Plain and real-time index settings
Вот этот способ выглядит привлекательнее… Не могли бы подсказать, как потом пользоваться таким индексом, в документации не смог найти ничего подобного.
Т.е. как по нему искать, когда у меня в source 1 основные данные, а в source 2 город? И надо отфильтровать данные из source 1 по городу (в обоих присутствует идентификатор пользователя)…
Может быть все на самом деле проще, но не могу посмотреть что в итоге получается индексе… При указании в индексе двух индексатор падает вот с такой ошибкой:
ERROR: index 'products': attribute count mismatch (me=profileSource, in=productsSource, myattrs=4, inattrs=8).
Не подскажите от чего она может быть? По отдельности оба source индексируются нормально.
Конфиг такой:
source profileSource : configurationSourceProfiles{
sql_query_pre = SET @a := 1;
sql_query = \
SELECT \
@a := @a + 1 as sphinx_internal_id, \
profiles.id as profile_id, \
profiles.city_id as city_id \
FROM profiles
sql_attr_bigint = sphinx_internal_id
sql_attr_string = profile_id
sql_attr_string = city_id
}
source productsSource : configurationSourceMarketPlace{
sql_query_pre = SET @a := 1;
sql_query = \
SELECT \
@a := @a + 1 as sphinx_internal_id, \
products.id as product_id, \
products.url as url, \
products.title as title, \
product_prices.value as price, \
product_prices.price_type_id as price_type_id, \
products.owner_id as owner_id, \
products.status as status, \
products.published as published, \
( \
SELECT JSON_ARRAYAGG(CONCAT(PP.parameter_id, ":", IF(PP.value_id IS NULL, PP.value, PP.value_id))) FROM product_parameters as PP WHERE PP.product_id = products.id \
) as product_params \
FROM \
products \
LEFT JOIN product_prices ON product_prices.product_id = products.id \
WHERE products.published = true
sql_attr_bigint = sphinx_internal_id
sql_field_string = title
sql_attr_string = product_id
sql_attr_string = owner_id
sql_attr_json = product_params
sql_attr_uint = price
sql_attr_bool = published
}
index products{
source = productsSource
source = profileSource
path = /var/lib/manticore/indexes/products
}
да
Т.е. как по нему искать, когда у меня в source 1 основные данные, а в source 2 город?
Такое не поддерживается. Нужно, чтоб схемы были одинаковые у source’ов. Поэтому у вас и ошибка “attribute count mismatch”.
Понял, спасибо за ответ.
Такое не поддерживается. Нужно, чтоб схемы были одинаковые у source’ов. Поэтому у вас и ошибка “attribute count mismatch”
Вот как раз такая возможность и интересовала, именно объединить данные из двух разных БД с помощью мантикоры.
Еще раз спасибо за ответ.
По поводу выгрузки в xml/csv мне кажется тогда уже можно аналогичным скриптом сразу RT индекс создавать со всеми этим данными и потом его синхронизировать. Или индексация xml/csv будет оптимальнее/производительнее?
RT может производительнее при параллельной записи в него.
Добрый день!
Столкнулся с подобным кейсом, как у автора топика, поэтому решил не создавать новую тему.
Суть та же – разные проекты, разные базы, но связанные данные, надо объединить поиск по ним.
Пошёл следующим путём: создал 3 локальных rt индекса, которые объединил в distributed индекс.
Так как схемы разные, то единственное, что могу получить – это id записи. А уже после получения id хочу делать из приложения запрос к конкретному rt индексу.
Но, перерыв документацию, не нашёл – существует ли возможность при запросе из distributed индекса получить имя локального индекса?
То есть, запрос должен выглядеть примерно так:
select id, <local_index_name> from <distributed_index> where match( 'строка поиска' );
что бы потом из приложения можно было бы выполнить:
select * from <local_index_name> where id = <id полученный в предыдущем запросе>;
Такой функциональности нет. Только добавлять колонку index_name
в каждый индекс и заполнять соответствующим именем.
Спасибо за ответ!
добавлять колонку в каждый индекс
Тоже об этом уже подумал.
Feature request?
*ну и join индексов туда же
Feature request?
Да не вопрос, гитхаб всё стерпит.
Про джойн уже есть, недавно заводили.