Tio Boot DocsTio Boot Docs
Home
  • java-db
  • api-table
  • Enjoy
  • Tio Boot Admin
  • ai_agent
  • translator
  • knowlege_base
  • ai-search
  • 案例
Abount
  • Github
  • Gitee
Home
  • java-db
  • api-table
  • Enjoy
  • Tio Boot Admin
  • ai_agent
  • translator
  • knowlege_base
  • ai-search
  • 案例
Abount
  • Github
  • Gitee
  • 01_tio-boot 简介

    • tio-boot:新一代高性能 Java Web 开发框架
    • tio-boot 入门示例
    • Tio-Boot 配置 : 现代化的配置方案
    • tio-boot 整合 Logback
    • tio-boot 整合 hotswap-classloader 实现热加载
    • 自行编译 tio-boot
    • 最新版本
    • 开发规范
  • 02_部署

    • 使用 Maven Profile 实现分环境打包 tio-boot 项目
    • Maven 项目配置详解:依赖与 Profiles 配置
    • tio-boot 打包成 FastJar
    • 使用 GraalVM 构建 tio-boot Native 程序
    • 使用 Docker 部署 tio-boot
    • 部署到 Fly.io
    • 部署到 AWS Lambda
    • 到阿里云云函数
    • 使用 Deploy 工具部署
    • 胖包与瘦包的打包与部署
    • 使用 Jenkins 部署 Tio-Boot 项目
    • 使用 Nginx 反向代理 Tio-Boot
    • 使用 Supervisor 管理 Java 应用
  • 03_配置

    • 配置参数
    • 服务器监听器
    • 内置缓存系统 AbsCache
    • 使用 Redis 作为内部 Cache
    • 静态文件处理器
    • 基于域名的静态资源隔离
    • DecodeExceptionHandler
  • 04_原理

    • 生命周期
    • 请求处理流程
    • 重要的类
  • 05_json

    • Json
    • 接受 JSON 和响应 JSON
    • 响应实体类
  • 06_web

    • 概述
    • 文件上传
    • 接收请求参数
    • 接收日期参数
    • 接收数组参数
    • 返回字符串
    • 返回文本数据
    • 返回网页
    • 请求和响应字节
    • 文件下载
    • 返回视频文件并支持断点续传
    • http Session
    • Cookie
    • HttpRequest
    • HttpResponse
    • Resps
    • RespBodyVo
    • /zh/06_web/19.html
    • 全局异常处理器
    • 异步
    • 动态 返回 CSS 实现
    • 返回图片
    • Transfer-Encoding: chunked 实时音频播放
    • Server-Sent Events (SSE)
    • 接口访问统计
    • 接口请求和响应数据记录
    • 自定义 Handler 转发请求
    • 使用 HttpForwardHandler 转发所有请求
    • 跨域
    • 添加 Controller
    • 常用工具类
    • HTTP Basic 认证
    • WebJars
    • JProtobuf
  • 07_validate

    • 数据紧校验规范
    • 参数校验
  • 08_websocket

    • 使用 tio-boot 搭建 WebSocket 服务
    • WebSocket 聊天室项目示例
  • 09_java-db

    • java‑db
    • 操作数据库入门示例
    • SQL 模板
    • 数据源配置与使用
    • ActiveRecord
    • Model
    • 生成器与 Model
    • Db 工具类
    • 批量操作
    • 数据库事务处理
    • Cache 缓存
    • Dialect 多数据库支持
    • 表关联操作
    • 复合主键
    • Oracle 支持
    • Enjoy SQL 模板
    • Java-DB 整合 Enjoy 模板最佳实践
    • 多数据源支持
    • 独立使用 ActiveRecord
    • 调用存储过程
    • java-db 整合 Guava 的 Striped 锁优化
    • 生成 SQL
    • 通过实体类操作数据库
    • java-db 读写分离
    • Spring Boot 整合 Java-DB
    • like 查询
    • 常用操作示例
    • Druid 监控集成指南
    • SQL 统计
  • 10_api-table

    • ApiTable 概述
    • 使用 ApiTable 连接 SQLite
    • 使用 ApiTable 连接 Mysql
    • 使用 ApiTable 连接 Postgres
    • 使用 ApiTable 连接 TDEngine
    • 使用 api-table 连接 oracle
    • 使用 api-table 连接 mysql and tdengine 多数据源
    • EasyExcel 导出
    • EasyExcel 导入
    • TQL(Table SQL)前端输入规范
    • ApiTable 实现增删改查
    • 数组类型
    • 单独使用 ApiTable
  • 11_aop

    • JFinal-aop
    • Aop 工具类
    • 配置
    • 配置
    • 独立使用 JFinal Aop
    • @AImport
    • 原理解析
  • 12_cache

    • Caffine
    • Jedis-redis
    • hutool RedisDS
    • Redisson
    • Caffeine and redis
    • CacheUtils 工具类
    • 使用 CacheUtils 整合 caffeine 和 redis 实现的两级缓存
    • 使用 java-db 整合 ehcache
    • 使用 java-db 整合 redis
    • Java DB Redis 相关 Api
    • redis 使用示例
  • 13_认证和权限

    • hutool-JWT
    • FixedTokenInterceptor
    • 使用内置 TokenManager 实现登录
    • 用户系统
    • 重置密码
    • 匿名登录
    • Google 登录
    • 权限校验注解
    • Sa-Token
    • sa-token 登录注册
    • StpUtil.isLogin() 源码解析
    • 短信登录
    • 移动端微信登录实现指南
    • 移动端重置密码
  • 14_i18n

    • i18n
  • 15_enjoy

    • tio-boot 整合 Enjoy 模版引擎文档
    • 引擎配置
    • 表达式
    • 指令
    • 注释
    • 原样输出
    • Shared Method 扩展
    • Shared Object 扩展
    • Extension Method 扩展
    • Spring boot 整合
    • 独立使用 Enjoy
    • tio-boot enjoy 自定义指令 localeDate
    • PromptEngine
    • Enjoy 入门示例-擎渲染大模型请求体
    • Enjoy 使用示例
  • 16_定时任务

    • Quartz 定时任务集成指南
    • 分布式定时任务 xxl-jb
    • cron4j 使用指南
  • 17_tests

    • TioBootTest 类
  • 18_tio

    • TioBootServer
    • tio-core
    • 内置 TCP 处理器
    • 独立启动 UDPServer
    • 使用内置 UDPServer
    • t-io 消息处理流程
    • tio-运行原理详解
    • TioConfig
    • ChannelContext
    • Tio 工具类
    • 业务数据绑定
    • 业务数据解绑
    • 发送数据
    • 关闭连接
    • Packet
    • 监控: 心跳
    • 监控: 客户端的流量数据
    • 监控: 单条 TCP 连接的流量数据
    • 监控: 端口的流量数据
    • 单条通道统计: ChannelStat
    • 所有通道统计: GroupStat
    • 资源共享
    • 成员排序
    • ssl
    • DecodeRunnable
    • 使用 AsynchronousSocketChannel 响应数据
    • 拉黑 IP
    • 深入解析 Tio 源码:构建高性能 Java 网络应用
  • 19_aio

    • ByteBuffer
    • AIO HTTP 服务器
    • 自定义和线程池和池化 ByteBuffer
    • AioHttpServer 应用示例 IP 属地查询
    • 手写 AIO Http 服务器
  • 20_netty

    • Netty TCP Server
    • Netty Web Socket Server
    • 使用 protoc 生成 Java 包文件
    • Netty WebSocket Server 二进制数据传输
    • Netty 组件详解
  • 21_netty-boot

    • Netty-Boot
    • 原理解析
    • 整合 Hot Reload
    • 整合 数据库
    • 整合 Redis
    • 整合 Elasticsearch
    • 整合 Dubbo
    • Listener
    • 文件上传
    • 拦截器
    • Spring Boot 整合 Netty-Boot
    • SSL 配置指南
    • ChannelInitializer
    • Reserve
  • 22_MQ

    • Mica-mqtt
    • EMQX
    • Disruptor
  • 23_tio-utils

    • tio-utils
    • HttpUtils
    • Notification
    • 邮箱
    • JSON
    • 读取文件
    • Base64
    • 上传和下载
    • Http
    • Telegram
    • RsaUtils
    • EnvUtils 使用文档
    • 系统监控
    • 毫秒并发 ID (MCID) 生成方案
  • 24_tio-http-server

    • 使用 Tio-Http-Server 搭建简单的 HTTP 服务
    • tio-boot 添加 HttpRequestHandler
    • 在 Android 上使用 tio-boot 运行 HTTP 服务
    • tio-http-server-native
    • handler 常用操作
  • 25_tio-websocket

    • WebSocket 服务器
    • WebSocket Client
  • 26_tio-im

    • 通讯协议文档
    • ChatPacket.proto 文档
    • java protobuf
    • 数据表设计
    • 创建工程
    • 登录
    • 历史消息
    • 发消息
  • 27_mybatis

    • Tio-Boot 整合 MyBatis
    • 使用配置类方式整合 MyBatis
    • 整合数据源
    • 使用 mybatis-plus 整合 tdengine
    • 整合 mybatis-plus
  • 28_mongodb

    • tio-boot 使用 mongo-java-driver 操作 mongodb
  • 29_elastic-search

    • Elasticsearch
    • JavaDB 整合 ElasticSearch
    • Elastic 工具类使用指南
    • Elastic-search 注意事项
    • ES 课程示例文档
  • 30_magic-script

    • tio-boot 整合 magic-script
  • 31_groovy

    • tio-boot 整合 Groovy
  • 32_firebase

    • 整合 google firebase
    • Firebase Storage
    • Firebase Authentication
    • 使用 Firebase Admin SDK 进行匿名用户管理与自定义状态标记
    • 导出用户
    • 注册回调
    • 登录注册
  • 33_文件存储

    • 文件上传数据表
    • 本地存储
    • 使用 AWS S3 存储文件并整合到 Tio-Boot 项目中
    • 存储文件到 腾讯 COS
  • 34_spider

    • jsoup
    • 爬取 z-lib.io 数据
    • 整合 WebMagic
    • WebMagic 示例:爬取学校课程数据
    • Playwright
    • Flexmark (Markdown 处理器)
    • tio-boot 整合 Playwright
    • 缓存网页数据
  • 36_integration_thirty_party

    • tio-boot 整合 okhttp
    • 整合 GrpahQL
    • 集成 Mailjet
    • 整合 ip2region
    • 整合 GeoLite 离线库
    • 整合 Lark 机器人指南
    • 集成 Lark Mail 实现邮件发送
    • Thymeleaf
    • Swagger
    • Clerk 验证
  • 37_dubbo

    • 概述
    • dubbo 2.6.0
    • dubbo 2.6.0 调用过程
    • dubbo 3.2.0
  • 38_spring

    • Spring Boot Web 整合 Tio Boot
    • spring-boot-starter-webflux 整合 tio-boot
    • Tio Boot 整合 Spring Boot Starter
    • Tio Boot 整合 Spring Boot Starter Data Redis 指南
  • 39_spring-cloud

    • tio-boot spring-cloud
  • 40_mysql

    • 使用 Docker 运行 MySQL
    • /zh/42_mysql/02.html
  • 41_postgresql

    • PostgreSQL 安装
    • PostgreSQL 主键自增
    • PostgreSQL 日期类型
    • Postgresql 金融类型
    • PostgreSQL 数组类型
    • PostgreSQL 全文检索
    • PostgreSQL 查询优化
    • 获取字段类型
    • PostgreSQL 向量
    • PostgreSQL 优化向量查询
    • PostgreSQL 其他
  • 43_oceanbase

    • 快速体验 OceanBase 社区版
    • 快速上手 OceanBase 数据库单机部署与管理
    • 诊断集群性能
    • 优化 SQL 性能指南
    • /zh/43_oceanbase/05.html
  • 50_media

    • JAVE 提取视频中的声音
    • Jave 提取视频中的图片
    • /zh/50_media/03.html
  • 51_asr

    • Whisper-JNI
  • 54_native-media

    • java-native-media
    • JNI 入门示例
    • mp3 拆分
    • mp4 转 mp3
    • 使用 libmp3lame 实现高质量 MP3 编码
    • Linux 编译
    • macOS 编译
    • 从 JAR 包中加载本地库文件
    • 支持的音频和视频格式
    • 任意格式转为 mp3
    • 通用格式转换
    • 通用格式拆分
    • 视频合并
    • VideoToHLS
    • split_video_to_hls 支持其他语言
    • 持久化 HLS 会话
  • 55_telegram4j

    • 数据库设计
    • /zh/55_telegram4j/02.html
    • 基于 MTProto 协议开发 Telegram 翻译机器人
    • 过滤旧消息
    • 保存机器人消息
    • 定时推送
    • 增加命令菜单
    • 使用 telegram-Client
    • 使用自定义 StoreLayout
    • 延迟测试
    • Reactor 错误处理
    • Telegram4J 常见错误处理指南
  • 56_telegram-bots

    • TelegramBots 入门指南
    • 使用工具库 telegram-bot-base 开发翻译机器人
  • 60_LLM

    • 简介
    • AI 问答
    • /zh/60_LLM/03.html
    • /zh/60_LLM/04.html
    • 增强检索(RAG)
    • 结构化数据检索
    • 搜索+AI
    • 集成第三方 API
    • 后置处理
    • 推荐问题生成
    • 连接代码执行器
    • 避免 GPT 混乱
    • /zh/60_LLM/13.html
  • 61_ai_agent

    • 数据库设计
    • 示例问题管理
    • 会话管理
    • 历史记录
    • 对接 Perplexity API
    • 意图识别与生成提示词
    • 智能问答模块设计与实现
    • 文件上传与解析文档
    • 翻译
    • 名人搜索功能实现
    • Ai studio gemini youbue 问答使用说明
    • 自建 YouTube 字幕问答系统
    • 自建 获取 youtube 字幕服务
    • 通用搜索
    • /zh/61_ai_agent/15.html
    • 16
    • 17
    • 18
    • 在 tio-boot 应用中整合 ai-agent
    • 16
  • 62_translator

    • 简介
  • 63_knowlege_base

    • 数据库设计
    • 用户登录实现
    • 模型管理
    • 知识库管理
    • 文档拆分
    • 片段向量
    • 命中测试
    • 文档管理
    • 片段管理
    • 问题管理
    • 应用管理
    • 向量检索
    • 推理问答
    • 问答模块
    • 统计分析
    • 用户管理
    • api 管理
    • 存储文件到 S3
    • 文档解析优化
    • 片段汇总
    • 段落分块与检索
    • 多文档解析
    • 对话日志
    • 检索性能优化
    • Milvus
    • 文档解析方案和费用对比
    • 离线运行向量模型
  • 64_ai-search

    • ai-search 项目简介
    • ai-search 数据库文档
    • ai-search SearxNG 搜索引擎
    • ai-search Jina Reader API
    • ai-search Jina Search API
    • ai-search 搜索、重排与读取内容
    • ai-search PDF 文件处理
    • ai-search 推理问答
    • Google Custom Search JSON API
    • ai-search 意图识别
    • ai-search 问题重写
    • ai-search 系统 API 接口 WebSocket 版本
    • ai-search 搜索代码实现 WebSocket 版本
    • ai-search 生成建议问
    • ai-search 生成问题标题
    • ai-search 历史记录
    • Discover API
    • 翻译
    • Tavily Search API 文档
    • 对接 Tavily Search
    • 火山引擎 DeepSeek
    • 对接 火山引擎 DeepSeek
    • ai-search 搜索代码实现 SSE 版本
    • jar 包部署
    • Docker 部署
    • 爬取一个静态网站的所有数据
    • 网页数据预处理
    • 网页数据检索与问答流程整合
  • 65_java-linux

    • Java 执行 python 代码
    • 通过大模型执行 Python 代码
    • MCP 协议
    • Cline 提示词
    • Cline 提示词-中文版本
  • 66_manim

    • 简介
    • Manim 开发环境搭建
    • 生成场景提示词
    • 生成代码
    • 完整脚本示例
    • 语音合成系统
    • Fish.audio TTS 接口说明文档与 Java 客户端封装
    • 整合 fishaudio 到 java-uni-ai-server 项目
    • 执行 Python (Manim) 代码
    • 使用 SSE 流式传输生成进度的实现文档
    • 整合全流程完整文档
    • HLS 动态推流技术文档
    • manim 分场景生成代码
    • 分场景运行代码及流式播放支持
    • 分场景业务端完整实现流程
    • Maiim布局管理器
    • 仅仅生成场景代码
    • 使用 modal 运行 manim 代码
    • Python 使用 Modal GPU 加速渲染
    • Modal 平台 GPU 环境下运行 Manim
    • Modal Manim OpenGL 安装与使用
    • 优化 GPU 加速
    • 生成视频封面流程
    • Java 调用 manim 命令 执行代码 生成封面
    • Manim 图像生成服务客户端文档
    • manim render help
    • 显示 中文公式
    • manimgl
    • EGL
    • /zh/66_manim/30.html
    • /zh/66_manim/31.html
    • 成本核算
    • /zh/66_manim/33.html
  • 70_tio-boot-admin

    • 入门指南
    • 初始化数据
    • token 存储
    • 与前端集成
    • 文件上传
    • 网络请求
    • 图片管理
    • /zh/70_tio-boot-admin/08.html
    • Word 管理
    • PDF 管理
    • 文章管理
    • 富文本编辑器
  • 71_tio-boot

    • /zh/71_tio-boot/01.html
    • Swagger 整合到 Tio-Boot 中的指南
    • HTTP/1.1 Pipelining 性能测试报告
  • 80_性能测试

    • 压力测试 - tio-http-serer
    • 压力测试 - tio-boot
    • 压力测试 - tio-boot-native
    • 压力测试 - netty-boot
    • 性能测试对比
    • TechEmpower FrameworkBenchmarks
    • 压力测试 - tio-boot 12 C 32G
  • 99_案例

    • 封装 IP 查询服务
    • tio-boot 案例 - 全局异常捕获与企业微信群通知
    • tio-boot 案例 - 文件上传和下载
    • tio-boot 案例 - 整合 ant design pro 增删改查
    • tio-boot 案例 - 流失响应
    • tio-boot 案例 - 增强检索
    • tio-boot 案例 - 整合 function call
    • tio-boot 案例 - 定时任务 监控 PostgreSQL、Redis 和 Elasticsearch
    • Tio-Boot 案例:使用 SQLite 整合到登录注册系统
    • tio-boot 案例 - 执行 shell 命令

