如何用 PolarDB 在不确定世界寻找确定答案 (例如图像相似) - vector|pase

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 背景世界是确定的吗? 不就好像我们拍照, 同一个相机, 同一个地点, 同一个时间连拍几张, 结果都不一样. 更不用说时间地点不一样了.真正确定的数据并不多, 世界充满的是不确定的数据.例如人脸识别, 存在数据库中的数据可能是曾经的照片, 但是你去比对人脸时是实时的, 角度、化妆、发型都可能不一样.未...

背景

世界是确定的吗? 不

就好像我们拍照, 同一个相机, 同一个地点, 同一个时间连拍几张, 结果都不一样. 更不用说时间地点不一样了.

真正确定的数据并不多, 世界充满的是不确定的数据.

例如人脸识别, 存在数据库中的数据可能是曾经的照片, 但是你去比对人脸时是实时的, 角度、化妆、发型都可能不一样.

未来的数据库一定要解决一个问题, 如何在不确定的世界寻找确定的答案?

PolarDB早几年就发布了pase插件, 解决高性能图像识别的问题, 通过将非结构化数据根据特征提取成为一串向量, 然后根据向量进行距离计算, 得到最相似的向量, 从而解决不确定数据的确定性搜索.

后来开源社区也发了一个插件vector, 知识支持的算法只有ivfflat.

本文将介绍如何在开源polardb中安装和使用vector插件, 解决向量数据相似搜索的问题.

PolarDB的安装请参考: 《如何用 PolarDB 证明巴菲特的投资理念》

vector on PolarDB

  1. 启动并进入polardb实例

IT-C02YW2EFLVDL:~ digoal$ docker ps -a  
CONTAINER ID   IMAGE                                    COMMAND                  CREATED        STATUS                        PORTS     NAMES  
67e1eed1b4b6   polardb/polardb_pg_local_instance:htap   "/bin/sh -c '~/tmp_b…"   2 months ago   Exited (137) 10 minutes ago             polardb_pg_htap  
  
IT-C02YW2EFLVDL:~ digoal$ docker start 67e1eed1b4b6  
67e1eed1b4b6  
  
IT-C02YW2EFLVDL:~ digoal$ docker exec -it 67e1eed1b4b6 bash  
[postgres@67e1eed1b4b6 ~]$ which git  
/usr/bin/git  
  1. 下载vector插件

[postgres@67e1eed1b4b6 ~]$ git clone --branch v0.3.2 --depth 1 https://github.com/pgvector/pgvector.git  
Cloning into 'pgvector'...  
remote: Enumerating objects: 80, done.  
remote: Counting objects: 100% (80/80), done.  
remote: Compressing objects: 100% (62/62), done.  
remote: Total 80 (delta 33), reused 29 (delta 15), pack-reused 0  
Unpacking objects: 100% (80/80), done.  
Note: checking out 'a7f712b5a4724cfe55e2793dd1a4b7d48257fa1e'.  
  
You are in 'detached HEAD' state. You can look around, make experimental  
changes and commit them, and you can discard any commits you make in this  
state without impacting any branches by performing another checkout.  
  
If you want to create a new branch to retain commits you create, you may  
do so (now or later) by using -b with the checkout command again. Example:  
  
  git checkout -b new_branch_name  
  1. 安装vector插件

[postgres@67e1eed1b4b6 ~]$ cd pgvector/  
[postgres@67e1eed1b4b6 pgvector]$ ll  
total 48  
-rw-rw-r-- 1 postgres postgres 1877 Dec  1 09:34 CHANGELOG.md  
-rw-rw-r-- 1 postgres postgres  482 Dec  1 09:34 Dockerfile  
-rw-rw-r-- 1 postgres postgres 1104 Dec  1 09:34 LICENSE  
-rw-rw-r-- 1 postgres postgres 1760 Dec  1 09:34 Makefile  
-rw-rw-r-- 1 postgres postgres 1105 Dec  1 09:34 META.json  
-rw-rw-r-- 1 postgres postgres 9495 Dec  1 09:34 README.md  
drwxrwxr-x 2 postgres postgres 4096 Dec  1 09:34 sql  
drwxrwxr-x 2 postgres postgres 4096 Dec  1 09:34 src  
drwxrwxr-x 6 postgres postgres 4096 Dec  1 09:34 test  
-rw-rw-r-- 1 postgres postgres  135 Dec  1 09:34 vector.control  
  
  
[postgres@67e1eed1b4b6 pgvector]$ which pg_config  
~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config  
  
[postgres@67e1eed1b4b6 pgvector]$ USE_PGXS=1 make  
[postgres@67e1eed1b4b6 pgvector]$ USE_PGXS=1 make install  
  1. 加载vector插件

[postgres@67e1eed1b4b6 pgvector]$ psql -h 127.0.0.1  
psql (11.9)  
Type "help" for help.  
  
postgres=# create extension vector ;  
CREATE EXTENSION  
  1. 测试向量数据搜索、以及索引加速搜索.

postgres=# CREATE TABLE items (embedding vector(3));  
CREATE TABLE  
postgres=# INSERT INTO items VALUES ('[1,2,3]'), ('[4,5,6]');  
INSERT 0 2  
postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
 embedding   
-----------  
 [1,2,3]  
(1 row)  
  
postgres=# CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);  
CREATE INDEX  
  
postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
 embedding   
-----------  
 [1,2,3]  
(1 row)  
  
postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
                            QUERY PLAN                              
------------------------------------------------------------------  
 Limit  (cost=1.03..1.04 rows=1 width=40)  
   ->  Sort  (cost=1.03..1.04 rows=2 width=40)  
         Sort Key: ((embedding <-> '[3,1,2]'::vector))  
         ->  Seq Scan on items  (cost=0.00..1.02 rows=2 width=40)  
