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

news2024/11/15 21:51:18

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)向量维度固定后,后续使用向量进行操作(插入数据/插叙数据/更新数据)时必须保持一直,否则报错。

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

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

相关文章

算法刷题day20:二分

目录 引言概念一、借教室二、分巧克力三、管道四、技能升级五、冶炼金属六、数的范围七、最佳牛围栏 引言 这几天一直在做二分的题,都是上了难度的题目,本来以为自己的二分水平已经非常熟悉了,没想到还是糊涂了一两天才重新想清楚&#xff0…

vue3 vite项目一运行就401(Unauthorized)

问题:项目一执行: pnpm run dev, 启动就出错, Failed to load resource: the server responded with a status of 401 (Unauthorized) 分析: 项目之前是正常运行的,没有问题,回溯刚刚改动,还原…

W5300驱动说明

W5300是一款带有硬件协议栈的网络芯片,内部拥有128K的缓存,最大支持8路socket通信,与MCU之间通过16位数据总线通信,通信速度远超W5500之类以SPI作为通信接口的网络芯片,特别适合对高速网络传输有需求的应用。 本次使用…

基于springboot+vue的疫苗发布和接种预约系统

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

关于工业 24V 电源转换电路参考设计

一. 概述 在工业邻域的应用中,部分电路板输入电源为 24V,而电路板上 MCU 及外设等的供电多为 3.3V、5V 以及 12V,因此设计将 24V 降压转换为各种电压非常有必要。常用的电源转换芯片有 DCDC 及 LDO 等,了解选型依据及其电路…

DolphinScheduler——调度系统数仓任务编排规范

原文大佬的这篇DS数仓任务编排规范有借鉴意义,这里摘抄下来用作学习和知识沉淀。 前言 在使用DolphinScheduler(以下简称DS)做数仓任务管理时,数据建模分层落地到调度上缺少规范,往往比较随意,例如将所有任…

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…

【JavaEE进阶】CSS选择器的常见用法

CSS选择器的主要功能就是选中页面指定的标签元素&#xff0c;选中了元素&#xff0c;才可以设置元素的属性。 CSS选择器主要有以下几种: 标签选择器类选择器id选择器复合选择器通配符选择器 接下来用代码来学习这几个选择器的使用。 <!DOCTYPE html> <html lang&q…

【C++】set、multiset与map、multimap的使用

目录 一、关联式容器二、键值对三、树形结构的关联式容器3.1 set3.1.1 模板参数列表3.1.2 构造3.1.3 迭代器3.1.4 容量3.1.5 修改操作 3.2 multiset3.3 map3.3.1 模板参数列表3.3.2 构造3.3.3 迭代器3.3.4 容量3.3.5 修改操作3.3.6 operator[] 3.4 multimap 一、关联式容器 谈…

Angular基础---HelloWorld---Day1

文章目录 1. 创建Angular 项目2.对Angular架构的最基本了解3.创建并引用新的组件&#xff08;component&#xff09;4.对Angular架构新的认识&#xff08;多组件&#xff09;5.组件中业务逻辑文件的编辑&#xff08;ts文件&#xff09;6.标签中属性的绑定(1) ID的绑定(2) class…

django项目 法律法规管理系统

1.项目结构 2.项目需求 1.用户管理模块 2.数据采集模块 3.知识管理模块 4.智能匹配模块 5.个人收藏模块 6.数据分析模块 7.页面展示模块 3.知识点 1.智能匹配模块推荐算法的实现原理 TF (Term Frequency)&#xff1a;词频&#xff0c;表示一个词在文档中出现的频…

Latex常用符号和技巧

Latex常用符号和技巧 随笔记录,不分顺序 一些有用的Latex资源 https://latexstudio.net/ https://www.latexstudio.net/articles/ IEEE相关文件(包括IEEETransaction Latex模板,参考文件模板,相关文件和个人搜集的Latex说明文件等) 链接:https://pan.baidu.com/s/1NJ…

每个大模型开发者都应该知道的数字

GitHub - ray-project/llm-numbers: Numbers every LLM developer should know 谷歌内部流传了一份由传奇工程师 Jeff Dean 整理的文档&#xff0c;名为《每个工程师都应该知道的数字》。大语言模型&#xff08;LLM&#xff09;开发人员们同样需要一组类似的数字为粗略计算做参…

steam++加速问题:出现显示443端口被 vmware-hostd(9860)占用的错误。

目录 前言&#xff1a; 正文&#xff1a; 前言&#xff1a; 使用Steam对GitHub进行加速处理时&#xff0c;建议使用2.8.6版本。 下载地址如下&#xff1a;Release 2.8.6 BeyondDimension/SteamTools GitHub 下载时注意自己的系统位数 正文&#xff1a; 使用GitHub时会使…

Spring重点记录

文章目录 1.Spring的组成2.Spring优点3.IOC理论推导4.IOC本质5.IOC实现&#xff1a;xml或者注解或者自动装配&#xff08;零配置&#xff09;。6.hellospring6.1beans.xml的结构为&#xff1a;6.2.Spring容器6.3对象的创建和控制反转 7.IOC创建对象方式7.1以有参构造的方式创建…

WPF应用程序使用MVVM模式

文章目录 一、前言二、正文&#xff1a;模式 - WPF应用程序使用MVVM设计模式2.0 一些术语2.1 秩序与混乱2.2 MVVM模式的演变2.3 为何WPF开发者喜爱MVVM2.4 Demo应用程序2.5 路由命令逻辑2.6 ViewModel类层次结构2.7 ViewModelBase类2.8 CommandViewModel类2.9 MainWindowViewMo…

spring注解驱动系列--自动装配

Spring利用依赖注入&#xff08;DI&#xff09;&#xff0c;完成对IOC容器中中各个组件的依赖关系赋值&#xff1b;依赖注入是spring ioc的具体体现&#xff0c;主要是通过各种注解进行属性的自动注入。 一、Autowired&#xff1a;自动注入 一、注解介绍 1、默认优先按照类型去…

MySQL进阶:InnoDB引擎(逻辑存储结构、架构、事务原理、MVCC(面试高频))

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;MySQL进阶&#xff1a;全局锁、表级锁、行级锁总结 &#x1f4da;订阅专栏&#xff1a;MySQL进阶 希望文章对你们有所帮助 MVCC很…

jenkins实战(1)

一, Jenkins官网介绍: Jenkins 持续集成、持续部署 下载地址:Jenkins download and deployment 提供两种类型: LTS(长期版)和Weekly(最近一周的版本) 注: 必须是Java8及以上版本(官网针对这一点有做说明) 二, 安装 下载war包,java -jar XXX --httpPort8081 或 下载war包…

为什么说 TiDB 在线扩容对业务几乎没有影响

本文讨论了分布式数据库在在线扩容方面的挑战&#xff0c; 详细解释了一般分布式数据库和 TiDB 在扩容机制上的不同。 一般分布式数据库在进行在线扩容时&#xff0c;需要重新平衡数据分布&#xff0c;可能会影响系统的可用性和 IO 消耗。 相比之下&#xff0c;TiDB 的存算分离…