PostgreSQL 向量

  • 余弦相似度与余弦距离
    • 什么是余弦相似度
    • 余弦相似度公式
  • 使用 PostgreSQL 和 pgvector 扩展来计算向量相似度
    • 1. 安装 pgvector 扩展
    • 2. 创建表并存储向量
    • 3. 计算向量距离与相似度
  • professors 向量化和查询示例
    • 1. 修改表结构添加向量字段
    • 2. 数据插入示例
    • 3. 计算相似度的 SQL 查询
    • 4. <#> and <=>
  • 使用代码操作向量数据库
    • 1. 使用代码插入数据
    • 2.查询数据
    • 3. Java 向量查询
    • 4. 使用 Db 工具类进行向量查询
    • 5. 合并查询参数
    • 6. db 工具类存储向量 和 查询向量示例
    • 7.直接查询获取向量对象 PGobject

余弦相似度与余弦距离

什么是余弦相似度

余弦相似度用于衡量两个向量之间的相似程度。具体来说:

  • 余弦相似度为 1:表示两个向量完全相同。
  • 余弦相似度为 0:表示两个向量正交(没有相似性)。
  • 余弦相似度为 -1:表示两个向量完全相反。

注意:在 pgvector 扩展中,运算符 <=> 实际上计算的是余弦距离,定义为
[ \text{cosine_distance} = 1 - \text{cosine_similarity} ] 因此:

  • 当余弦相似度为 1 时,余弦距离为 0;
  • 当余弦相似度为 0 时,余弦距离为 1;
  • 当余弦相似度为 -1 时,余弦距离为 2。

