云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能

简介: 本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。

参考文档:https://help.aliyun.com/zh/analyticdb/analyticdb-for-postgresql/user-guide/fusion-search-use-guide?spm=a2c4g.11186623.help-menu-92664.d_2_8_3.4bf95fa2s3zEtw&scm=20140722.H_2528590._.OR_help-T_cn~zh-V_1


# 建表SQL,并修改向量列的存储格式为PLAN
CREATE TABLE IF NOT EXISTS public.articles (
    id INTEGER NOT NULL,
    sentence TEXT,
    vector REAL[],
    PRIMARY KEY(id)
) DISTRIBUTED BY(id);

ALTER TABLE public.articles ALTER COLUMN vector SET STORAGE PLAIN;

\d+ articles


# 创建向量索引
CREATE INDEX ON public.articles USING ann (vector) WITH (dim = '384', hnsw_m = '100', pq_enable='0');

# 为了实现混合检索,为原表增加2列
ALTER TABLE public.articles add column username varchar(512);
ALTER TABLE public.articles add column time timestamp without time zone;


改文件字符集
iconv -f GBK -t UTF-8 /usr/local/postgresql-11.5/sentences_vectors1.csv -o sentences_vectors.csv


# 将sentences_vectors.csv中处理好的数据导入到表中
PGPASSWORD='Alibaba%1688' ./psql -U dbuser -p 5432 -h gp-xxx.com -d poc -c "COPY public.articles (id, sentence, vector,username,time) FROM STDIN WITH (FORMAT CSV, HEADER true, DELIMITER ',');" < /usr/local/postgresql-11.5/sentences_vectors.csv

# 对混合查询关联的结构化与板结构化列建立索引
-- 对结构化字段建立BTREE索引
CREATE INDEX ON articles(time);

- 添加tsvector 列,为了支持全文检索,通常需要添加一个 tsvector 列,用于存储文本的向量化表示
ALTER TABLE articles ADD COLUMN tsv_content TSVECTOR;

- 更新 tsvector 列,使用 to_tsvector 函数将文本字段转换为 tsvector 格式,并更新到新列中
UPDATE articles SET tsv_content = to_tsvector(sentence);

- 在 tsvector 列上创建 GIN 索引以加速全文检索
CREATE INDEX idx_articles_tsv_content ON articles USING GIN (tsv_content);

- 查询全文索引
SELECT * FROM articles WHERE tsv_content @@ to_tsquery('make');

# 查询语句
SELECT 
    id,
    sentence, 
    cosine_similarity(vector, array(SELECT generate_series(1, 384))::real[]) AS score
FROM 
    articles
WHERE 
    time >= '2023-07-18 00:00:00' 
    AND time <= '2023-08-18 00:00:00' AND tsv_content @@ to_tsquery('best')
ORDER BY 
    vector <=> array(SELECT generate_series(1, 384))::real[]
LIMIT 10;

#创建表+向量索引

image.png

# 为了实现混合检索,为原表增加2列

image.png

#对结构化字段建立BTREE索引

image.png

#在 tsvector 列上创建 GIN 索引以加速全文检索

image.png

查询结果

image.png

相关实践学习
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
目录
相关文章
|
12月前
|
存储 监控 关系型数据库
B-tree不是万能药:PostgreSQL索引失效的7种高频场景与破解方案
在PostgreSQL优化实践中,B-tree索引虽承担了80%以上的查询加速任务,但因多种原因可能导致索引失效,引发性能骤降。本文深入剖析7种高频失效场景,包括隐式类型转换、函数包裹列、前导通配符等,并通过实战案例揭示问题本质,提供生产验证的解决方案。同时,总结索引使用决策矩阵与关键原则,助你让索引真正发挥作用。
738 0
|
SQL 数据库
LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
LangChain-09 Query SQL DB With RUN GPT 查询数据库 并 执行SQL 返回结果
265 2
|
JSON 关系型数据库 PostgreSQL
PostgreSQL 9种索引的原理和应用场景
PostgreSQL 支持九种主要索引类型,包括 B-Tree、Hash、GiST、SP-GiST、GIN、BRIN、Bitmap、Partial 和 Unique 索引。每种索引适用于不同场景,如 B-Tree 适合范围查询和排序,Hash 仅用于等值查询,GiST 支持全文搜索和几何数据查询,GIN 适用于多值列和 JSON 数据,BRIN 适合非常大的表,Bitmap 适用于低基数列,Partial 只对部分数据创建索引,Unique 确保列值唯一。
1519 15
|
12月前
|
存储 关系型数据库 测试技术
拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)
本文深入解析PostgreSQL分区表的核心原理与优化策略,涵盖性能痛点、实战案例及压测对比。首先阐述分区表作为继承表+路由规则的逻辑封装,分析分区裁剪失效、全局索引膨胀和VACUUM堆积三大性能杀手,并通过电商订单表崩溃事件说明旧分区维护的重要性。接着提出四维设计法优化分区策略,包括时间范围分区黄金法则与自动化维护体系。同时对比局部索引与全局索引性能,展示后者在特定场景下的优势。进一步探讨并行查询优化、冷热数据分层存储及故障复盘,解决分区锁竞争问题。
1596 2
|
关系型数据库 分布式数据库 PolarDB
|
关系型数据库 分布式数据库 数据库
|
关系型数据库 分布式数据库 PolarDB
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
《阿里云产品手册2022-2023 版》——PolarDB for PostgreSQL
661 0
|
存储 缓存 关系型数据库
|
存储 SQL 并行计算
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(中)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
835 0
|
存储 算法 安全
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍(下)
PolarDB for PostgreSQL 开源必读手册-开源PolarDB for PostgreSQL架构介绍
691 0

热门文章

最新文章

相关产品

  • 云原生数据仓库AnalyticDB MySQL版
  • 云原生数据仓库 AnalyticDB PostgreSQL版
  • 推荐镜像

    更多