【问题标题】:Postgresql full-text search with other conditionsPostgresql 全文搜索带其他条件
【发布时间】:2016-11-03 21:48:39
【问题描述】:

我有带有 tsvector 列的表,我也为该列创建了索引。我还有一些搜索所需的列(以及这些列的索引)。

例如: 表:职位空缺
列:title、description(title + description = tsvector)、salary(int value with index)。

我想查找所有职位空缺,其中包含标题+描述以及薪水 > 1000 的文本。

第一个条件是哪一列。

SELECT * 
FROM vacancies 
WHERE title_description_tsvector @@ plainto_tsquery('php developer') 
  AND salary > 1000;

SELECT * 
FROM vacancies 
WHERE salary > 1000 
  AND title_description_tsvector @@ plainto_tsquery('php developer');

【问题讨论】:

  • AND结合的条件顺序无关。两个查询都将返回相同的内容。
  • 但是对于使用索引,它有米特。
  • 不,即使是索引使用也没有关系。使用explain analyze select ....检查执行计划,你会看到

标签: sql postgresql full-text-search


【解决方案1】:

更改WHERE 中的顺序不会影响优化器的决定。

如果出于某种原因你想强制它使用一个索引肉体而不是另一个(例如,你检查了计划并看到它使用 salary 索引然后 Filter: (title_description_tsvector @@ plainto_tsquery('php developer')) 所以你看不到你在 title_description_tsvector 上的索引并且您觉得优化器是错误的)。所以你想让它首先选择想要的索引(就像Oracle中的提示一样),你可以使用CTE来尝试它,比如:

EXPLAIN 
WITH pre as (SELECT * 
FROM vacancies 
WHERE title_description_tsvector @@ plainto_tsquery('php developer') 
)
SELECT * 
FROM pre 
WHERE salary > 1000; 

我很确定成本会更高。如果没有 - 是时候检查autovacuum

【讨论】:

    猜你喜欢
    • 2011-11-13
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    相关资源
    最近更新 更多