基于Elasticsearch8的向量检索实现相似图形搜索

devtools/2025/1/8 6:04:11/

Elasticsearch8版本增加了KNN向量检索,可以基于此功能实现以图搜图功能。

1、首先创建索引,es提供了类型为dense_vector的字段,用于存储向量,其中dims是向量维度,可以不配置,es会根据第一条插入的向量维度自动配置。

java">{"properties": {"file_name": {"type": "text"},"feature": {"type": "dense_vector","dims": 5},"number":{"type": "integer"},"data_type":{"type":"keyword"}}
}

2、插入10条测试数据

3、通过postman直接进行测试:

field:向量检索字段名

query_vector:输入的向量

k:返回得分最高的前几条数据

num_candidates:在搜索过程中每个分片考虑的候选邻居的数量

关于参数的具体解释,可以看下这篇文章:

如何为 kNN 搜索选择最佳 k 和 num_candidates_numcandidates-CSDN博客

4、java api

导入pom

java">        <dependency><groupId>co.elastic.clients</groupId><artifactId>elasticsearch-java</artifactId><version>8.15.2</version></dependency><dependency><artifactId>elasticsearch-rest-client</artifactId><groupId>org.elasticsearch.client</groupId><version>8.15.2</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.30</version></dependency>

测试类

java">import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.SortOrder;
import co.elastic.clients.elasticsearch._types.query_dsl.BoolQuery;
import co.elastic.clients.elasticsearch.core.SearchRequest;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.elasticsearch.core.search.Hit;
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
import co.elastic.clients.transport.ElasticsearchTransport;
import co.elastic.clients.transport.rest_client.RestClientTransport;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class ElasticsearchKnnTest {public static void main(String[] args) {//获取客户端RestClient restClient = RestClient.builder(HttpHost.create("localhost:9200")).build();ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());ElasticsearchClient client = new ElasticsearchClient(transport);//查询的向量List<Float> queryVector = new ArrayList<>();queryVector.add(0.7F);queryVector.add(0.66F);queryVector.add(1.74F);queryVector.add(1.2F);queryVector.add(0.9F);//取前五个Integer top = 5;//最小相似度Double minScore = 0.9D;//组装查询条件,针对feature字段进行相似向量检索,并按照得分排序BoolQuery.Builder builder = new BoolQuery.Builder();builder.must(q -> q.knn(n -> n.field("feature").queryVector(queryVector).k(top).numCandidates(10)));SearchRequest request = new SearchRequest.Builder().index("image").minScore(minScore).query(q -> q.bool(builder.build())).from(0).size(10).sort(s -> s.field(f -> f.field("_score").order(SortOrder.Desc))).build();SearchResponse response = null;try{response = client.search(request, JSONObject.class);}catch (IOException e){e.getStackTrace();}//解析并输出检索结果List<Hit<JSONObject>> hits = response.hits().hits();for(Hit<JSONObject> hit : hits){JSONObject data = hit.source();System.out.println(data.toJSONString() + "     得分:"+ hit.score());}}
}

结果

{"number":6,"feature":[0.7,0.66,1.74,1.2,0.9],"file_name":"6.jpg","data_type":"aa"}     得分:0.9999949
{"number":2,"feature":[0.5,0.3,1.7,1.9,1.8],"file_name":"66.jpg","data_type":"aa"}     得分:0.9714658
{"number":23,"feature":[1.7,0.8,1.1,1.5,0.9],"file_name":"23.jpg","data_type":"bb"}     得分:0.9587538
{"number":7,"feature":[0.2,0.23,1.7,1.5,0.2],"file_name":"88.jpg","data_type":"cc"}     得分:0.95746744
{"number":99,"feature":[0.3,1.2,1.7,0.7,1.9],"file_name":"9.jpg","data_type":"gg"}     得分:0.949824
{"number":5,"feature":[0.2,1.3,1.7,1.9,0.2],"file_name":"77.jpg","data_type":"bb"}     得分:0.94946384
{"number":10,"feature":[0.1,0.5,1.7,0.7,2.9],"file_name":"10.jpg","data_type":"bb"}     得分:0.9173416


http://www.ppmy.cn/devtools/148821.html

相关文章

开源平台Kubernetes的优势是什么?

Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于希腊语&#xff0c;意…

基于Qlearning强化学习的机器人迷宫路线搜索算法matlab仿真

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1 Q-learning理论 2.2 机器人迷宫路线搜索具体实现 状态与动作定义 Q 表初始化 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#…

MySQL入门学习笔记

第一章 数据库系统概述 数据库的4个基本概念 数据、数据库、数据库管理系统、数据库系统是与数据库技术密切相关的4个基本概念 数据 数据是数据库中存储的基本对象&#xff0c;描述事物的符号记录称为数据&#xff0c;数据的表现形式还不能完全表达其内容&#xff0c;需要…

Ruby语言的编程范式

Ruby语言的编程范式 引言 Ruby是一种动态、开源、面向对象的编程语言&#xff0c;最早由日本计算机科学家Matz&#xff08;松本行弘&#xff09;于1995年开发。Ruby以其简洁的语法和强大的功能而广受欢迎&#xff0c;特别是在Web开发领域。Ruby对开发者的友好性以及其设计哲学…

Java设计模式 —— 【行为型模式】策略模式(Strategy Pattern) 详解

文章目录 概述优缺点适用场景模式结构案例实现拓展优化&#xff08;策略工厂&#xff09; 概述 策略模式是一种行为模式&#xff0c;该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。它…

修改 页面 滚动条样式

/* 整个页面的滚动条 */ ::-webkit-scrollbar {width: 12px; /* 滚动条的宽度 */ }/* 滚动条轨道 */ ::-webkit-scrollbar-track {background: #f1f1f1; /* 轨道的背景颜色 */border-radius: 10px; /* 轨道的圆角 */ }/* 滚动条滑块 */ ::-webkit-scrollbar-thumb {background:…

Elasticsearch DSL版

文章目录 1.索引库操作创建索引库&#xff1a;删除索引库&#xff1a;查询索引库&#xff1a;修改索引库&#xff1a;总结 2.文档操作创建文档&#xff1a;查询文档&#xff1a;删除文档&#xff1a;全量修改文档&#xff1a;增量修改文档&#xff1a;总结 3.DSL查询语法&#…

halcon中图像处理及图像滤波

图像滤波简介 图像滤波的方法主要分为两大类:空间域方法和频域方法。 空间域方法是以对图像的像素直接进行处理为基础,包括均值滤波、中值滤波、高斯滤波等;频域方法则是以修改图像在傅里叶变换空间的值为基础的,包括高通滤波、低通滤波、同态滤波等。 1.空间域图像滤波 图…