【问题标题】:Full-text search with related tables in PostgreSQL在 PostgreSQL 中使用相关表进行全文搜索
【发布时间】:2013-02-09 19:05:48
【问题描述】:

任务: 在PostgreSQL的多个表中实现全文搜索。

例如,项目表 - 项目: 有两个字段需要搜索:标题和描述。 在此表上创建索引:

ALTER TABLE public.projects ADD COLUMN search_fts tsvector;
UPDATE public.projects SET search_fts =
to_tsvector(
    coalesce(title, '') ||' '||
    coalesce(description, '') || ' '
);
CREATE INDEX in_projects_idx ON public.projects
  USING gin (search_fts);

现在搜索很简单:

SELECT
    DISTINCT p.id,
    p.title,
    ts_rank(
        p.search_fts,
        to_tsquery('word1 | word2')
    ) as rank
FROM
    projects p
WHERE
    p.search_fts @@ to_tsquery('word1 | word2')
ORDER BY rank DESC;

精致。现在我们需要查看表和项目类别——project_categories。 类似于创建 tsvector 和为表上的字段名。 现在的搜索查询是:

SELECT
    DISTINCT p.id,
    p.title,
    category.name as categoryName,
    ts_rank(
        (
            coalesce(p.search_fts, '') ||' '||
            coalesce(category.search_fts, '')
        ),
        to_tsquery('word1 | word2 | categoryName')
    ) as rank
FROM
    projects p
LEFT JOIN project_categories category
    ON p.category_id = category.category_id
WHERE
    (
        coalesce(p.search_fts, '') ||' '||
        coalesce(category.search_fts, '')
    ) @@ to_tsquery('word1 | word2 | categoryName')
ORDER BY rank DESC;

更复杂。现在搜索必须以一对多和多对多的形式在几十个与项目相关的表上工作。

加入人数不断增加。合并到越来越多的领域。

其实我的问题是正确的方式吗?你会如何解决这个问题?

我也考虑有视图的版本。 比如建立在这样一个请求之上:

(
  SELECT 
      p.id as project_id,
      p.search_fts
  FROM projects p
) UNION ALL (
  SELECT 
      p.id as project_id,
      category.search_fts
  FROM projects p
  JOIN project_categories category
      ON p.category_id = category.category_id
)

最后,我们得到了整体指数。通过哪个搜索。 但在视图中必须结合十几个不同通信选项的请求。 对您对此选项的看法感兴趣。

对不起我的英语。

【问题讨论】:

    标签: postgresql search full-text-search search-engine postgresql-9.1


    【解决方案1】:

    你有几个选择:

    • 在所有输入表上使用触发器来维护一个汇总表,该汇总表将所有感兴趣的记录组合到文本行中。这适用于简单的情况,例如具有 1 个或多个 phone 和一个或多个 address 条目的 customer,您可以使用简单的串联和 string_agg 将它们作为 |customername|customerid|phone1|phone2|phone3|...|address1|address2|... 放入摘要搜索表中在连接表上。但是,它无法很好地适应深度嵌套的关系,并且可能会带来一些锁定和并发问题。

    • 使用 Apache Solr 等旨在解决复杂搜索问题的外部搜索系统。

    【讨论】:

    • 感谢您的回复。我还考虑过使用触发器编写整体索引。但是这个选项看起来也不是很舒服,就像我建议的所有选项一样。我认为通过相当简单的搜索任务可以在没有外部搜索引擎的情况下获得最佳解决方案。我对 postrgesql 中的搜索工具非常满意。只是想找到创建通用索引的最佳方法。但是,遗憾的是,所有 varinty 都不舒服(
    • @ddmaster 是的,我同意内置对多表全文搜索的支持会很好。但是,没有,因此您的选择实际上是使用外部工具或维护带有触发器的汇总表。我不确定多表全文搜索如何在 Pg 中工作......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多