我有一个包含从文本文档中提取的数据的表。数据存储在一个名为的列"CONTENT"中,我使用 GIN 创建了该索引:
CREATE INDEX "File_contentIndex"
ON "File"
USING gin
(setweight(to_tsvector('english'::regconfig
, COALESCE("CONTENT", ''::character varying)::text), 'C'::"char"));
Run Code Online (Sandbox Code Playgroud)
我使用以下查询对表执行全文搜索:
SELECT "ITEMID",
ts_rank(setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C') ,
plainto_tsquery('english', 'searchTerm')) AS "RANK"
FROM "File"
WHERE setweight(to_tsvector('english', coalesce("CONTENT",'')), 'C')
@@ plainto_tsquery('english', 'searchTerm')
ORDER BY "RANK" DESC
LIMIT 5;
Run Code Online (Sandbox Code Playgroud)
File 表包含 250 000 行,每个"CONTENT"条目由一个随机单词和一个所有行都相同的文本字符串组成。
现在,当我搜索一个随机单词(在整个表中命中 1 个)时,查询运行得非常快(<100 毫秒)。但是,当我搜索出现在所有行中的单词时,查询运行速度非常慢(10 分钟或更长时间)。
EXPLAIN ANALYZE显示对于 1-hit 搜索,先执行位图索引扫描,然后执行位图堆扫描。对于慢速搜索,改为执行Seq Scan,这需要很长时间。
当然,在所有行中使用相同的数据是不现实的。但是由于我无法控制用户上传的文本文档,也无法控制他们执行的搜索,因此可能会出现类似的情况(搜索在 DB 中出现率很高的术语)。在这种情况下,如何提高搜索查询的性能?
运行 PostgreSQL 9.3.4
查询计划来自EXPLAIN ANALYZE:
快速搜索(在 DB …
postgresql performance index full-text-search postgresql-9.3