Postgres跨多个相关表格的全文搜索

Wil*_*nes 14 postgresql full-text-search multiple-tables tsvector

这可能是一个非常简单的问题,所以提前道歉,但我对数据库的使用非常新.

我想让Postgres在多个连接表中运行全文搜索.想象一下像模型用户,具有相关模型UserProfile和UserInfo.搜索仅适用于用户,但包含来自UserProfile和UserInfo的信息.

我打算在搜索中使用杜松子酒索引.但是,我不清楚我是否需​​要在User表中使用单独的tsvector列来保存表中的聚合tsvector,并设置触发器以使其保持最新.或者,如果可以创建没有tsvector列的索引,只要任何相关表中的任何相关字段发生更改,它就会保持最新状态.此外,任何关于创建所有这些的命令的语法的提示也将非常受欢迎.

Mag*_*der 8

你最好的答案可能是在每个表中都有一个单独的tsvector列(当然有一个索引).如果将数据聚合到共享的tsvector,那么只要各个更新,就会在该共享的tsvector上创建大量更新.

每个表需要一个索引.然后当你查询它时,显然你需要多个WHERE子句,每个字段一个.然后,PostgreSQL将自动确定使用哪种索引组合来提供最快的结果 - 可能使用位图扫描.它会使您的查询更复杂(因为您需要多个列匹配子句),但这样可以灵活地只查询您想要的情况下的某些字段.

您无法创建一个跟踪多个表的索引.为此,您需要在每个表上使用单独的tsvector列和触发器来更新它.

  • 您能详细了解读取查询的工作原理吗?我正在尝试找到关于跨多个表进行postgresql全文搜索的最佳方法的文档,而且我找不到多少.我遇到的一个问题是,如果我在我查询的每个表上设置索引,postgresql在进行查询时无法使用所有索引.例如:select*from orders left join on users ... left join on line_items ... where ts_vector('english',orders.id)@@ ...或ts_vector('english',users.name)@@. .. (2认同)
  • 我还看到在两个表中搜索的查询会执行顺序扫描 (`SELECT COUNT(*) FROM products WHERE to_tsvector('simple', products.name::text) @@ to_tsquery('simple', 'foo':: text);`),而搜索一个表的查询仅使用索引 (`SELECT COUNT(*) FROM products LEFT JOIN Brand ON products.brand_id = Brands.id WHERE to_tsvector('simple', products. name::text) @@ to_tsquery('simple', 'foo'::text) 或 to_tsvector('simple', Brands.name::text) @@ to_tsquery('simple', 'foo'::text); `)。 (2认同)