(4 rows)  
  
postgres=# set enable_seqscan=off;  
SET  
postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
                                       QUERY PLAN                                         
----------------------------------------------------------------------------------------  
 Limit  (cost=4.08..6.09 rows=1 width=40)  
   ->  Index Scan using items_embedding_idx on items  (cost=4.08..8.11 rows=2 width=40)  
         Order By: (embedding <-> '[3,1,2]'::vector)  
(3 rows)  
  
postgres=# SET ivfflat.probes = 10;  
SET  
postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
 embedding   
-----------  
 [1,2,3]  
(1 row)  
  
postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
                                        QUERY PLAN                                          
------------------------------------------------------------------------------------------  
 Limit  (cost=40.80..42.81 rows=1 width=40)  
   ->  Index Scan using items_embedding_idx on items  (cost=40.80..44.83 rows=2 width=40)  
         Order By: (embedding <-> '[3,1,2]'::vector)  
(3 rows)  

参考

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍如何基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
10月前
|
监控 前端开发 关系型数据库
搭建直播网站技术层面准备全流程
搭建直播网站涉及技术选型、开发与部署。技术选型包括服务器端(Java/Go、MySQL/PostgreSQL、Redis、阿里云OSS等)、前端(React/Vue.js、React Native/Flutter)、流媒体技术(RTMP、HLS、WebRTC、H.264/AAC)和CDN加速。系统架构设计涵盖前端、后端、流媒体服务器及数据库,使用负载均衡器分发流量,包含用户认证、推拉流管理、实时通信等功能模块。开发流程包括环境搭建、API实现、WebSocket通信、页面开发及流媒体配置。部署阶段涉及服务器搭建、Docker容器化、CDN配置、日志监控及CI/CD自动化部署。
1733 13
|
存储 算法 Cloud Native
【PolarDB-X列存魔法】揭秘TPC-H测试背后的性能优化秘籍!
【8月更文挑战第25天】阿里巴巴的云原生数据库PolarDB-X以其出色的性能、可靠性和扩展性闻名,在多种业务场景中广泛应用。尤其在列存储模式下,PolarDB-X针对分析型查询进行了优化,显著提升了数据读取效率。本文通过TPC-H基准测试探讨PolarDB-X列存执行计划的优化策略,包括高效数据扫描、专用查询算法以及动态调整执行计划等功能,以满足复杂查询的需求并提高数据分析性能。
254 1
|
监控 物联网 关系型数据库
使用PostgreSQL触发器解决物联网设备状态同步问题
在物联网监控系统中,确保设备状态(如在线与离线)的实时性和准确性至关重要。当设备状态因外部因素改变时,需迅速反映到系统内部。因设备状态数据分布在不同表中,直接通过应用同步可能引入复杂性和错误。采用PostgreSQL触发器自动同步状态变化是一种高效方法。首先定义触发函数,在设备状态改变时更新管理模块表;然后创建触发器,在状态字段更新后执行此函数。此外,还需进行充分测试、监控性能并实施优化,以及在触发函数中加入错误处理和日志记录功能。这种方法不仅提高自动化程度,增强数据一致性与实时性,还需注意其对性能的影响并采取优化措施。
354 2
|
存储 安全 Serverless
用 Github Actions 自动部署阿里云函数计算 FC
介绍了如何配置阿里云函数计算(FC)与GitHub Actions集成以实现自动部署。首先在阿里云创建函数,然后在项目根目录创建`s.yaml`文件配置Serverless Devs。接着在GitHub仓库中设置 Secrets 存储阿里云账号信息,并创建名为`aliyun-fc-deploy.yaml`的工作流文件来定义GitHub Actions。当代码推送到`master`分支时,Actions会自动部署到函数计算。最后,成功配置后,提交代码会触发自动部署,并可在GitHub Actions和阿里云控制台查看部署状态。
1094 3
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
411 1
|
存储 关系型数据库 分布式数据库
配置 pgcat for PolarDB 读写分离连接池
背景PolarDB 开源数据库支持云原生存算分离分布式架构, 一份存储支持多个计算节点, 目前是一写多读的架构. 内核已经很强大了, 怎么实现业务透明的读写分离, 还缺一个连接池, pgcat是不错的选择.pgcat支持连接池、sharding、读写负载均衡等, 更多功能请参考其官网https://...
513 0
|
存储 Ubuntu 关系型数据库
7天突破PolarDB for Postgre 2022版—第一讲 单机本地存储部署实例
分享人:棠羽,阿里云智能数据库产品事业部PolarDB产品部内核工程师
7天突破PolarDB for Postgre 2022版—第一讲  单机本地存储部署实例
|
Java 中间件 测试技术
ThreadLocal垮线程池传递数据解决方案:TransmittableThreadLocal【享学Java】(下)
ThreadLocal垮线程池传递数据解决方案:TransmittableThreadLocal【享学Java】(下)
ThreadLocal垮线程池传递数据解决方案:TransmittableThreadLocal【享学Java】(下)
|
弹性计算 运维 供应链
案例2:云效携手 SAE 助力掌讯科技降本提效 | 学习笔记
快速学习案例2:云效携手 SAE 助力掌讯科技降本提效
案例2:云效携手 SAE 助力掌讯科技降本提效 | 学习笔记
|
算法 关系型数据库 分布式数据库
使用 PolarDB 开源版 smlar 插件进行高效率相似文本搜索、自助选药、相似人群圈选等业务
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力。本文将介绍使用 PolarDB 开源版 smlar 插件进行高效率相似文本搜索、自助...
247 0