当前位置: 首页 > news >正文

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

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

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

{"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

        <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>

测试类

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.lryc.cn/news/517440.html

相关文章:

  • springboot+vue使用easyExcel实现导出功能
  • ffmpeg-avio实战:打开本地文件或者网络直播流dome
  • css预处理器sass
  • VulnHub-Acid(1/100)
  • MATLAB语言的正则表达式
  • 通过 route 或 ip route 管理Linux主机路由
  • MYSQL--------SQL 注入简介MySQL SQL Mode 简介
  • 第6章——HTTP首部
  • 多行输入模式(dquote> 提示符)double quote(双引号)
  • 【什么是MVCC?】
  • HarmonyOS开发:粒子动画应用实战
  • 数据库课设——网上花店销售管理系统(上)
  • 用于AI的 数据存储其获取介绍
  • flutter 专题二十四 Flutter性能优化在携程酒店的实践
  • L28.【LeetCode笔记】移动零(三种解法)
  • jenkins入门10--自动化构建
  • el-table拖拽表格
  • 如何轻松反转C# List<T>中的元素顺序
  • Transformer中Self-Attention以及Multi-Head Attention模块详解(附pytorch实现)
  • 在Nvidia Jetson ADX Orin中使用TensorRT-LLM运行llama3-8b
  • 六十一:HTTP/2的问题及HTTP/3的意义
  • IOS开发如何从入门进阶到高级
  • 非一般的小数:小数的概念新解、小数分类、浮点数的存储
  • 关于游戏销量的思考
  • JuiceFS 详解:一款为云原生设计的高性能分布式文件系统
  • 百度Android面试题及参考答案 (下)
  • RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案
  • Elasticsearch:Query rules 疑难解答
  • 四、VSCODE 使用GIT插件
  • 键盘鼠标共享工具Barrier(kail与windows操作系统)