У меня есть табличный продукт, в котором я предоставляю полнотекстовый поиск с индексом GIN по полям умножения
create index ndsprc_custom_index on products
using GIN(to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')||' '||coalesce(shop,'')))
И мой запрос выглядит так
SELECT
products_alias.id,
products_alias.created_at AS "createdAt",
products_alias.brand_relation_id AS "brandRelationId",
products_alias.shop_relation_id AS "shopRelationId",
array_agg(DISTINCT cpt.category_id) AS categoryIds
,ts_rank_cd(to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')||' '||coalesce(shop,'')), query_search) AS rank
FROM products products_alias
JOIN to_tsquery('ball:*') query_search
ON to_tsvector('english',name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')||' '||coalesce(shop,'')) @@ query_search
LEFT JOIN product_category cp on cp.product_id = products_alias.id
LEFT JOIN product_category cpt on cpt.product_id = products_alias.id
GROUP BY id, query_search.query_search ORDER BY rank DESC, "createdAt" DESC
LIMIT 10
OFFSET 0;
, но в данный момент мне нужно добавить ВНУТРЕННЕЕ СОЕДИНЕНИЕ с таблицей категорий, где мне нужно использовать тот же случай с полнотекстовым поиском и индексом GIN
create index cn_custom_index on category
using GIN(to_tsvector('english',coalesce(name,'')||' '))
ПРОБЛЕМА это то же имя столбца name
, теперь мне нужно использовать псевдоним и теперь мой запрос выглядит так:
SELECT
products_alias.id,
products_alias.created_at AS "createdAt",
products_alias.brand_relation_id AS "brandRelationId",
products_alias.shop_relation_id AS "shopRelationId",
array_agg(DISTINCT cpt.category_id) AS categoryIds
,ts_rank_cd(to_tsvector('english',products_alias.name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')||' '||coalesce(shop,'')), query_search) AS rank
FROM products products_alias
JOIN to_tsquery('ball:*') query_search
ON to_tsvector('english',products_alias.name||' '||coalesce(description,'')||' '||coalesce(sku,'')||' '||coalesce(price,0)||' '||coalesce(category,'')||' '||coalesce(brand,'')||' '||coalesce(shop,'')) @@ query_search
LEFT JOIN product_category cp on cp.product_id = products_alias.id
LEFT JOIN product_category cpt on cpt.product_id = products_alias.id
INNER JOIN product_category cps on cps.product_id = products_alias.id
INNER JOIN category cat on cps.category_id = cat.id
JOIN to_tsquery('Leksaker:*') cps_query_search
ON to_tsvector('english',coalesce(cat.name,'')||' ') @@ cps_query_search
GROUP BY products_alias.id, query_search.query_search ORDER BY rank DESC, "createdAt" DESC
LIMIT 100
OFFSET 0;
И to_tsvector
теперь содержат псевдоним к таблицам. В этом случае мои индексы GIN работают правильно? Поскольку я использую псевдоним для таблиц, но в БД мои индексы без псевдонима, только имя столбца и, как я знаю, pstgress не содержат возможности создать индекс GIN с таблицей псевдонимов. Мой вопрос после того, как я добавлю псевдоним в таблицу, точно имя столбца, индекс GIN работает правильно или что нужно сделать, чтобы индекс GIN работал правильно? Или, может быть, нужно переименовать имя столбца для каждой таблицы, например product_name
и category_name
, и соответственно изменить индекс?