余弦相似度公式

余弦相似度的数学定义为: [ \text{cosine_similarity} = \frac{\vec{A} \cdot \vec{B}}{|\vec{A}| |\vec{B}|} ] 其中:

  • (\vec{A} \cdot \vec{B}) 为向量点积
  • (|\vec{A}|) 和 (|\vec{B}|) 为向量的范数

使用 PostgreSQL 和 pgvector 扩展来计算向量相似度

在 PostgreSQL 中,使用 pgvector 扩展可以方便地存储向量并计算向量之间的相似度或距离。

1. 安装 pgvector 扩展

确保已安装该扩展:

CREATE EXTENSION IF NOT EXISTS vector;
-- 欧氏距离 0, 两个向量完全相同,距离自是 0
SELECT '[1, 2, 3]' <=> '[1, 2, 3]' AS similarity;
-- 两个向量的内积 -14
SELECT '[1, 2, 3]' <#> '[1, 2, 3]' AS similarity;

2. 创建表并存储向量

下面创建一个示例表,假设向量维度为 3:

CREATE TABLE embeddings (
    id serial PRIMARY KEY,
    embedding vector(3)
);

插入示例数据:

INSERT INTO embeddings (embedding) VALUES
    ('[1, 2, 3]'),
    ('[4, 5, 6]');

3. 计算向量距离与相似度

(1)使用 <=> 计算余弦距离

下面查询计算向量 [1, 2, 3] 与表中向量之间的余弦距离(注意:值越小表示越相似):

SELECT
    id,
    embedding,
    (embedding <=> '[1, 2, 3]') AS cosine_distance
FROM
    embeddings
ORDER BY
    cosine_distance ASC;

(2)计算余弦相似度

如果需要得到余弦相似度,则可用公式 cosine_similarity = 1 - cosine_distance:

WITH input_vector AS (
    SELECT '[1, 2, 3]'::vector(3) AS embedding
)
SELECT
    e.id,
    e.embedding,
    (1 - (e.embedding <=> iv.embedding)) AS cosine_similarity
FROM
    embeddings e,
    input_vector iv
ORDER BY
    cosine_similarity DESC;

在这个示例中:

  • e.embedding <=> iv.embedding 得到的是余弦距离;
  • 1 - (e.embedding <=> iv.embedding) 则转换为余弦相似度(值越大越相似)。

professors 向量化和查询示例

假设有一张教授信息表,需要为姓名、描述和备注添加向量字段(维度 1536),并进行相似度查询。

1. 修改表结构添加向量字段

CREATE TABLE rumi_sjsu_professors(
  id BIGINT NOT NULL,
  name VARCHAR(256),
  department VARCHAR(256),
  job_title VARCHAR(256),
  email VARCHAR(256),
  description TEXT,
  files JSON,
  remark VARCHAR(256),
  name_vector VECTOR(1536),
  description_vector VECTOR(1536),
  remark_vector VECTOR(1536),
  vectors_completed BOOLEAN DEFAULT FALSE,
  creator VARCHAR(64) DEFAULT '',
  create_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updater VARCHAR(64) DEFAULT '',
  update_time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
  deleted SMALLINT DEFAULT 0,
  tenant_id BIGINT NOT NULL DEFAULT 0,
  PRIMARY KEY (id)
);

2. 数据插入示例

下面是插入包含向量数据的示例语句:

-- 示例1
INSERT INTO rumi_sjsu_professors (
  id, name, department, job_title, email, description, files, remark, name_vector, description_vector, remark_vector, vectors_completed
) VALUES (
  1,
  'Dr. John Doe',
  'Computer Science',
  'Professor',
  'jdoe@sjsu.edu',
  'Expert in artificial intelligence and machine learning.',
  '{"resume": "link_to_resume.pdf"}',
  'Well-known researcher',
  '[0.1, 0.2, 0.3, ...]',  -- 1536维向量
  '[0.1, 0.2, 0.3, ...]',  -- 1536维向量
  '[0.1, 0.2, 0.3, ...]',  -- 1536维向量
  TRUE
);

-- 示例2
INSERT INTO rumi_sjsu_professors (
  id, name, department, job_title, email, description, files, remark, name_vector, description_vector, remark_vector, vectors_completed
) VALUES (
  2,
  'Dr. Jane Smith',
  'Mathematics',
  'Associate Professor',
  'jsmith@sjsu.edu',
  'Specializes in algebraic topology and number theory.',
  '{"cv": "link_to_cv.pdf"}',
  'Renowned academic',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  TRUE
);

-- 示例3
INSERT INTO rumi_sjsu_professors (
  id, name, department, job_title, email, description, files, remark, name_vector, description_vector, remark_vector, vectors_completed
) VALUES (
  3,
  'Dr. Emily Zhang',
  'Physics',
  'Assistant Professor',
  'ezhang@sjsu.edu',
  'Researcher in quantum mechanics and particle physics.',
  '{"portfolio": "link_to_portfolio.pdf"}',
  'Emerging scientist',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  '[0.1, 0.2, 0.3, ...]',
  TRUE
);

3. 计算相似度的 SQL 查询

假设我们希望计算输入向量与三个向量字段的余弦相似度(需转换为 1 - (<=>))并检索相似度最高的三条记录,可按如下方式查询:

SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1 - (name_vector <=> input_vector)) AS name_similarity,
  (1 - (description_vector <=> input_vector)) AS description_similarity,
  (1 - (remark_vector <=> input_vector)) AS remark_similarity
FROM
  rumi_sjsu_professors,
  LATERAL (
    VALUES (
      ARRAY[0.1, 0.2, 0.3, ...]::VECTOR(1536)  -- 替换为实际输入向量
    )
  ) AS input(input_vector)
ORDER BY
  GREATEST(
    1 - (name_vector <=> input_vector),
    1 - (description_vector <=> input_vector),
    1 - (remark_vector <=> input_vector)
  ) DESC
LIMIT 3;

说明:

  • 在 SELECT 子句中,我们分别计算三个字段的余弦相似度;
  • ORDER BY 中使用了 GREATEST(...) DESC,确保返回的记录中至少有一个字段的相似度最高;
  • 如果需要在 WHERE 子句中过滤出相似度较高的记录,不能直接引用 SELECT 的别名,而需要重新计算。例如:
SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1 - (name_vector <=> input_vector)) AS name_similarity,
  (1 - (description_vector <=> input_vector)) AS description_similarity,
  (1 - (remark_vector <=> input_vector)) AS remark_similarity
FROM
  rumi_sjsu_professors,
  LATERAL (
    VALUES (
      ARRAY[0.1, 0.2, 0.3, ...]::VECTOR(1536)  -- 替换为实际输入向量
    )
  ) AS input(input_vector)
WHERE
  (1 - (name_vector <=> input_vector)) > 0.9
  OR (1 - (description_vector <=> input_vector)) > 0.9
  OR (1 - (remark_vector <=> input_vector)) > 0.9
ORDER BY
  GREATEST(
    1 - (name_vector <=> input_vector),
    1 - (description_vector <=> input_vector),
    1 - (remark_vector <=> input_vector)
  ) DESC
LIMIT 3;

4. <#> and <=>

在 pgvector 扩展中,提供了不同的距离(或相似度)运算符,它们对应不同的度量方式。具体来说:

  1. <#> 运算符(余弦距离)

    • 计算内容: 它计算的是余弦距离,定义为 [ \text{cosine_distance}(v,w)=1-\frac{v\cdot w}{|v||w|} ] 也就是 1 减去余弦相似度。
    • 取值范围: 余弦相似度的取值范围为 ([-1,1]),因此余弦距离的范围为 ([0,2])
      • 当两个向量方向完全一致时,余弦相似度为 1,对应余弦距离 0;
      • 当两个向量方向完全相反时,余弦相似度为 –1,对应余弦距离 2。
    • 读法: 读作“余弦距离”。
  2. <=> 运算符(内积距离)

    • 计算内容: 它计算的是内积距离,通常定义为负的内积: [ \text{inner_product_distance}(v,w) = - (v\cdot w) ] 这样设计的目的是使得相似(内积较大)的向量其“距离”较小。
    • 取值范围: 内积本身没有固定的上下界(除非向量做了归一化处理),因此:
      • 若向量未经归一化,其内积可能为任意实数,所以内积距离理论上取值范围为 ((-\infty,,+\infty));
      • 若向量都做了单位归一化,那么内积的范围就是 ([-1,1]),对应的内积距离范围为 ([-1,1])。
    • 读法: 读作“内积距离”。

总结一下:

  • <#>: 计算余弦距离,范围 [0, 2],读作“余弦距离”。
  • <=>: 计算内积距离(即负内积),范围取决于向量是否归一化,未归一化时理论上无界,读作“内积距离”。

使用代码操作向量数据库

1. 使用代码插入数据

如何使用代码代替上面的 INSERT INTO rumi_sjsu_professors 语句

import java.sql.SQLException;
import java.util.Arrays;

import org.junit.Test;
import org.postgresql.util.PGobject;

import com.litongjava.jfinal.plugin.activerecord.Db;
import com.litongjava.jfinal.plugin.activerecord.Row;
import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.openai.client.OpenAiClient;
import com.litongjava.openai.consts.OpenAiModels;
import com.litongjava.openai.embedding.EmbeddingRequestVo;
import com.litongjava.openai.embedding.EmbeddingResponseVo;
import com.litongjava.tio.utils.environment.EnvUtils;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class SjsuProfessorsTest {

  @Test
  public void testInsertDrEmilyZhang() {
    EnvUtils.load();
    new DbConfig().config();

    int id = 3;
    String name = "Dr. Emily Zhang";
    String description = "Researcher in quantum mechanics and particle physics.";
    String remark = "Emerging scientist";

    Row row = new Row();
    row.set("id", id).set("name", name).set("department", "Physics").set("job_title", "Associate Professor")
        .set("email", "ezhang@sjsu.edu").set("description", description).set("remark", remark);

    setNameVector(name, row);
    setDescriptionVector(description, row);
    setRemarkVector(remark, row);

    row.setTableName("rumi_sjsu_professors");
    boolean save = Db.save(row);
    if (save) {
      log.info("success");
    }

  }

  @Test
  public void testInsertDrJaneSmith() {
    EnvUtils.load();
    new DbConfig().config();

    int id = 2;
    String name = "Dr. Jane Smith";
    String description = "Specializes in algebraic topology and number theory.";
    String remark = "Renowned academic";

    Row row = new Row();
    row.set("id", id).set("name", name).set("department", "Mathematics").set("job_title", "Associate Professor")
        .set("email", "jsmith@sjsu.edu").set("description", description).set("remark", remark);

    setNameVector(name, row);
    setDescriptionVector(description, row);
    setRemarkVector(remark, row);

    row.setTableName("rumi_sjsu_professors");
    boolean save = Db.save(row);
    if (save) {
      log.info("success");
    }

  }

  @Test
  public void testInsertByRecord() {
    EnvUtils.load();
    new DbConfig().config();

    String name = "Dr. John Doe";
    String description = "Expert in artificial intelligence and machine learning.";
    String remark = "Well-known researcher";

    Row row = new Row();
    row.set("id", 1).set("name", name).set("department", "Computer Science").set("job_title", "Professor")
        .set("email", "jdoe@sjsu.edu").set("description", description).set("remark", remark);

    setNameVector(name, row);
    setDescriptionVector(description, row);
    setRemarkVector(remark, row);

    row.setTableName("rumi_sjsu_professors");
    boolean save = Db.save(row);
    if (save) {
      log.info("success");
    }
  }

  private void setRemarkVector(String description, Row row) {
    PGobject nameVector = getPgVector(description);
    row.set("remark_vector", nameVector);
  }

  private void setDescriptionVector(String description, Row row) {
    PGobject nameVector = getPgVector(description);
    row.set("description_vector", nameVector);
  }

  private void setNameVector(String name, Row row) {
    PGobject nameVector = getPgVector(name);
    row.set("name_vector", nameVector);
  }

  private PGobject getPgVector(String description) {
    EmbeddingRequestVo reoVo = new EmbeddingRequestVo(description, OpenAiModels.text_embedding_3_small);
    EmbeddingResponseVo respVo = OpenAiClient.embeddings(reoVo);
    Float[] embedding = respVo.getData().get(0).getEmbedding();
    String vectorString = Arrays.toString(embedding);

    // 使用PGobject来设置vector类型
    PGobject nameVector = new PGobject();
    nameVector.setType("vector");
    try {
      nameVector.setValue(vectorString);
    } catch (SQLException e) {
      e.printStackTrace();
    }
    return nameVector;
  }
}

插入其他的数据示例省略

2.查询数据

输出结果如下,为了方便展示,我省略了 vector 的 value 部分

import org.junit.Test;

import com.litongjava.jfinal.plugin.activerecord.Db;
import com.litongjava.jfinal.plugin.activerecord.Row;
import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.json.JsonUtils;

public class SjsuProfessorsQueryTest {

  @Test
  public void testQuery() {
    EnvUtils.load();
    new DbConfig().config();
    int id = 3;
    Row row = Db.findById("rumi_sjsu_professors", "id", id);
    String json = JsonUtils.toJson(row.toMap());
    System.out.println(json);
  }

}

{
  "id": 3,
  "name": "Dr. Emily Zhang",
  "department": "Physics",
  "job_title": "Associate Professor",
  "email": "ezhang@sjsu.edu",
  "description": "Researcher in quantum mechanics and particle physics.",
  "remark": "Emerging scientist",
  "name_vector": [],
  "description_vector": [],
  "remark_vector": {
    "value": "[]",
    "type": "vector",
    "null": true
  },
  "vectors_completed": false,
  "creator": "",
  "create_time": "2024-07-03 23:29:44",
  "updater": "",
  "update_time": "2024-07-03 23:29:44",
  "deleted": 0,
  "tenant_id": 0
}

