Как исправить использование индекса GIN, если мне нужна таблица псевдонимов? - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть табличный продукт, в котором я предоставляю полнотекстовый поиск с индексом 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, и соответственно изменить индекс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...