使用原生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/7/30 4:13:36阅读更多 →
Jetson Nano从零配置指南:PyTorch、TensorFlow环境搭建与性能优化

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

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

2026/7/30 4:13:36阅读更多 →
Android HAL硬件抽象层:从原理到实战开发与调试指南

Android HAL硬件抽象层:从原理到实战开发与调试指南

1. 项目概述:为什么我们需要HAL?如果你在Android开发或者嵌入式领域摸爬滚打过一阵子,肯定对“驱动移植”这四个字深恶痛绝。同一个硬件,换一个芯片平台,驱动代码就得重写一大半;Android系统版本一升级&…

2026/7/30 4:11:35阅读更多 →
AI教育系统如何优化教学课题设计与实施

AI教育系统如何优化教学课题设计与实施

1. 项目概述:AI如何重塑教育课题设计流程去年帮某师范院校评审研究生开题报告时,我发现一个惊人现象:超过60%的选题要么脱离教学实际,要么缺乏可操作性。直到接触了百考通AI系统,才意识到传统选题模式的根本问题在于缺…

2026/7/30 5:23:52阅读更多 →
游戏引擎技术升级挑战:从AI行为树到服务器网格化的开发实践

游戏引擎技术升级挑战:从AI行为树到服务器网格化的开发实践

在游戏开发领域,大型多人在线游戏的引擎升级和内容发布延期是常态,但像《星际公民》Alpha 4.10版本“奥利森围城”技术预览这样备受关注的更新,其延期背后的技术原因值得深入探讨。这次更新原计划引入新的行星技术、AI行为树重构、物理引擎优…

2026/7/30 5:23:52阅读更多 →
STM32 GPIO上拉下拉配置详解:从原理到实战避坑指南

STM32 GPIO上拉下拉配置详解:从原理到实战避坑指南

1. 项目概述:从“悬空”到“确定”的引脚状态控制在嵌入式开发,尤其是STM32这类MCU的应用中,GPIO(通用输入输出)引脚的状态控制是基础中的基础。很多新手,甚至一些有经验的开发者,常常会忽略一个…

2026/7/30 5:23:52阅读更多 →
OpenClaw汉化版完整安装与配置指南

OpenClaw汉化版完整安装与配置指南

1. OpenClaw汉化版安装指南:从零开始完整部署作为一名长期从事开源工具部署的技术博主,我最近在多个项目中使用了OpenClaw汉化版,发现它在数据处理和自动化工作流方面确实能带来不少便利。但初次安装时也踩过不少坑,特别是汉化版的…

2026/7/30 5:23:52阅读更多 →
Unity ToggleGroup默认选中首项问题:原理剖析与根治方案

Unity ToggleGroup默认选中首项问题:原理剖析与根治方案

1. 项目概述:一个看似简单却暗藏玄机的交互问题在Unity UI开发中,ToggleGroup组件是构建单选按钮组、标签页切换等功能的基石。它确保了同一组内的Toggle只能有一个处于选中状态,逻辑清晰,使用方便。然而,很多开发者&a…

2026/7/30 5:23:52阅读更多 →
TLS协议深度解析:从握手流程到证书验证与安全配置实战

TLS协议深度解析:从握手流程到证书验证与安全配置实战

1. 从“裸奔”到“加密隧道”:为什么我们需要TLS?如果你在浏览器里输入一个网址,看到地址栏左边出现一把小锁,或者看到“https”开头的链接,那么恭喜你,你和服务器之间的通信正在受到TLS(传输层…

2026/7/30 5:21:51阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/29 9:47:45阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/29 7:00:19阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/29 7:58:51阅读更多 →
3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 [特殊字符]

3分钟解锁iOS应用自由:TrollInstallerX让你的iPhone摆脱安装限制 🚀 【免费下载链接】TrollInstallerX A TrollStore installer for iOS 14.0 - 16.6.1 项目地址: https://gitcode.com/gh_mirrors/tr/TrollInstallerX 你是否曾经因为iOS系统的严格…

2026/7/30 0:00:58阅读更多 →
[GESP202606 四级] 扫雷

[GESP202606 四级] 扫雷

B4557 [GESP202606 四级] 扫雷 https://www.luogu.com.cn/problem/B4557 中国计算机学会(CCF)2026年6月C四级讲解——扫雷 https://www.bilibili.com/video/BV1MCMg6AEXR/ B4557 [GESP202606 四级] 扫雷 https://www.bilibili.com/video/BV1ZKTj6ZEVh/ 2…

2026/7/30 0:00:58阅读更多 →
Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:58阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/30 0:27:26阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/30 4:47:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/29 14:26:42阅读更多 →