sql - 在 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
' 字段分析器名称(英语、法语等)
解决方案
如果您提前知道要查询的语言,则可以创建一系列部分索引:
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
推荐阅读
- python - 安装具有损坏 rtree 依赖关系的 Brain Scaffold Builder
- html - 如何使用 Flexbox 对齐 HTML 中的项目
- jquery - 如何避免滚动?
- sql - PostgreSQL 过去整整 n 个月
- python - 如何与 Selenium WebDriver 并行运行浏览器实例
- c# - 无法通过电子邮件发送文件
- python - 如何在databricks上将文件从一个文件夹移动到另一个文件夹
- php - 为什么 phpinfo() 显示版本 7.4 而 php -v 显示版本 7.2.34?
- laravel - 试图获取非对象的属性“product_name”
- python - 来自 python 脚本的实时绘图破折号图