【问题标题】:How to implement postgres full-text with joins across multiple tables?如何通过跨多个表的连接实现postgres全文?
【发布时间】:2020-11-27 16:25:43
【问题描述】:

我有一个brands 表和一个products 表,其架构如下:

brands (
    brandId SERIAL PRIMARY KEY,
    name VARCHAR (50) NOT NULL,
    slug VARCHAR (50) NOT NULL,
);

products (
    productId SERIAL PRIMARY KEY,
    title VARCHAR(250) NOT NULL,
    product_desc TEXT,
    brandId BIGINT REFERENCES brands(brandId)
);

我在这里有一个幼稚的搜索实现,它有点工作,但在搜索方面不是很好。

SELECT productid, products.brandid, products.title FROM brands 
JOIN products ON products.brandid = brands.brandid
WHERE LOWER(brands.slug) LIKE LOWER('%_search_query_here%')
OR LOWER(brands.name) LIKE LOWER('%_search_query_here%')
OR LOWER(title) LIKE LOWER('_search_query_here')
OR LOWER(product_desc) LIKE LOWER('_search_query_here');

我尝试在 Postgres 中实现全文搜索,但我不确定如何包含跨多个表的结果搜索,如下所示。我正在尝试获取用户的 searchQuery 并返回产品描述、标题中包含 searcQuery 的任何产品,或者如果 searchQuery 提到特定品牌,然后在这种情况下,返回该品牌的产品。

我试过了,我知道我必须使用 tsvector,但还没有。

CREATE MATERIALIZED VIEW search2
AS
SELECT b.brandid, to_tsvector(concat_ws(' ',p.productid, p.brandid, p.title, p.product_desc)) AS tsv
FROM brands AS b
INNER JOIN products AS p ON p.brandid = b.brandid;

SELECT * FROM search2 WHERE tsv @@ plainto_tsquery('oogle');

我想问是否有关于跨表加入全文搜索查询的建议?

【问题讨论】:

    标签: postgresql


    【解决方案1】:
    to_tsvector(concat_ws(' ',p.productid, p.brandid, p.title, p.product_desc)) AS tsv
    

    此处列出的四列并不是您在其他示例中想要搜索的四列。此外,由于所有这四个都来自同一个表,因此在物化视图中而不是在原始表中进行操作是没有意义的。使用物化视图允许一个索引覆盖从不同表的列派生的东西难道不是重点吗?

    您可以运行两个查询并将它们与 UNION 或 UNION ALL 组合,而不是执行具体化视图。

    SELECT productid, products.brandid, products.title 
    FROM brands JOIN products ON products.brandid = brands.brandid
    WHERE something_on_brands_columns
    UNION
    SELECT productid, products.brandid, products.title 
    FROM brands JOIN products ON products.brandid = brands.brandid
    WHERE something_on_products_columns
    

    【讨论】:

    • 我才刚刚开始物化视图,我想我确实需要它们,因为我需要跨不同表的列连接。我跨两个不同表的数据点。
    • @KimLee 不过,您的示例并未显示它跨越不同的表。
    • 是的,我的例子是错误的。当我从两个表中搜索参数时,我需要花更多时间来弄清楚如何做到这一点。
    猜你喜欢
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    相关资源
    最近更新 更多