首页 > 解决方案 > 在 Postgres 的 GIN 索引中使用少量分析器

问题描述

我想为 Postges 全文搜索创建 GIN 索引,我想问是否可以将表中每一行的分析器名称存储在名为的单独列中lang,使用它为从中获取的每一行创建具有不同分析器的 GIN 索引场lang

这就是我现在使用的。Analyzer - '<code>english',索引表中的每一行都是通用的。

CREATE INDEX CONCURRENTLY IF NOT EXISTS 
decription_fts_gin_idx ON api_product 
USING GIN(to_tsvector('english', description))

我想做这样的事情:

CREATE INDEX CONCURRENTLY IF NOT EXISTS 
decription_fts_gin_idx ON api_product 
USING GIN(to_tsvector(api_product.lang, description))

(它不起作用)

为了从字段中检索分析器配置lang并使用其名称来填充索引。

是否有可能以某种方式做到这一点,或者只能对整个索引使用一个分析器?

DDL,以防万一..

-- auto-generated definition
create table api_product
(
    id                       serial       not null
        constraint api_product_pkey
            primary key,
    name                     varchar(100) not null,
    standard                 varchar(40)  not null,
    weight                   integer      not null
        constraint api_product_weight_check
            check (weight >= 0),
    dimensions               varchar(30)  not null,
    description              text         not null,
    textsearchable_index_col tsvector,
    department               varchar(30)  not null,
    lang                     varchar(25)  not null
);

alter table api_product
    owner to postgres;

create index textsearch_idx
    on api_product (textsearchable_index_col);

查询运行搜索:


                SELECT *,
                ts_rank_cd(to_tsvector('english', description),
                to_tsquery('english', %(keyword)s), 32) as rnk 
                FROM api_product 
                WHERE to_tsvector('english', description) @@ to_tsquery('english', %(keyword)s)
                ORDER BY rnk DESC, id 

其中 'english' 将更改为 ' lang' 字段分析器名称(英语、法语等)

标签: sqlpostgresqlfull-text-search

解决方案


如果您提前知道要查询的语言,则可以创建一系列部分索引:

CREATE INDEX CONCURRENTLY ON api_product 
USING GIN(to_tsvector('english', description)) where lang='english';

然后在您的查询中,您将添加您正在搜索的语言:

 SELECT *,
            ts_rank_cd(to_tsvector('english', description),
            to_tsquery('english', %(keyword)s), 32) as rnk 
            FROM api_product 
            WHERE to_tsvector('english', description) @@ to_tsquery('english', %(keyword)s)
            and lang='english'
            ORDER BY rnk DESC, id 

推荐阅读