postgres:复合全文/ btree索引

时间:2018-01-18 17:36:08

标签: postgresql sorting full-text-search

我想在一列上进行全文搜索,并在另一列中进行排序。如果我将这两列分别索引,则postgres不能在此查询中使用这两个索引。有没有办法创建可以在这种情况下使用的复合索引?

2 个答案:

答案 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)