Postgresql全文搜索与其他条件

时间:2016-11-03 21:48:40

标签: sql postgresql full-text-search

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

例如: 表:职位空缺
列:标题,描述(标题+描述= tsvector),工资(带索引的int值)。

我想找到所有空缺的文字,其中包含标题+描述以及工资> 1000。

哪一列是第一个条件。

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

OR

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

1 个答案:

答案 0 :(得分: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