使用原生ES当向量数据库
1. Maven 依赖 (pom.xml)xmldependencies !-- Spring Boot Web -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- Elasticsearch 8.x 官方 Java Client -- dependency groupIdco.elastic.clients/groupId artifactIdelasticsearch-java/artifactId version8.12.0/version /dependency !-- ES Client 底层通信依赖 -- dependency groupIdorg.elasticsearch.client/groupId artifactIdelasticsearch-rest-client/artifactId version8.12.0/version /dependency !-- Jackson JSON 处理 -- dependency groupIdcom.fasterxml.jackson.core/groupId artifactIdjackson-databind/artifactId version2.15.2/version /dependency /dependencies2. 模拟 Embedding 模型服务 (EmbeddingService.java)在实际业务中这里会替换为调用 OpenAI、通义千问等真实 API 的代码。这里为了演示我们生成一个固定维度的随机向量。javaimport org.springframework.stereotype.Service; import java.util.Random; Service public class EmbeddingService { private static final int VECTOR_DIM 768; // 假设模型输出 768 维 private final Random random new Random(); /** * 将文本转换为向量 * 【实际业务中在此处通过 HTTP 调用大模型 Embedding API】 */ public float[] embed(String text) { // 模拟生成 768 维的随机向量 float[] vector new float[VECTOR_DIM]; for (int i 0; i VECTOR_DIM; i) { vector[i] random.nextFloat(); } return vector; } }3. ES 客户端配置 (ElasticsearchConfig.java)javaimport co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.json.jackson.JacksonJsonpMapper; import co.elastic.clients.transport.ElasticsearchTransport; import co.elastic.clients.transport.rest_client.RestClientTransport; import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; Configuration public class ElasticsearchConfig { Bean public RestClient restClient() { return RestClient.builder(new HttpHost(localhost, 9200, http)).build(); } Bean public ElasticsearchClient elasticsearchClient(RestClient restClient) { ElasticsearchTransport transport new RestClientTransport(restClient, new JacksonJsonpMapper()); return new ElasticsearchClient(transport); } }4. 核心业务 Controller (VectorController.java)这个 Controller 包含了创建索引、写入文档自动调用 Embedding、以及 kNN 检索的完整流程。javaimport co.elastic.clients.elasticsearch.ElasticsearchClient; import co.elastic.clients.elasticsearch.core.SearchResponse; import co.elastic.clients.elasticsearch.core.search.Hit; import org.springframework.web.bind.annotation.*; import java.util.*; RestController RequestMapping(/api/vector) public class VectorController { private final ElasticsearchClient esClient; private final EmbeddingService embeddingService; private static final String INDEX_NAME my_native_vector_index; private static final int VECTOR_DIM 768; public VectorController(ElasticsearchClient esClient, EmbeddingService embeddingService) { this.esClient esClient; this.embeddingService embeddingService; } /** * 1. 初始化索引 (只需调用一次) */ PostMapping(/init-index) public String initIndex() throws Exception { boolean exists esClient.indices().exists(e - e.index(INDEX_NAME)).value(); if (exists) return 索引已存在无需重复创建; esClient.indices().create(c - c .index(INDEX_NAME) .mappings(m - m .properties(content, p - p.text(t - t)) .properties(content_vector, p - p.denseVector(dv - dv .dims(VECTOR_DIM) .index(true) .similarity(cosine) )) ) ); return 索引创建成功; } /** * 2. 写入文档 (核心在这里调用 Embedding 模型并将向量放入文档) */ PostMapping(/add) public String addDocument(RequestBody MapString, String payload) throws Exception { String content payload.get(content); // 【关键步骤】调用模型生成向量 float[] vector embeddingService.embed(content); // 组装文档必须包含 content_vector 字段 MapString, Object doc new HashMap(); doc.put(content, content); doc.put(content_vector, vector); // 将生成的向量塞入文档 // 写入 ES esClient.index(i - i.index(INDEX_NAME).document(doc)); return 文档向量化并存储成功; } /** * 3. kNN 向量检索 */ GetMapping(/search) public ListMapString, Object search(RequestParam String query, RequestParam(defaultValue 5) int topK) throws Exception { // 【关键步骤】查询文本也需要调用模型生成向量 float[] queryVector embeddingService.embed(query); SearchResponseMap response esClient.search(s - s .index(INDEX_NAME) .knn(k - k .field(content_vector) .queryVector(queryVector) .k(topK) .numCandidates(topK * 10) ), Map.class ); // 格式化返回结果 ListMapString, Object results new ArrayList(); for (HitMap hit : response.hits().hits()) { MapString, Object map new HashMap(); map.put(score, hit.score()); map.put(content, hit.source().get(content)); results.add(map); } return results; } }ES索引示例PUT /vector_docs { settings: { number_of_shards: 3, number_of_replicas: 1, index.knn: true, // 必须开启KNN插件总开关 index.knn.algo_param.ef_search: 100 }, mappings: { properties: { content: { type: text }, // 原始文本全文检索 doc_id: { type: keyword }, embedding: { type: dense_vector, dims: 1536, index: true, index_options: { type: hnsw }, similarity: cosine } } } }注意这里dims要和embedding模型维度一致维度由embedding决定(特例:动态embedding可以指定维度) 核心实现逻辑总结解耦设计ES 客户端只负责“存”和“搜”不负责“文本转向量”。写入流程在addDocument接口中先调用embeddingService.embed(content)拿到float[]然后doc.put(content_vector, vector)最后交给 ES 存储。检索流程在search接口中用户的查询语句query也必须先经过embeddingService.embed(query)变成向量才能传给 ES 的.queryVector(queryVector)进行比对。

相关新闻

Verilog硬件描述语言入门:从编程思维到硬件电路设计

Verilog硬件描述语言入门:从编程思维到硬件电路设计

1. 从“连线”到“描述”:为什么Verilog不是编程语言如果你是从单片机或者软件编程转过来的,第一次接触Verilog,最大的误区可能就是把它当成C语言或者Python来学。我见过不少新手,一上来就琢磨“这个for循环怎么写”、“这个函数怎…

2026/8/7 8:41:24 阅读更多 →
Jetson Nano从零配置指南:PyTorch、TensorFlow环境搭建与性能优化

Jetson Nano从零配置指南:PyTorch、TensorFlow环境搭建与性能优化

1. 项目概述:为什么需要一份“从零开始”的配置指南?如果你刚拿到一块Jetson Nano开发板,或者因为系统混乱、环境崩溃而不得不重装,那么恭喜你,你正处在一个最需要清晰指引的十字路口。Jetson Nano作为一款强大的边缘A…

2026/8/7 11:26:43 阅读更多 →
Android DownloadManager 核心机制与实战指南:从原理到避坑

Android DownloadManager 核心机制与实战指南:从原理到避坑

1. 项目概述:为什么我们需要DownloadManager?在Android应用开发中,文件下载是一个高频且基础的需求。无论是新闻应用缓存图片、音乐应用下载歌曲,还是电商应用保存商品详情,都离不开下载功能。很多开发者,尤…

2026/8/7 15:29:41 阅读更多 →

最新新闻

Mac安装Claude Code全指南:解决环境配置三大难题

Mac安装Claude Code全指南:解决环境配置三大难题

1. Claude Code 安装概述:为什么Mac用户需要这份指南在2026年的开发生态中,Claude Code已经成为AI辅助编程的事实标准工具。不同于普通的代码编辑器,它深度融合了新一代AI的上下文理解能力,能够根据开发者习惯动态调整代码建议策略…

2026/8/8 11:10:44 阅读更多 →
Unity URP轮廓着色器:深度-法线边缘检测实现与优化

Unity URP轮廓着色器:深度-法线边缘检测实现与优化

1. 项目概述:为什么我们需要轮廓着色器?在3D游戏和实时渲染的世界里,角色的“存在感”很大程度上取决于其与环境的视觉区分度。想象一下,一个精心设计的角色模型,在复杂的光照和背景中,其轮廓却模糊不清&am…

2026/8/8 11:10:44 阅读更多 →
Reasonix ACP模型选择器实战:智能路由接入DeepSeek V4全流程解析

Reasonix ACP模型选择器实战:智能路由接入DeepSeek V4全流程解析

1. 项目背景与核心价值:为什么是Reasonix 1.x DeepSeek V4? 最近在折腾AI工作流的朋友,估计都绕不开两个名字: Reasonix 和 DeepSeek V4 。前者是一个新兴的、强调本地化与可扩展性的AI智能体框架,后者则是近期在…

2026/8/8 11:10:44 阅读更多 →
Unity自定义鼠标指针全攻略:从原理到动态管理系统实现

Unity自定义鼠标指针全攻略:从原理到动态管理系统实现

1. 项目概述:为什么Unity鼠标指针值得你花时间? 在Unity里做游戏或者交互应用,鼠标指针往往是玩家与你的世界建立连接的第一触点。一个粗糙、默认的白色箭头,和一个精心设计、与游戏风格浑然一体的自定义指针,带来的沉…

2026/8/8 11:10:44 阅读更多 →
SAP系统升级核心工具SPDD与SPAU:定制化修改的迁移与兼容性保障

SAP系统升级核心工具SPDD与SPAU:定制化修改的迁移与兼容性保障

1. 项目概述:SPDD与SPAU,SAP系统升级的“外科手术刀” 在SAP顾问的日常工具箱里,有两把锋利且必须精准使用的“手术刀”:SPDD和SPAU。对于任何涉及SAP标准对象修改的升级、补丁应用或系统迁移项目,这两个事务码是绕不开…

2026/8/8 11:10:44 阅读更多 →
Blender与虚幻引擎资产互通:PSK/PSA插件完整使用指南与避坑

Blender与虚幻引擎资产互通:PSK/PSA插件完整使用指南与避坑

1. 项目概述:为什么你需要这个插件? 如果你正在游戏开发、3D美术或者数字内容创作的圈子里,尤其是涉及到虚幻引擎(Unreal Engine)的资产流转,那么“PSK”和“PSA”这两个文件格式对你来说一定不陌生。简单来…

2026/8/8 11:09:44 阅读更多 →

日新闻

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

AI多智能体时代来临,读懂MCP与A2A架构,抢占企业数字化新风口

当下AI应用飞速普及,无数企业下场搭建智能体系统,可落地阶段难题接踵而至:上下文无限堆积频繁爆栈、AI工具调用准确率低下、Token成本居高不下、企业数据权限混乱暗藏安全隐患……很多团队卡在架构搭建环节,空有前沿技术概念&…

2026/8/8 0:00:07 阅读更多 →
PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码

PHP二维码生成终极指南:用chillerlan/php-qrcode打造专业级二维码 【免费下载链接】php-qrcode A PHP QR Code generator and reader with a user-friendly API. 项目地址: https://gitcode.com/gh_mirrors/ph/php-qrcode 在当今数字时代,二维码已…

2026/8/8 0:00:08 阅读更多 →
UniApp微信小程序隐私保护组件开发:从原理到实战

UniApp微信小程序隐私保护组件开发:从原理到实战

1. 项目缘起:为什么我们需要一个隐私保护通用组件?最近在维护一个基于uniapp开发的微信小程序矩阵时,我遇到了一个非常棘手的问题。随着平台对用户隐私保护的要求越来越严格,几乎每一个新版本发布,或者在某些特定机型&…

2026/8/8 0:00:08 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/8 8:58:26 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/7 23:24:08 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/7 17:02:37 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/7 23:54:54 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/7 17:02:36 阅读更多 →