ES向量功能实战:向量搜索

1 缘起

项目需要,向量搜索使用ES,为了顺利使项目顺利交付,开始学习ES的稠密向量功能,本文即ES向量的实践:增删查改。ES从7.x版本支持向量功能,为测试ES向量功能,需要使用7.x及以上的版本。本文从ES环境搭建开始,完成ES向量功能实践,分享如下。
在这里插入图片描述

2 Docker部署ES

2.1 配置ES config

# 打开系统配置文件
vim /etc/sysctl.conf
# 添加修改内容
vm.max_map_count=655360
# 生效
sudo systcl -p

2.2 拉取镜像

拉取指定版本ES,如8.12.2,
稠密向量功能是ES在7.x版本之后推出的功能。

docker pull docker.elastic.co/elasticsearch/elasticsearch:8.12.2

2.3 启动ES

docker run -dit \
--restart=always \
--name es01-8-12-2 \
-p :9300 \
-v /home/xindaqi/data/es-8-12-2/data:/usr/share/elasticsearch/data \
-v /home/xindaqi/data/es-8-12-2/logs:/usr/share/elasticsearch/logs \
-e ES_JAVA_OPS="-Xms512m -Xmx1g" \
-e discovery.type="single-node" \
-e ELASTIC_PASSWORD="admin-es" \
-m 1GB \
docker.elastic.co/elasticsearch/elasticsearch:8.12.2

2.4 测试连接ES

  • cURL
curl --location 'http://localhost:9200' \
--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw=='
  • 浏览器访问:
http://localhost:9200

用户名:elastic
密码:admin-es

在这里插入图片描述

3 向量操作

ES向量功能使用了新的数据类型:dense_vector,创建索引时,需要指定存储向量属性的类型为dense_vector,同时指定向量维度,当然,创建索引时可以不指定dense_vector类型,ES会自动识别类型,需要注意的是,当向量为低维度数据时,会被识别为float,因此,当使用低维度的数据时,为保险起见,需要在创建索引时指定dense_vector类型。

3.1 新建向量索引

新建向量索引格式:
index-name用户指定的索引名称,用户自定义即可。

http://localhost:9200/index-name

参数:

"field-name":{
    "type":"dense_vector",
    "dims": n
}

其中,filed-name为用户设定的属性名称,n为向量维度,其余为固定值。

样例如下:

curl --location --request PUT 'http://localhost:9200/vector-test' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
--data '{
    "mappings": {
        "properties": {
            "dense_value":{
                "type":"dense_vector",
                "dims":5
            },
            "text": {
                "type": "text"
            },
            "uid":{
                "type":"keyword"
            }
        }
    }
}'

3.2 插入向量数据

插入向量数据需要和定义的向量维度相同,否则插入失败

  • 格式:
http://172.22.75.234:9200/index-name/_doc/id

其中,index-name为用户指定的索引名称,id为数据id。

  • 样例如下:
curl --location 'http://172.22.75.234:9200/vector-test/_doc/5' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
--data '{
    "uid": "5",
    "text": "新增的数据5",
    "dense_value": [
        0.6369616873214543,
        0.2697867137638703,
        0.04097352393619469,
        0.016527635528529094,
        0.8132702392002724
    ]
}'

更新向量数据

  • 格式:
http://172.22.75.234:9200/index-name/_update/id

其中,index-name为用户指定的索引名称,id为数据id。

  • 样例如下:
curl --location 'http://172.22.75.234:9200/vector-test/_update/1' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
--data '{
    "doc": {
        "uid": "1",
        "text": "新增的数据11",
        "dense_value": [
            0.6369616873214543,
            0.2697867137638703,
            0.04097352393619469,
            0.016527635528529094,
            0.8132702392002724
        ]
    }
}'

3.3 查询向量数据

3.3.1 相似度查询

相似度查询使用knn,相似度计算使用:cosine

  • 格式:
http://172.22.75.234:9200/index-name/_search

其中,index-name为用户指定的索引名称。