3. Java 向量查询

在 Java 中使用余弦相似度进行查询,并将输入向量传递给 SQL 查询.

  1. 确保 PostgreSQL 数据库已配置好 pgvector 扩展:
CREATE EXTENSION IF NOT EXISTS vector;
  1. 创建包含向量的表:
CREATE TABLE vector_test (
   id SERIAL PRIMARY KEY,
   name TEXT,
   embedding VECTOR(1536)
);
  1. 在 Java 中构建查询并传递向量参数:

可以使用 PreparedStatement 来构建和执行查询。以下是一个示例代码,展示如何将向量传递给 SQL 查询并执行查询。

package com.litongjava.open.chat.model;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Arrays;

import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.openai.client.OpenAiClient;
import com.litongjava.openai.consts.OpenAiModels;
import com.litongjava.openai.embedding.EmbeddingRequestVo;
import com.litongjava.openai.embedding.EmbeddingResponseVo;
import com.litongjava.tio.utils.dsn.DbDSNParser;
import com.litongjava.tio.utils.dsn.JdbcInfo;
import com.litongjava.tio.utils.environment.EnvUtils;

public class VectorSearchTest {

  public static void main(String[] args) throws SQLException {
    // 示例输入
    EnvUtils.load();
    new DbConfig().config();
    String question = "Jane Smith";
    EmbeddingRequestVo reoVo = new EmbeddingRequestVo(question, OpenAiModels.text_embedding_3_small);
    EmbeddingResponseVo respVo = OpenAiClient.embeddings(reoVo);
    Float[] embedding = respVo.getData().get(0).getEmbedding();

    // 转换嵌入向量为 SQL 可用的字符串
    String vectorString = Arrays.toString(embedding);

    String dsn = EnvUtils.get("DATABASE_DSN");

    JdbcInfo jdbc = new DbDSNParser().parse(dsn);

    // PostgreSQL 连接配置
    String url = jdbc.getUrl();
    String user = jdbc.getUser();
    String password = jdbc.getPswd();

    // SQL 查询
    String sql = "SELECT * FROM vector_test ORDER BY embedding <=> ? LIMIT 10";

    try (Connection conn = DriverManager.getConnection(url, user, password);
        PreparedStatement pstmt = conn.prepareStatement(sql)) {

      // 设置向量参数
      pstmt.setObject(1, vectorString, java.sql.Types.OTHER);

      // 执行查询
      try (ResultSet rs = pstmt.executeQuery()) {
        while (rs.next()) {
          // 处理查询结果
          int id = rs.getInt("id");
          String name = rs.getString("name");
          // 继续处理其他字段
          System.out.println("ID: " + id + ", Name: " + name);
        }
      }
    }
  }
}

解释:

  1. 获取嵌入向量:

    • 调用 OpenAiClient.embeddings 函数来获取输入问题的嵌入向量。
  2. 转换嵌入向量:

    • 将 Java 中的数组转换为 PostgreSQL 可用的 [] 格式字符串。
  3. 建立数据库连接和执行查询:

    • 使用 DriverManager 来建立数据库连接。
    • 使用 PreparedStatement 来构建和执行查询,并传递向量参数。
    • 处理查询结果。

4. 使用 Db 工具类进行向量查询

package com.litongjava.open.chat.model;

import java.util.Arrays;
import java.util.List;

import org.junit.Test;

import com.litongjava.jfinal.plugin.activerecord.Db;
import com.litongjava.jfinal.plugin.activerecord.Row;
import com.litongjava.jfinal.plugin.template.SqlTemplates;
import com.litongjava.open.chat.config.SqlTplsConfig;
import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.openai.client.OpenAiClient;
import com.litongjava.openai.consts.OpenAiModels;
import com.litongjava.openai.embedding.EmbeddingRequestVo;
import com.litongjava.openai.embedding.EmbeddingResponseVo;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.json.JsonUtils;

public class SjsuProfessorsSearchTest {

  @Test
  public void searchTest() {
    EnvUtils.load();
    new DbConfig().config();
    new SqlTplsConfig().config();
    String question = "Jane Smith";
    EmbeddingRequestVo reoVo = new EmbeddingRequestVo(question, OpenAiModels.text_embedding_3_small);
    EmbeddingResponseVo respVo = OpenAiClient.embeddings(reoVo);
    Float[] embedding = respVo.getData().get(0).getEmbedding();
    String string = Arrays.toString(embedding);

    String sql = SqlTemplates.get("professor.vector_search");

    List<Row> records = Db.find(sql, string, string, string, string, string, string);
    String json = JsonUtils.toJson(records);
    System.out.println(json);
  }
}

String sql = SqlTemplates.get("professor.vector_search"); 返回的 sql 语句如下

SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1-(name_vector <=> ?)) AS name_similarity,
  (1-(description_vector <=> ?)) AS description_similarity,
  (1-(remark_vector <=> ?)) AS remark_similarity
FROM
  rumi_sjsu_professors
ORDER BY
  GREATEST(
    1-(name_vector <=> ?),
    1-(description_vector <=> ?),
    1-(remark_vector <=> ?)
  ) DESC
LIMIT 3;

5. 合并查询参数

在上面的示例中 6 个查询参数都是相同的,能否合并为一个查询参数

SELECT
  id,
  name,
  department,
  job_title,
  email,
  description,
  remark,
  (1-(name_vector <=> ?)) AS name_similarity,
  (1-(description_vector <=> ?)) AS description_similarity,
  (1-(remark_vector <=> ?)) AS remark_similarity
FROM
  rumi_sjsu_professors,
  LATERAL (
    VALUES (
      ?::VECTOR(1536)
    )
  ) AS input(input_vector)
ORDER BY
  GREATEST(
    1-(name_vector <=> ?),
    1-(description_vector <=> ?),
    1-(remark_vector <=> ?)
  ) DESC
LIMIT 3;

查询时只用传入一个参数

List<Row> records = Db.find(sql, string);

SQL 语句解释: 这个 SQL 语句是在进行向量相似度搜索。它从 rumi_sjsu_professors 表中选择数据,并计算输入向量与表中存储的向量之间的相似度。

  • 选择字段包括 id, name, department, job_title, email, description, remark。
  • 计算输入向量与 name_vector, description_vector, remark_vector 的相似度。
  • 使用 LATERAL 子句创建一个临时的输入向量。
  • 按最大相似度降序排序。
  • 限制返回前 3 条结果。

<==> 运算符:

  • <==> 是 PostgreSQL 中用于计算向量距离的运算符。它返回两个向量之间的余弦距离。值越小表示向量越相似。
  • 1 - 余弦距离,得到的是余弦相似度

6. db 工具类存储向量 和 查询向量示例

CREATE TABLE rumi_embedding (id bigint PRIMARY KEY,t text, v vector(1536));
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import org.junit.Test;
import org.postgresql.util.PGobject;

import com.litongjava.data.utils.SnowflakeIdUtils;
import com.litongjava.jfinal.plugin.activerecord.Db;
import com.litongjava.jfinal.plugin.activerecord.Row;
import com.litongjava.jfinal.plugin.utils.PgVectorUtils;
import com.litongjava.open.chat.config.DbConfig;
import com.litongjava.openai.client.OpenAiClient;
import com.litongjava.tio.utils.environment.EnvUtils;
import com.litongjava.tio.utils.json.JsonUtils;

public class VectorTest {

  @Test
  public void testSave() {
    EnvUtils.load();
    new DbConfig().config();
    long id = SnowflakeIdUtils.id();

    String name = "Dr. John Doe";
    Float[] embeddingArray = OpenAiClient.embeddingArray(name);
    PGobject pgVector = PgVectorUtils.getPgVector(Arrays.toString(embeddingArray));
    Row row = new Row().set("t", name).set("v", pgVector).set("id", id).setTableName("rumi_embedding");
    Db.save(row);
  }

  @Test
  public void testQuery() {
    EnvUtils.load();
    new DbConfig().config();
    String sql = "select * from rumi_embedding";
    List<Row> records = Db.find(sql);
    List<Map<String, Object>> collect = records.stream().map((e) -> e.toMap()).collect(Collectors.toList());
    String json = JsonUtils.toJson(collect);
    System.out.println(json);
  }
}

output

