我想在一列上进行全文搜索,并在另一列中进行排序。如果我将这两列分别索引,则postgres不能在此查询中使用这两个索引。有没有办法创建可以在这种情况下使用的复合索引?
答案 0 :(得分:1)
不幸的是没有。
虽然您可以通过btree_gin
contrib模块将标量列附加到GIN索引,但Postgres不能使用GIN索引进行排序。来自docs:
PostgreSQL当前支持的索引类型中,只有B树可以 生成有序输出 - 其他索引类型返回匹配的行 一个未指定的,依赖于实现的订单。
答案 1 :(得分:0)
我将以前的评论作为答案报告
在类似的场景中,我在tsvector列上构建了一个GiST索引 另一个带有gist_trgm_ops运算符的tetxt列,所以我实际上做了一个 用tsvector列进行全文搜索,然后在上面进行排序 仅使用一个索引的具有trigram距离值的其他文本列。
我在" title"上创建了一个索引。和"搜索":
CREATE INDEX docs_docume_search_title_gist
ON public.docs_document
USING gist
(title COLLATE pg_catalog."default" gist_trgm_ops, search);
在此查询中,全文搜索在"搜索"并且订购在" title"与trigram:
SELECT "title", ("title" <-> 'json') AS "distance"
FROM "docs_document"
WHERE ("release_id" = 22 AND "search" @@ (plainto_tsquery('json')) = true)
ORDER BY "distance" ASC
LIMIT 10
这是解释:
Limit (cost=0.40..71.99 rows=10 width=29)
Output: title, (((title)::text <-> 'json'::text))
-> Index Scan using docs_docume_search_title_gist on public.docs_document (cost=0.40..258.13 rows=36 width=29)
Output: title, ((title)::text <-> 'json'::text)
Index Cond: (docs_document.search @@ plainto_tsquery('json'::text))
Order By: ((docs_document.title)::text <-> 'json'::text)
Filter: (docs_document.release_id = 22)