{
    "knn":{
        "field":"filed-name",
        "query_vector":[v1, v2, v-dim],
        "k": n,
        "num_candidates": m
    }

其中,field-name为用户定义的向量属性,n为查询的前n个相似数据(分数从大->小排列),v1为向量值,维度与定义的索引维度一致,否则会报错,m为候选数据数量(等看了官方文档再更新)。

  • 样例如下:
curl --location 'http://172.22.75.234:9200/vector-test/_search' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
--data '{
    "knn":{
        "field":"dense_value",
        "query_vector":[
                        0.6369616873214543,
                        0.2697867137638703,
                        0.04097352393619469,
                        0.016527635528529094,
                        0.8132702392002724
                    ],
        "k": 3,
        "num_candidates": 100
    },
    "_source":{
        "excludes":["dense_value"],
        "includes":["text", "uid"]
    }
}'

3.3.2 条件查询

根据指定条件筛选数据,应用于只使用精准过滤的情况。

  • 格式:
http://172.22.75.234:9200/index-name/_search

其中,index-name为用户指定的索引名称,id为数据id。

{
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "field-name": [v1, v2, ..., vn]
                    }
                }
            ]
        }
    }
}

其中,filed-name为用户自定义的属性名称,v1为属性的值。

  • 样例如下:
curl --location 'http://172.22.75.234:9200/vector-test/_search' \
--header 'Content-Type: application/json' \
--header 'Authorization: Basic ZWxhc3RpYzphZG1pbi1lcw==' \
--data '{
    "query": {
        "bool": {
            "filter": [
                {
                    "terms": {
                        "uid": ["0","1"]
                    }
                }
            ]
        }
    },
    "_source": {
        "includes": ["text","uid"],
        "excludes": [
            "dense_value"
        ]
    }
}'

4 小结

(1)Docker部署ES时通过ELASTIC_PASSWORD配置密码;
(2)ES7.x之后的版本支持稠密向量功能;
(3)创建使用稠密向量的索引时,需要指定属性类型:dense_vector和向量维度;
(4)向量维度固定后,后续使用向量进行操作(插入数据/插叙数据/更新数据)时必须保持一直,否则报错。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java基础系列】时间戳

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

05-Linux部署MySQL

Linux部署MySQL 在今后的使用过程中,需要频繁使用Linux系统,所以在Linux上安装软是必不可少的操作 。 前置要求 需要学习前四章知识,初识Linux、Linux基础命令、Linux权限管理、Linux高阶技巧这4个章节。需要开启多态虚拟机,电…

运筹学_1.3 单纯形法的原理

1.3 单纯形法的原理 一、构造初始可行基二、得到初始基可行解三、最优性检验(解的判别定理)四、基变换(确定主元及主元列)1、确定换入变量2、确定换出变量 五、迭代运算(矩阵的初等行变换) 一、构造初始可行基 构造初始可行基的方…

基于springboot+vue的校园商铺管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

day09_商品管理订单管理SpringTaskEcharts

文章目录 1 商品管理1.1 添加功能1.1.1 需求说明1.1.2 核心概念SPUSKU 1.1.3 加载品牌数据CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加载商品单元数据ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

python并发 map函数的妙用

1.map是什么? map函数是Python中的一个内置函数,用于将一个函数应用到一个或多个可迭代对象的每个元素上,生成一个新的可迭代对象。它的一般形式是: map(function, iterable1, iterable2, ...)其中,function是一个函…

c++之旅——第三弹

大家好啊,这里是c之旅第三弹,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦! 一.命名空间;…

OpenCV 4基础篇| OpenCV图像的裁切

