Индексация по нескольким источникам

Доброго вечера!
Есть несколько микросервисов с разными БД. И поисковый сервис на мантикоре. Основной поиск идет по продуктам, который хранятся в БД 1, но так же есть необходимость искать по городу, который привязан к пользователю и хранится в БД 2.
Самое красивое, что приходит в голову, чтобы не дублировать данные о городах в продукты и потом их синхронизировать, это как-то добавить в индекс мантикоры данные о городах. Но сложность в том, что эти информация в другой БД.
Возможно ли каким-то образом сделать source с двумя БД или индекс по двум разным source?
Или же искать фильтрую по двум индексам одновременно?

Возможно ли каким-то образом сделать source с двумя БД

Да. Типа xmlpipe2, csvpipe или tsvpipe. Пишете небольшой скрипт, который делает то, что вам нужно, а на выходе даёт xml / csv или tsv.

индекс по двум разным source?

Да. Просто указываете 2 source в индексе. Manticore Search Manual: Creating an index > Local indexes > Plain and real-time index settings

Сергей, спасибо большое за ответ!

Да. Типа 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? :slightly_smiling_face:
*ну и join индексов туда же

Feature request? :slightly_smiling_face:

Да не вопрос, гитхаб всё стерпит.

Про джойн уже есть, недавно заводили.