【Elasticsearch】-实现图片向量相似检索

news2024/11/15 5:53:19

1、http请求方式

如果elasticsearch服务设置账号密码,则在请求的header中添加 Basic Auth 认证

请求方式:Post

请求地址:/index_name/_search

请求body:json格式

{
 "size": 10, //返回条数
 "min_score": 0.8,  // 设置最低相似分值
 "_source": ["file_name", "length", "_es_doc_type"],  // 只返回指定字段
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
	    // _img_vector 为设置的向量索引字段
        "source": "cosineSimilarity(params.query_vector, '_img_vector') + 0.0",
        "params": {
          "query_vector": [-1,1,-0.07559559,-0.007800484,0.11229578,0.064164124,....]
        }
      }
    }
  }
}

主要参数说明

  • "from": 0, // 起始位置,0表示第一页
  • "size": 10, // 每页返回的记录数
  • "min_score": 0.5,   //最低相似度,最高1
  • "_source": ["image_id", "image_name", "image_vector"],   // 返回指定字段

返回结果如下:

{
	"took": 3,
	"timed_out": false,
	"_shards": {
		"total": 1,
		"successful": 1,
		"skipped": 0,
		"failed": 0
	},
	"hits": {
		"total": {
			"value": 1,
			"relation": "eq"
		},
		"max_score": 0.9014968,
		"hits": [
			{
				"_index": "vedms",
				"_type": "_doc",
				"_id": "04a40e806be82e87f3c3a2f3877225bd.jpg",
				"_score": 0.9014968,
				"_source": {
					"file_name": "04a40e806be82e87f3c3a2f3877225bd.jpg",
					"_es_doc_type": "IMAGE",
					"length": 89690
				}
			}
		]
	}
}

需要确保传入的query_vector 长度一致性,前面的章节中以设定1024长度。

否则会出现如下错误:

"reason": {

                    "type": "script_exception",

                    "reason": "runtime error",

                    "script_stack": [

                        "org.elasticsearch.xpack.vectors.query.ScoreScriptUtils$DenseVectorFunction.<init>(ScoreScriptUtils.java:74)",

                        "org.elasticsearch.xpack.vectors.query.ScoreScriptUtils$CosineSimilarity.<init>(ScoreScriptUtils.java:172)",

                        "cosineSimilarity(params.query_vector, '_img_vector') + 0.0",

                        "     

                    ],

                    "script": "cosineSimilarity(params.query_vector, '_img_vector') + 0.0",

                    "lang": "painless",

                    "position": {

                        "offset": 38,

                        "start": 0,

                        "end": 58

                    },

                    "caused_by": {

                        "type": "illegal_argument_exception",

                        "reason": "The query vector has a different number of dimensions [1023] than the document vectors [1024]."

                    }

                }

2、Java调用脚本

SearchRequest  不允许在script设置 _source 属性内容,所以干脆将from、size、score一并拿出,只保留vector数据

_img_vector为前面定义的向量索引字段

public List<Map<String, Object>> search(EsVectorSearchReq req) {
        float[] vector = getImgFeature(req);
        if (null == vector || vector.length == 0) {
            return Collections.emptyList();
        }
        String queryJson = String.format(VECTOR_FORMAT, vectorToJson(vector));
        log.debug("向量检索入参条件={}", queryJson);
        Reader input = new StringReader(queryJson);
        // 使用查询 DSL 进行搜索
        SearchRequest searchRequest = new SearchRequest.Builder()
                .index(req.getIndexLib())
                .from(req.getFrom())
                .size(req.getSize())
                .minScore(req.getScore())
                .source(SourceConfig.of(src -> src
                        .filter(SourceFilter.of(i -> i.includes(req.getColumns())))))
                .withJson(input)
                .build();

        // 执行查询
        List<Map<String, Object>> result = new ArrayList<>();
        try {
            SearchResponse<Map> searchResponse = esClient.search(searchRequest, Map.class);
            // 输出结果
            for (Hit<Map> hit : searchResponse.hits().hits()) {
                result.add(hit.source());
            }
            log.info("成功查询{}条", result.size());
        } catch (IOException e) {
            e.printStackTrace();
        }
        return result;
    }