[{"id":398392108312608768,"t":"Dr. John Doe","v":"[0.016610185,-0.010182072,-0.0007115674,0.030582452,0.0014376289,-0.042989362,0.0058700917,0.01898721,-0.040525373,-0.06777419,0.040989183,-0.023726765,-0.008565986,0.013827327,0.0125373565,0.024596408,-0.03901799,-0.012877966,-0.017218936,0.04638097,0.009892192,0.020436615,0.051106032,-0.07919551,-0.023915188,-0.010290778,0.044148885,-0.021436704,0.021697598,0.009848709,0.040612336,-0.008551491,0.021436704,0.0265676,-0.0185234,-0.0052613416,0.012117028,0.0107835755,0.025915368,-0.031133227,0.031423107,-0.045830198,-0.019219115,0.0039351354,0.0041380525,-0.025219653,0.011334349,-0.013030154,0.06000538,0.029669328,-0.021567151,0.008913843,0.02210343,0.050207403,-0.028161945,0.03324936,0.011885123,-0.020581556,0.027263314,-0.019711912,0.01805959,-0.015813012,-0.030553464,0.0029875867,-0.010493695,-0.008029706,-0.008326834,0.004572874,0.0045547565,-0.017436346,0.0017900156,0.0714267,-0.038641147,0.025799414,0.0041380525,-0.03264061,-0.010971999,0.027799595,-0.044177875,0.023219474,0.009587816,0.028611261,-8.7403105e-06,-0.012088041,-0.0048156492,-0.006091126,-0.027350279,-0.007957235,-0.005399035,-0.049250793,-0.0044061923,-0.0070114983,-0.053946868,0.013479469,-0.004286616,-0.0018144744,0.020581556,0.0070984624,0.025915368,-0.029205518,-0.006529571,-0.013464975,0.022552747,0.033974063,-0.0045076506,0.01630581,-0.014334619,-0.022480277,-0.02474135,0.020103252,-0.008594974,0.0055874577,-0.0011894183,-0.024929771,-0.06899169,-0.003313703,-0.009971908,0.0056309397,-0.03536549,-0.038351264,-0.032727573,0.014385348,0.026132777,-0.048613057,0.015668072,0.0238862,-0.02810397,-0.008660197,-0.08087682,-0.015842,0.04365609,-0.037539598,-0.00025726945,-0.017045006,-0.033307336,0.03640906,-0.0036615601,-0.0034423377,-0.025582004,-0.011254633,0.008573232,0.032698583,0.01335627,0.0031886918,0.043076325,-0.021567151,0.0022954957,0.02832138,0.029509893,0.040989183,-0.01669715,0.033597216,-0.01716096,0.013921538,-0.047047697,-0.011385079,0.0667886,0.026886469,-0.007051357,0.04365609,-0.0039568767,-0.013928785,0.008392056,-0.0061708433,-0.037278704,0.0728761,0.027625665,-0.073223956,-0.036525015,0.047105674,-0.010211061,0.025089206,-0.00892109,0.0059027034,-0.041539956,0.04029347,0.013146106,-0.019566972,-0.0052142357,0.009015301,0.0263212,0.04406192,0.02527763,-0.006203455,0.012247475,-0.05388889,-0.05113502,-0.0025944356,0.031915907,0.0077253305,0.045540314,-0.0009819721,0.048294187,0.023523849,-0.022291854,-0.017102983,-0.017349381,0.014523041,0.026582094,-0.02817644,-0.022393312,-0.028263405,0.032031856,-0.047801387,-0.0035800312,-0.024915278,0.01240691,0.009921179,0.037249718,-0.073513836,0.110328734,-0.0056707985,0.01691456,0.0031361508,-0.024263045,-0.03858317,-0.008508009,0.012530109,0.04452573,-0.024451468,-0.008899349,0.0394818,0.002822717,0.04287341,0.050294366,-0.00818914,0.009892192,-0.022871615,-0.00610562,-0.013805586,0.004065582,0.028437333,0.01952349,-0.026190754,-0.015450661,0.004623603,-0.005859221,-0.016958043,0.019349562,0.008747161,-0.013305541,-0.022320842,-0.009247206,0.01866834,0.007790554,-0.0058193626,-0.037713528,-0.08522503,0.013834574,0.031307153,-0.0057541393,-0.028509803,0.0740936,-0.003150645,-0.017363876,0.016334798,-0.022393312,-0.014269396,0.018030602,-0.0061780903,0.020407626,-0.008058693,-0.0018180978,0.0086746905,-0.05820812,0.028147452,0.010863293,-0.026509624,0.0077543184,0.06046919,0.011885123,0.001228371,0.023451379,0.037423644,-0.06655669,0.0072542736,0.027466232,0.025625486,-0.030350547,-0.02793004,-0.011986583,0.050120436,0.02037864,-0.015175274,-0.032843526,-0.032234773,0.02113233,0.025045725,-0.055918057,-0.002985775,0.021088848,-0.050352342,0.009841463,-0.029828763,-0.026277719,-0.024857301,0.005428023,-0.038351264,-0.01382008,0.0141317025,0.015885482,0.059657525,-0.019219115,0.040815253,-0.02810397,0.06586098,0.005217859,-0.043308232,0.017450841,-0.02137873,-0.013747609,0.0358293,0.0084427865,0.019494502,-0.00058247976,-0.036930848,-0.0013144294,0.013030154,-0.02227736,-0.006783217,-0.034437872,-0.044351805,-0.008283352,-0.02710388,-0.00449678,0.033307336,0.04530841,-0.012240228,0.038989004,-0.006337525,0.007080345,-0.027045904,-0.022915099,-0.0111024445,-0.018624859,0.02793004,-0.01913215,0.04469966,0.003782948,0.02756769,-0.035423465,0.024625396,0.0140085025,-0.023118015,0.021103341,0.013950527,0.028408345,-0.025132688,-0.013936033,0.017045006,-0.018929234,0.02495876,-0.030814357,0.0147477,-0.031568047,0.023784742,0.029234506,-0.022262866,0.0112618795,0.007834036,0.0015599225,0.023335425,0.02724882,0.07623872,0.0075296606,0.04901889,-0.048033293,-0.023770247,0.010544424,0.010609647,0.022262866,0.039568767,-0.016943548,0.069803365,-0.029741798,0.02739376,-0.056410857,0.039626744,0.01147929,0.033945072,0.01805959,0.03429293,0.046265017,-0.048294187,-0.00784853,0.016537715,0.003007516,0.022407807,-0.0054678814,-0.022610724,0.03600323,0.0023806482,0.040177517,-0.019291585,-0.0621505,-0.0030709275,-0.012153264,0.08655848,0.005598328,-0.008696432,0.04182984,-0.004333722,8.0396705e-05,0.005688916,-0.008928337,0.015189768,-0.06933955,-0.011080704,0.0077543184,-0.029770786,0.01808858,-0.07276015,0.037278704,0.048642043,-0.018943727,0.02968382,0.01791465,-0.028901143,0.01455203,-0.018552389,-0.0008773432,-0.0033372557,0.01813206,-0.0128562255,0.017146464,0.03640906,0.016131882,-0.023625307,0.04148198,-0.00037775128,0.03182894,0.058498,-0.034524836,-0.0014258525,-0.0175523,0.0053120707,-0.011783665,0.018784294,-0.033800133,0.019784383,-0.028654743,0.05116401,0.0131750945,-0.017639263,-0.008196387,0.021726586,0.010971999,0.015581108,0.020103252,-0.02066852,-0.012667803,-0.06342598,-0.021030871,0.00076818484,0.03843823,0.013385259,0.039162934,0.020335156,0.010515436,-0.01645075,0.016740631,-0.06412169,-0.013798338,0.025625486,-0.024335515,0.012327192,-0.013095377,0.027988017,-0.029408434,0.014233161,0.021103341,-0.0052033653,-0.055454247,0.021335246,-0.009239959,0.047192637,-0.02810397,0.023871707,0.026669059,0.012559097,-0.0031470214,-0.015421673,-0.013196835,0.042061742,0.0065875473,0.00838481,0.010863293,0.02985775,-0.0068448167,0.008109422,0.012356181,0.0073992144,0.032118823,-0.017465334,-0.025335606,-0.026451647,0.05156984,-0.0077398247,0.009884944,-0.058295082,0.01591447,0.016146375,-0.007551402,0.02005977,0.042554542,0.012638815,-0.020654026,0.07073098,0.020001793,0.016334798,0.0018026979,-0.0018950974,-0.0238862,-0.04368508,-0.012827237,0.005913574,0.013754857,-0.036843885,0.0064208657,0.0025636356,-0.016900066,0.005257718,-0.01774072,0.023161497,0.009109513,-0.03385811,-0.03446686,0.05510639,0.031133227,0.012196746,0.02137873,-0.012348933,0.002540083,-0.0099864025,-0.025509534,-0.0072107916,0.003618078,-0.023610814,0.007127451,0.0040184762,-0.032234773,0.06052717,0.016653668,-0.04104716,0.0074789315,0.029162036,0.027451737,0.010037132,-0.019161139,0.007892012,-0.0048228963,0.03182894,0.0146245,0.0036742424,-0.024219563,0.049801566,-0.036756918,-0.0064172423,-0.023219474,0.009537087,0.022784652,0.0078122946,-0.011834394,0.0147477,0.017595781,0.018958222,0.014095467,-0.00382643,0.0008877608,-0.018929234,-0.0005072919,-0.0008891196,-0.03901799,-0.020567061,-0.006612912,0.04197478,0.030292572,0.009442876,0.016407268,-0.02163962,-0.0066092885,0.02871272,0.004340969,0.008819631,-0.060875025,0.050497282,0.0071636857,-0.010812564,-0.015407179,-0.011812653,0.013646151,0.025524028,0.012472133,-0.0064208657,0.01616087,-0.056005023,-0.033133406,-0.034553822,0.039916623,-0.026118284,-0.026582094,0.009015301,0.00979798,0.02005977,-0.019407537,0.012269217,-0.0039786175,0.0003075457,0.006199831,-0.009399394,-0.02449495,0.010421224,-0.005420776,-0.025915368,-0.0038155594,0.013421494,-0.034727752,-0.010124097,0.002166861,0.0033300088,-0.026524117,-0.03994561,-0.007058604,0.05649782,0.01428389,0.050468292,0.00068484404,0.0027574936,-0.010805317,-0.002545518,-0.018871257,-0.0035347373,0.005319318,0.0029006223,0.056265917,0.008710926,-0.04301835,-0.014827416,-0.003551043,-0.046612877,0.0060875025,0.01737837,0.013182341,0.008696432,0.030901322,0.024219563,0.013559187,-0.024799325,-0.024335515,0.015552119,-0.016262328,-0.02566897,0.0063230307,-0.012617073,0.010348754,0.0057215276,-0.0069571454,-0.017972626,0.016943548,0.038670134,-0.0007840377,0.0009357723,-0.0021487435,0.0011631477,0.015899977,0.031046262,-0.025828402,0.026813999,-0.022190396,0.04380103,0.037713528,0.033916086,0.015421673,-0.03597424,0.018436436,0.019813372,-0.050642222,-0.049366746,0.020827955,0.012522862,-0.008377563,-0.0123416865,0.023973165,0.024306528,0.018537894,0.013928785,-0.010544424,0.008406551,-0.0056164456,0.022190396,-0.026553106,-0.033307336,-0.00020167117,0.0006187149,0.006098373,-0.0048228963,0.010029885,-0.0045004035,0.042496566,-0.109401114,-0.028132958,-0.035191562,0.014341866,0.01874081,-0.032553643,-0.01408822,0.001704863,0.055309307,0.020291675,0.022987569,-0.0013370764,0.00018378007,0.009210971,0.004601862,0.007790554,0.018639352,-0.049250793,0.0066998764,-0.023871707,-0.00012535091,-0.005859221,0.030205607,0.010645882,-0.012348933,0.0045040273,0.0061237374,0.016668161,-0.013370764,0.001764651,-0.012957684,0.007609378,0.021494681,0.019552479,-0.008225375,-0.011421314,0.007551402,-0.007319497,0.036380075,0.004667085,0.015639083,-0.023900693,-0.0039786175,-0.029263495,0.0023498484,-0.01408822,0.027538702,-0.0008094023,-0.042612515,-0.05249746,0.014667982,-0.033974063,0.011761924,-0.053077225,0.007935494,0.007949988,-0.020422122,0.055338297,-0.0046815793,0.022117926,0.019943817,0.014472312,0.020407626,0.015856495,0.007609378,0.006866558,-0.015131792,-0.0040836995,0.0304665,-0.013262059,-0.022233877,0.013406999,0.0048192726,-0.01630581,-0.024089117,0.043076325,-0.013291047,-0.038351264,0.0411921,-0.045569304,-0.02549504,0.021407716,-0.026002333,-0.007978977,0.014972357,-0.005815739,-0.020683015,0.014059232,0.034032036,-0.020856943,-0.024407987,0.012066299,0.022074442,-0.019581467,-0.0077035893,0.025726944,-0.013863562,0.010131343,-0.073571816,0.0029658456,-0.022407807,-0.018552389,0.022726675,0.0132113295,0.06470145,0.062904194,-0.0020400381,0.014508547,-0.042931385,-0.04391698,0.02427754,0.007913753,0.016508726,0.021726586,-0.036959834,-0.016508726,-0.047859363,-0.010971999,-0.041250076,-0.025147183,-0.037858468,-0.008500762,-0.012718532,0.011689454,0.030582452,-0.00074417907,0.025509534,-0.02785757,0.014733206,-0.026379177,-0.022755664,-0.0026415412,-0.010008144,-0.039307874,0.0212048,0.0022918722,0.013841821,-0.023291944,-0.024552926,-0.030263584,-0.006627406,0.020480098,-0.008015212,-0.027988017,-0.018421942,-0.016595691,-0.030350547,0.017421853,0.009884944,-0.009819721,0.00014505377,-0.05156984,-0.013769351,0.001362441,-0.010718352,0.037307695,0.026582094,-0.02971281,-0.004710567,0.0029839633,0.005159883,-0.0012220299,-0.021393223,0.0020907673,-0.012617073,0.017102983,-0.02624873,-0.014204172,0.015537625,-0.01616087,0.006141855,0.01662468,0.0131606,-0.021494681,-0.014515795,0.033162393,0.010899528,-0.05185972,-0.0040221,0.005351929,0.0024386244,-0.0010779952,-0.005783127,0.021552658,0.009580569,0.027770607,0.020755485,-0.03617716,-0.00443518,-0.027843077,0.011327103,-0.0051417653,-0.0041815345,-0.051685795,-0.02646614,-0.012798249,-0.0013905233,-0.00016396398,-0.017972626,0.018305989,0.0091385,0.03432192,-0.012225734,0.015798518,-0.013022907,-0.0056599276,-0.0037358422,-0.005601952,0.00899356,0.01820453,0.020436615,0.0074354494,-0.024147093,-0.00056255044,-0.03568436,0.013711374,0.03690186,0.025466051,-0.0026832116,0.0111024445,-0.02810397,-0.00069299695,-0.05041032,-0.013269306,0.026016826,-0.006217949,0.0032140564,-0.015726048,0.014581018,0.029220011,0.038003407,0.019552479,0.011174915,-0.019929323,0.025842898,0.03536549,0.055686153,0.010254542,0.01591447,-0.008486268,-0.0032629739,-0.013117119,-0.022697687,0.00442431,-0.008065941,0.0024386244,-0.04336621,-0.002025544,0.0071093333,0.007236156,-0.027944535,-0.0036126429,0.0030401277,0.031568047,-0.003634384,0.012638815,0.009181983,0.0068411934,0.054758534,-0.020856943,-0.033133406,-0.018900245,-0.006283172,-0.023654295,-0.014349113,-0.02793004,-0.0027158232,-0.025726944,0.0077615655,-0.031162215,0.015204262,0.006149102,0.038003407,0.024016647,-0.023538342,-0.020581556,-0.009297935,-0.008123917,0.024871796,0.020943908,-0.0001288612,-0.007594884,0.059222702,0.0032448561,0.021248283,-0.017653758,0.00087371963,0.05235252,0.019697418,-0.01079807,0.035510432,-0.014167937,-0.02878519,-0.0034513965,0.033771146,-0.004101817,0.032959476,-0.04574323,-0.010218307,-0.0103052715,0.012247475,0.017682744,-0.013385259,0.040844243,0.024509445,0.0094718635,-0.03565537,-0.03548144,-0.0519177,0.0024513067,0.0072941324,-0.038525194,-0.02964034,-0.015726048,-0.015349203,0.0399746,-0.020219205,-0.0062251957,0.007515167,-0.017972626,-0.03597424,0.046033114,-0.013856315,0.029335964,0.01784218,-0.015117298,-0.021103341,0.023364414,-0.022465782,0.047540493,0.02595885,0.0006911852,-0.0064208657,-0.013044648,-0.024002152,0.04527942,0.0049171075,0.004043841,-0.01991483,-0.017682744,-0.014276642,0.0013651587,0.0263212,0.0068846755,0.06394777,-0.023016557,-0.042032756,0.0030908568,0.033800133,-0.0037358422,0.019175632,-0.010848799,8.549227e-05,-0.001444876,0.0077253305,-0.036206145,0.021349741,0.02732129,0.0059027034,-0.0020201087,-0.011370585,-0.022683194,0.018842269,-0.011051715,-0.0039278883,0.005315694,-0.009696522,-0.022233877,-0.016943548,0.017639263,0.048033293,-0.03353924,-0.013566434,0.020798966,0.016102893,-0.0013678763,-0.007855777,0.007051357,-0.06870181,0.010544424,-0.004065582,0.023596318,0.019624949,-0.04901889,0.0044532977,-0.028017005,0.02113233,-0.0080442,-0.0063121603,-0.029335964,0.003964124,0.013464975,-0.031510074,0.0042721224,0.022683194,-0.024552926,0.032988466,0.006159973,0.0399746,0.015175274,0.01874081,-0.033017453,0.0027593053,0.0147477,0.0107473405,0.026422659,-0.00041579816,0.01342874,0.023016557,-0.034379896,0.0006880146,0.0015100992,0.019103162,0.0027719878,-0.035916265,0.047569484,-0.0333943,-0.027234327,-0.032669596,-0.025321111,0.0048663784,0.00429024,-0.0035129962,0.009790733,0.02717635,-0.016813101,-0.02878519,-5.4749024e-05,-0.032727573,-0.02878519,-0.0070332396,-0.01623334,-0.021161318,0.008754408,-0.0155666135,0.027437244,-0.017189948,-0.029944714,0.012493874,-0.023219474,-0.0014747699,-0.0024513067,-0.040148526,-0.0015218756,0.024581915,-0.00034853668,0.032959476,-0.0074282023,0.12859124,-0.01355194,-0.034061026,0.019103162,0.00011583919,-0.015494143,0.030263584,-0.016508726,0.010058873,0.015465155,-0.024060128,-0.0012981236,0.0047468026,0.016813101,0.018262507,0.011087951,-0.015624589,-0.018349472,-0.015102804,0.006544065,0.00085967855,-0.014378101,-0.013769351,-0.005025813,-0.01501584,0.0017229806,-0.028451826,-0.011559008,0.008435539,-0.0175523,-0.003775701,-0.03553942,-0.01401575,-0.006902793,-0.010174826,0.04197478,-0.0051562595,-0.021233788,0.005880962,-0.020117747,-0.014240407,-0.019653937,0.05667175,-0.022538252,0.0263212,0.009935673,-0.0131750945,0.0074499436,-0.037452634,0.007899259,-0.04333722,0.006717994,0.017494323,0.010566165,-0.006232443,-0.03322037,-0.0065875473,0.0047250614,0.054555617,0.010848799,0.008536997,-0.002233896,-0.005460635,0.017958133,0.045076504,-0.02968382,0.011957594,-0.010196567,0.05180175,0.030060668,-0.010696611,0.007855777,0.019827865,-0.02349486,0.007631119,0.0029296104,0.008623961,-0.036959834,0.012791002,0.0465549,0.036814895,0.023987658,0.014581018,-0.040061563,-0.019653937,-0.034727752,0.013725868,0.009964662,-0.0030328806,-0.030089654,-0.007899259,0.016030423,0.010058873,0.010812564,0.018074084,-0.0022755663,0.0079644825,-0.01881328,-0.004870002,-0.0041271816,0.029828763,0.036814895,0.012457639,-0.010348754,-0.012030064,-0.011740183,-0.011095198,-0.003634384,0.006152726,-0.024089117,-0.0076673543,0.023393402,0.0008877608,0.012957684,0.012776508,-0.028770696,0.022146914,0.038467217,0.022610724,0.0024331892,-0.02793004,0.024799325,-0.005736022,0.0070622275,-0.012660556,0.0003655219,0.04823621,0.054236747,0.011131433,0.01213877,0.008826879,-0.031452097,0.024857301,-0.027654653,0.031741977,0.028886648,0.0147694405,-0.011885123,0.0058193626,-0.010471954,-0.035046622,0.007638366,0.0014077349,-0.0030365041,0.021320753,0.00831234,-0.009674781,-0.014182432,-0.028045993,0.012385169,0.03261162,-0.0038228065,0.004572874,-0.0144143365,-0.02671254,-0.0132113295,-0.030901322,-0.010595153,-0.009384899,0.009616804,-0.044003945,-0.0072035445,-0.02227736,0.023610814,-0.014653488,0.015407179,-0.049366746,-0.014588265,0.00960231,-0.024335515,0.027524207,0.029669328,0.014051985,-0.0005149918,-0.013008413,-0.019755395,0.0076673543,-0.002473048,0.0008732667,0.0151607795,0.01645075,0.013291047,-0.009616804,0.04527942,-0.0077035893,0.048265196,0.019291585,-0.030263584,-0.019682925,-0.01174743,0.025161676,-0.012044558,0.0141317025,0.008138411,0.025466051,0.015479649,-0.052903295,-0.032959476,-0.021625128,-0.016349291,0.022117926,0.008102176,-0.023915188,0.035046622,0.02066852,-0.016407268,0.03524954,-0.008363069,-0.007870271,-0.050816152,0.010319766,0.024871796,0.060701095,-0.00097200746,-0.018769799,0.058613952,0.008087682,0.015146286,0.019465514,0.010471954,0.028408345,-0.02488629,0.028379356,0.024828313,-0.0053374353,0.01335627,0.025335606,0.010174826,0.016871078,0.012863472,0.006754229,0.018045096,-0.005286706,-0.00945737,0.018972715,0.02456742,-0.0088341255,-0.024828313,-0.01805959,-0.017682744,-0.009841463,-0.00013123913,-0.023770247,0.00027674582,-0.016334798,-0.015610095,0.017059501,0.0006522324,0.02098739,-0.0021867903,0.00038024242,0.0008614903,-0.021943998,-0.00014641258,-0.0054751285,-0.018494412,0.00010989437,-0.0029259871,-0.005920821,-0.0016831219,-0.026002333,-0.010979245,-0.008326834,0.026234237,0.03571335,-0.010790823,0.0063701365,0.010363248,0.028205428,0.01801611,0.00332095,0.01769724,0.013791092,-0.03617716,-0.0023897071,-0.0049642134,0.006022279,-0.018769799,0.026669059,0.0039496296,-0.015639083,-0.0075369077,0.021277271,0.034959655,0.00076727895,0.014312877,-0.010703858,0.028582273,0.009312429,0.024654385,-0.010232802,0.0051961183,0.027306797,-0.0045583798,0.012725779,0.021972984,0.024784831,-0.037771504,-0.03246668,0.016987031,-0.023755753,-0.013378011,-0.009645793,-0.036467038,0.004851884,0.0020418498,-0.029741798,0.002844458,-0.016726138,0.0012501121,-0.01616087,0.0003827336,-0.03324936,0.0067650992,0.029133048,0.044032935,0.051106032,0.023639802,0.027669149,0.011000986,0.009073277,-0.019103162,-0.0061237374,-0.0059896675,0.011732936,0.008986313,0.015885482,0.017247923,-0.0038807828,-0.031162215,0.013588175,0.012660556,0.0043518394,-0.0012165946,0.022538252,-0.01240691,-0.037771504,0.0027520584,0.009674781,0.0018842269,0.006438983,0.044931564,0.0042684986,-0.0047685434,-0.027219832,0.06046919,-0.00476492,-0.030988285,0.02617626,-0.0069571454,-0.03400305,-0.015972447,-0.021291764,0.0023570955,-0.016189858,-0.0002873899,0.048960913,0.010769081,0.014856405,0.0105879055,0.027263314,-0.021567151,-0.009181983,0.015494143,-0.04620704,-0.006482465,0.0008343139,-0.035452455,0.01187063,0.01991483,-0.019972805,-0.01891474,-0.02610379,0.01201557,0.00987045,0.049076866,0.025480546,0.010674871,0.00838481,-0.027205339,0.00046969793,-0.028524296,0.005225106,0.0028045992,0.023973165,0.019639442,-0.05759937,-0.010022637,0.029060576]"}]

7.直接查询获取向量对象 PGobject

String sql = "select v from rumi_embedding where t=?";
PGobject pGobject = Db.queryFirst(sql, text);
if (pGobject != null) {
  v = pGobject.getValue();
}

Edit this page
Last Updated:
Contributors: Tong Li
Prev
获取字段类型
Next
PostgreSQL 优化向量查询