目录 1. Numpy切片1.1 注意事项1.2 代码示例 2. cv2.selectROI()2.1 语法结构2.2 注意事项2.3 代码示例 3. Pillow.crop3.1 语法结构3.2 注意事项3.3 代码示例 4. 扩展示例:单张大图裁切成多张小图5. 总结 1. Numpy切片 语法结构: retval img[y:yh, x…

单源最短路的综合应用

1135. 新年好 - AcWing题库 单源最短路和暴搜的结合 import java.util.*;class PII implements Comparable<PII>{int num, distance;public PII(int num, int distance){this.num num;this.distance distance;}public int compareTo(PII o){return distance - o.dista…

解读OWASP软件保障成熟度模型SAMM

OWASP软件保证成熟度模型&#xff08;SAMM&#xff09;可为所有类型的组织分析和改进其软件安全态势提供有效和可衡量的方法。OWASP SAMM支持完整的软件生命周期&#xff0c;包括开发和获取&#xff0c;并且与技术和过程无关。 1. 简介 OWASP软件保证成熟度模型&#xff08;SA…

文生视频基础1:sora技术报告学习

sora技术报告学习 背景学后理解训练流程技术拆解编码解码扩散模型训练用数据 28号直播交流会后的一些想法自身的一点点想法 参考 原文地址&#xff1a;Video generation models as world simulators 背景 此项目的背景是基于Datawhale的关于sora技术文档的拆解和相关技术讲解…

什么是支持向量机(Support vector machine)和其原理

作为机器学习的基础算法&#xff0c;SVM被反复提及&#xff0c;西瓜书、wiki都能查到详细介绍&#xff0c;但是总是觉得还差那么点&#xff0c;于是决定自己总结一下。 一、什么是SVM&#xff1f; 1、解决什么问题&#xff1f; SVM&#xff0c;最原始的版本是用于最简单的线…

部署bpmn项目实现activiti流程图的在线绘制

本教程基于centos7.6环境中完成 github开源项目: https://github.com/Yiuman/bpmn-vue-activiti软件&#xff1a;git、docker 1. 下载源代码 git clone https://github.com/Yiuman/bpmn-vue-activiti.git2. 修改Dockerfile文件 声明基础镜像&#xff0c;将项目打包&#xff…

vue2+若依框架plus交互 路由介绍

本周及寒假 参加了校企合作的工程过程管理&#xff0c;和学长学姐一起写项目&#xff0c;之前学了vue也没有应用&#xff0c;然后对框架很多组件的用法不太了解&#xff0c;前期耽误了一些时间。 框架模块 首先是框架模块的介绍 api存了一些系统管理及发送请求的方法 例如p…

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型&#xff08;自行车模型&#xff09; 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线&#xff08;Dubins Curve&#xff09; 2、Reeds Shepp Curve 三、多项式曲线&#xff08;Poly…

redis7.2.2|Dict

文章目录 StructredisDBdictdictTypedictEntry 宏定义散列函数散列冲突dictEntry pointer bit tricks[指针位技巧]API implementation_dictReset_dictInitdictCreatedictGetHashdictSetKeydictSetValdictSetNextdictGetNextdictGetValdictGetKey_dictCleardictEmptydictRelease…

五、西瓜书——集成学习

1.个体与集成 集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能&#xff0c;这对“弱学习器”(weak learner)尤为明显因此集成学习的很多理论研究都是针对弱学习器进行的而基学习器有时也被直接称为弱学习器。 要获得好的集成个体学习器应“好而不同”…

详解JavaScript的函数

详解 JavaScript 的函数 函数的语法格式 创建函数/函数声明/函数定义 function 函数名(形参列表) { 函数体 return 返回值; // return 语句可省略 } 函数调用 函数名(实参列表) // 不考虑返回值 返回值 函数名(实参列表) // 考虑返回值 示例代码 //定义的没有参数列表&am…

5个好玩神奇还免费的工具网站收藏不后悔-搜嗖工具箱

生命倒计时 http://www.thismuchlonger.com 这是一个相哇塞的网站&#xff0c;可以让我们静下心来好好想想我们来这个世界究竟为了什么&#xff0c;因为当我们作为命运的主宰者。敲打键盘设定好自己一生长度的时候&#xff0c;我们的剩余寿命已经成绝对值&#xff0c;一旦生命…

mysql5.7配置主从

原理&#xff1a; MySQL主从复制的工作原理如下:1. 主服务器产生Binlog日志当主服务器的数据库发生数据修改操作时,如INSERT、UPDATE、DELETE语句执行,主服务器会记录这些操作的日志信息到二进制日志文件中。2. 从服务器读取Binlog日志 从服务器会向主服务器发送请求,主服务器把…