private String vectorToJson(float[] vector) {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < vector.length; i++) {
            sb.append(vector[i]);
            if (i < vector.length - 1) {
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

private static final String VECTOR_FORMAT = "{\n" +
            "  \"query\": {\n" +
            "    \"script_score\": {\n" +
            "      \"query\": {\n" +
            "        \"match_all\": {}\n" +
            "      },\n" +
            "      \"script\": {\n" +
            "        \"source\": \"cosineSimilarity(params.query_vector, 'img_vector') + 0.0\",\n" +
            "        \"params\": {\n" +
            "          \"query_vector\": %s\n" +
            "        }\n" +
            "      }\n" +
            "    }\n" +
            "  }\n" +
            "}";

传入参数格式如下:

{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.query_vector, '_img_vector') + 0.0",
        "params": {
          "query_vector": [-0.033....]
        }
      }
    }
  }
}

返回结果如下:

{
    "_shards": {
        "failed": 0.0,
        "skipped": 0.0,
        "successful": 1.0,
        "total": 1.0
    },
    "hits": {
        "hits": [
            {
                "_id": "04a40e806be82e87f3c3a2f3877225bd.jpg",
                "_index": "vedms",
                "_score": 1.0,
                "_source": "{file_name=04a40e806be82e87f3c3a2f3877225bd.jpg}",
                "_type": "_doc"
            }
        ],
        "max_score": 1.0,
        "total": {
            "relation": "eq",
            "value": 1
        }
    },
    "timed_out": false,
    "took": 46
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2163519.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【10000字pandas数据可视化超全笔记整理】Numpy Pandas | 常用API介绍 | 缺失值处理 matplotlib数据可视化介绍

文章目录 Numpy 部分NumPy的数组类被称作ndarray&#xff0c;通常被称作数组。属性创建方法内置函数运算基本运算矩阵运算 Pandas部分总述Serise 对象创建属性方法运算 DataFrame属性索引操作添加删除插入列 保存读取文件保存读取 数据加载分组聚合语法格式: 基本绘图 数据组合…

【设计模式-迭代】

定义 迭代器模式&#xff08;Iterator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于提供一种顺序访问集合对象元素的方式&#xff0c;而不暴露该对象的内部表示。通过迭代器&#xff0c;客户端可以在不需要了解集合实现的细节的情况下遍历集合中的元素。 UML图 …

Hi.Events —— 您的全方位活动管理与票务平台

大家好&#xff01;今天给大家介绍一个超厉害的开源项目&#xff1a;Hi.Events&#xff0c;这是一个功能丰富的自托管活动管理和票务平台&#xff0c;无论是会议还是俱乐部活动&#xff0c;它都能帮你轻松搞定&#xff01; 项目介绍 Hi.Events是一款功能丰富、自托管的开源活动…

用AI绘画年入百万?揭秘高效起始号与现变路径...

part.1 AI绘画的优势 AI绘画的魅力在于其高效和灵活 无论你是通过Midjourney还是Stable Diffusion&#xff0c;只需输入简单的提示词&#xff0c;再加上一些额外的控制调整&#xff0c;AI绘画就能快速生成各种创意内容。角色IP设计、游戏原画、3D场景甚至是天马行空的创意都…

服务器桌面监控录制到NVR

目录 一、硬盘录像机配置 二、配置VLC Play 三、加入NVR通道 四、实时画面 五、历史画面录像 有一天,客户提出一个问题,有一台服务器被很多人使用,成了共用服务器。共用的东西有个特点,就是人人都用,人人都不管,都认为自己只是偶尔用一下,管理维护不是自己的责任。…

Error: one input ui-file must be specified(问题已解决)

一、 项目场景问题描述 Error: one input ui-file must be specified pycharm IDE添加了外部工具。 QT Designer设计完成&#xff0c;生成界面ui文件&#xff0c; 3.运行pyuic5转换文件 方式一&#xff1a;选中ui文件 方式二:右击选中.ui文件。 报错&#xff1a;Error: o…

【xhs截流软件】爬取小红书关键词笔记下的筛选评论

用python开发的xhs采集工具【爬小红书搜索评论软件】&#xff0c;可用于引流截流等。 支持2种模式的评论采集&#xff1a; 根据关键词采集评论&#xff0c;爬取思路&#xff1a;笔记关键词->笔记链接->评论根据笔记链接采集评论&#xff0c;爬取思路&#xff1a;笔记链接…

k8s中,pod生命周期,初始化容器,容器探针,事件处理函数,理解其设计思路及作用

k8s中&#xff0c;为什么要设计pod 平台直接管理容器不是挺好的吗 为什么要以pod为单位进行管理&#xff0c; 然后把容器放在pod里面 那么有pod和没pod的区别是什么 也就是pod提供了什么作用 这个可以考虑从pod生命周期管理的角度去思考 如图&#xff0c;pod主容器在运行…

DataX实战:从MongoDB到MySQL的数据迁移--修改源码并测试打包

在现代数据驱动的业务环境中&#xff0c;数据迁移和集成是常见的需求。DataX&#xff0c;作为阿里云开源的数据集成工具&#xff0c;提供了强大的数据同步能力&#xff0c;支持多种数据源和目标端。本文将介绍如何使用DataX将数据从MongoDB迁移到MySQL。 环境准备 安装MongoDB…

从0新建一个微信小程序实现一个简单跳转

首先 1.从这里下载开发工具 https://developers.weixin.qq.com/miniprogram/dev/framework/quickstart/getstart.htm 2. 等下载完毕后 创建一个空白项目 在pages目录下右键创建一个page : testUI,这时候会生成四个文件 新建一个文件夹 testUI 给他们放一起 3.增加一个按钮 …

实战OpenCV之图像滤波

基础入门 图像滤波是数字图像处理中一种非常重要的技术&#xff0c;主要用于图像噪声去除、图像平滑、突出图像特征&#xff0c;或者进行图像风格的转换。它通过数学运算对图像中的像素值进行修改&#xff0c;以达到特定的处理目的。图像滤波可以分为两大类&#xff0c;分别为&…

matlab划分区域的等高线云图(代码)

出图结果如下&#xff1a; 代码如下&#xff0c;按需修改 clear;clc; numRows100; %数据区域&#xff0c;步长&#xff0c;步数 numCols100; ax-2;bx2; ay-2;by2; hx(bx-ax)/numCols; hy(by-ay)/numRows; XXCax:hx:bx; %坐标阵&#xff0c;data Y…

Ubuntu磁盘不足扩容

1.问题 Ubuntu磁盘不足扩容 2.解决方法 安装一下 sudo apt-get install gpartedsudo gparted

如何使用 Bittly 为基于 HTTP 的 API 快速创建 UI 操作界面

在开发 Web 应用或服务时&#xff0c;通常会提供不同数量的 API 接口给客户端或其他第三方使用&#xff0c; 当 API 数量达到一定数量的时候&#xff0c;在处理接口间的调用链以及参数关系时就会变得异常麻烦。 在这种情况下便可通过 Bittly 的面板功能将这些 API 结构进行组装…

vue3的生命周期有哪些

vue3的生命周期&#xff1a;1、beforecreate&#xff1b;2、created&#xff1b;3、beforemount&#xff1b;4、mounted&#xff1b;5、beforeupdate&#xff1b;6、updated&#xff1b;7、beforedestroy&#xff1b;8、destroyed&#xff1b;9、activated&#xff1b;10、deac…

洛谷-P5461 赦免战俘(Java递归)

题目背景 借助反作弊系统&#xff0c;一些在月赛有抄袭作弊行为的选手被抓出来了&#xff01; 题目描述 样例 #1 样例输入 #1 3样例输出 #1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1…

【机器学习】过拟合与欠拟合——如何优化模型性能

【机器学习】过拟合与欠拟合——如何优化模型性能 1. 引言 在机器学习中&#xff0c;模型的表现不仅依赖于算法的选择&#xff0c;还依赖于模型对数据的拟合情况。过拟合&#xff08;Overfitting&#xff09;和欠拟合&#xff08;Underfitting&#xff09;是模型训练过程中常…

黑马智数Day4-1

新增月卡 配置路由完成跳转 {path: /cardAdd,component: () > import(/views/car/car-card/add-card) }<el-button type"primary" click"$router.push(/cardAdd)">添加月卡</el-button> 车辆信息表单验证 <el-form :model"carInf…

自定义安装WSL和WSL迁移到指定位置

安装 WSL 到指定磁盘 配置环境 打开控制面板&#xff0c;找到程序–>右击启用或关闭Windows功能 向下滑动&#xff0c;找到“适用于Linux的Windows子系统”和“虚拟机平台”两个选项&#xff0c;勾选上&#xff0c;然后重启电脑 安装Ubuntu20.04 1. 下载发行版 打开链接…

全能通人工智能的能力评估框架-Levels of AGI: Operationalizing Progress on the Path to AGI

译自’Levels of AGI: Operationalizing Progress on the Path to AGI’&#xff0c;有所删节.笔者能力有限&#xff0c;敬请勘误。 摘要 Google DeepMind提出一种针对通用人工智能 (Artificial General Intelligence, 简称AGI) 框架&#xff0c;该框架用于评估AGI的模型及早期…