使用 Elasticsearch 作为向量数据库:深入研究 dense_vector 和 script_score

Elasticsearch 是一个非常强大且灵活的搜索和分析引擎。 虽然其主要用例围绕全文搜索,但它的用途广泛,足以用于各种其他功能。 其中一项引起许多开发人员和数据科学家关注的功能是使用 Elasticsearch 作为向量数据库。 随着 dense_vector 数据类型的出现以及利用 script_score 函数的能力,Elasticsearch 的功能已经扩展,可以促进向量相似性搜索。

向量搜索对于语义搜索的重要性

向量搜索彻底改变了我们理解和执行搜索操作的方式,特别是在语义搜索方面。 但在深入研究其意义之前,有必要了解句法 (syntatical) 搜索和语义 (semantic) 搜索之间的区别。

句法搜索与语义搜索

想象一下对 “apple alcoholic beverage” 进行搜索查询。 在句法搜索中,引擎将查找包含该确切短语的文档。 如果文档中的 “apple”、“alcoholic” 和 “beverage” 这些词不很接近或没有按照特定的顺序,则它可能不会排名靠前,甚至不会显示在结果中。 此方法是有限的,因为它严格依赖于查询的语法,并且可能会错过上下文相关的文档。

输入由向量搜索提供支持的语义搜索。 在这里,搜索引擎不是查看确切的短语,而是尝试理解查询背后的含义或意图。 在语义搜索领域,查询 “apple alcoholic beverage” 不仅仅会为你提供包含该确切短语的文档。 它将理解你查询的本质并获取与 “appletini”、“apple Brandy”、“apple bourbon” 等相关的文档。

为什么向量搜索对于语义搜索至关重要?

向量搜索在实现这种语义理解方面发挥着重要作用。 使用各种嵌入技术(例如 Word2Vec、BERT 或 FastText),可以将单词、短语甚至整个句子表示为高维空间中的向量。 在这个向量空间中,向量之间的 “距离” 表示语义相似度。 具有相似含义的单词或短语的向量彼此更接近。

当你搜索 “apple alcoholic beverage” 时,其向量表示可能接近于 “appletini”、“apple brandy” 或 “apple bourbon” 的向量。 然后,向量搜索获取这些语义相似的术语,从而实现对用户意图的语义理解。

嵌入模型背景下的向量空间

在较高的层次上,向量空间是一种数学结构,其中存在向量,并且可以执行加法和标量乘法等运算。 在嵌入模型和自然语言处理的背景下,向量空间用于将单词、句子甚至整个文档映射到数值向量

  1. 维度 (dimensionality):该空间中的每个维度都可以被视为数据的一个特征或特征。 对于单词或句子,这些维度可以捕获句法角色、语义含义、上下文或各种抽象语言属性。 维度越多,表示就越细致,但也需要更多的计算资源。
  2. 距离和相似度 (distance and similarity):将单词或句子转换为向量的主要原因是为了测量相似度。 在这些向量空间中,任何两个向量之间的 “距离”(通常使用余弦相似度或欧几里德距离等度量)可以指示这两个项目的相似程度。 向量越接近,它们就越相似。 例如,在训练有素的嵌入模型中,“king” 的向量减去 “man” 的向量加上 “woman” 的向量可能接近 “queen” 的向量,从而捕获关系语义。
  3. 训练和上下文 (training & context):嵌入模型(例如 Word2Vec 或 BERT)通过对大量文本数据进行训练来生成这些向量。 在此训练期间,模型学习以在向量空间中捕获上下文相似性(单词与其他单词的关系如何使用)的方式来表示单词或句子。 这就是为什么同义词或主题相关的单词最终在空间中具有彼此接近的向量。

向量搜索的机制

一旦有了一组向量(无论是单词、句子还是文档),进行向量搜索涉及:

  1. 查询转换:使用相同的嵌入模型将搜索查询转换为其向量表示。
  2. 距离计算:对于数据库中的每个项目(或子集,取决于优化),计算查询向量和项目向量之间的距离(或相似度得分)。
  3. 排名:根据项目与查询向量的距离或相似度对项目进行排名。 向量最接近查询向量的项目被认为是最相关的,并作为顶部结果返回。
3D 空间中 “kitten” 一词的向量搜索表示。

密集向量数据类型的兴起

Elasticsearch 的密集矢量数据类型旨在存储浮点值的向量。 这些向量通常用于机器学习,特别是对于在高维空间中将项目表示为向量的嵌入。 例如,来自 Word2Vec 等模型的词嵌入或来自 BERT 等模型的句子嵌入可以使用密集向量数据类型进行存储。

要存储向量,你可以定义如下映射:

{"properties": {"text-vector": {"type": "dense_vector","dims": 512}}
}

这里,dims 表示向量的维数。

利用 script_score 的强大功能来实现向量相似度

为了执行向量相似性搜索,我们需要测量给定向量与数据库中其他向量的接近程度。 一种常见的方法是计算向量之间的点积。 Elasticsearch 中的 script_score 函数允许我们根据脚本计算文档的自定义分数。 通过使用此功能,我们可以计算查询向量与数据库中存储的向量之间的点积。

dotProduct 函数可以在 script_score 中使用,如下所示:

{"query": {"script_score": {"query": {"match_all": {}},"script": {"source": "dotProduct(params.queryVector, 'text-vector') + 1.0","params": {"queryVector": [...]}}}}
}

这里,params.queryVector 是你要搜索的向量,“text-vector” 是指存储向量的字段。

为什么是“+1.0”?

精明的观察者可能会对在 dotProduct 函数之外添加 + 1.0 感到好奇。 由于 Elasticsearch 内的限制,这一添加至关重要:它无法处理负分数值。 通过添加 1.0,我们确保查询返回的所有得分值均保持为正值。

然而,重要的是要记住,这种加法可能会扭曲向量之间的相对相似性测量,特别是当点积接近于零时。 如果需要精确的相似度值,开发人员应在查询返回后手动对分数进行后处理,减去 1.0 加法以检索原始点积值。

Elasticsearch 相对于其他向量搜索库的优势

使用 Elasticsearch 作为向量数据库的不可否认的优势之一是其内置功能可以过滤特定数据子集的查询。 当你想要缩小搜索空间或当你的应用程序需要上下文感知向量搜索时,此功能非常有用。

相比之下,虽然 ChromaDB 和 Faiss 等其他专用矢量搜索库为纯向量搜索提供了无可挑剔的速度和效率,但它们缺乏 Elasticsearch 中提供的全功能查询功能。 例如,ChromaDB 确实允许查询元数据,但它仅限于字符串的精确匹配。 这种限制有时会阻碍复杂搜索场景中所需的灵活性和粒度。

将 Elasticsearch 丰富的查询环境与向量相似性搜索相结合意味着用户可以两全其美:基于矢量的精确结果,并通过使用细致入微的上下文感知过滤器对这些搜索进行分层的能力来增强。 这种合并使 Elasticsearch 成为需要深度和广度搜索功能的开发人员的一个令人信服的选择。

Elasticsearch 版本 8 的进步:值得注意的是,虽然版本 7 存在一些限制,但由原始 Elasticsearch 团队开发的最新 Elasticsearch 版本 8 已经合并了 HNSW,从而提高了其在向量搜索领域的功能。

Elasticsearch 进入向量搜索领域的旅程凸显了它的多功能性和适应性。 虽然最初并未设计为向量数据库,但其功能已通过诸如 dense_vector 数据类型和 script_score 函数等创新进行了扩展。 这些进步使 Elasticsearch 成为向量相似性搜索的可行工具,弥合了传统全文搜索与向量表示实现的语义理解的微妙领域之间的差距。Elasticsearch 的灵活性和广泛的查询功能使其在多方面的搜索场景中具有无价的价值。 

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

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

相关文章

Linux多线程编程- 无名信号量

简介 无名信号量(在 POSIX 环境下通常指 sem_t 类型的信号量)是用于同步和互斥的原语,它允许线程和进程按照预期的顺序执行,并确保对共享资源的安全访问。无名信号量与命名信号量的主要区别在于它们的可见性和生命周期。无名信号…

基本分段存储管理方式(分段,段表,地址转换以及与分页管理对比)

1.分段 1.进程的地址空间: 按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名 (在低级语言中,程序员使用段名来编程),每段从0开始编址. 2.内存分配规则: 以段为单位进行分配,每个段在内存中占据…

学习笔记---超基础+详细+新手的顺序表~~

目录 1.顺序表的前言 1.1 顺序表--->通讯录📇 1.2 数据结构的相关概念🏇 1.2.1 什么是数据结构 1.2.1 为什么需要数据结构 2. 顺序表概念及分类 2.1 顺序表的概念🐙 2.2 顺序表的分类🐫 2.2.1 顺序表和数组的区别 2.…

金x软件有限公司安全测试岗位面试

目录 一、自我介绍 二、你是网络空间安全专业的,那你介绍下网络空间安全这块主要学习的东西? 三、本科专业是网络工程,在嘉兴海视嘉安智城科技有限公司实习过,你能说下干的工作吗?(没想到问的是本科实习…

第一个Spring程序

目录 一、怎么创建Spring项目 1.1 使用maven创建Spring项目 1.2 导入Spring相关依赖 二、Spring的配置文件 三、使用Spring配置文件创建类对象 3.1 Spring核心api 3.2 Spring程序开发 一、怎么创建Spring项目 1.1 使用maven创建Spring项目 在创建新项目的时候使用maven去创建…

DDoS检测防御实现方案

流量采集模式 通过分光器将流量直接镜像到攻击检测器,收包采用DPDK库。 当前整机流量、源IP信息、连接数 、连接内容(五元组等)的信息汇聚 当发生告警时采样原始数据包, 采用固定采样算法 基于检测对象的TCP syn ack psh ack established的个数、流量…

系统架构师备考倒计时19天(每日知识点)

软件架构评估(ATAM) 在SAAM的基础上发展起来的,主要针对性能、实用性、安全性和可修改性,在系统开发之前,对这些质量属性进行评价和折中。ATAM方法的主要活动领域包括: 第一阶段 场景和需求收集 收集场景…

NLP算法面经 | 腾讯 VS 美团

作者 | 曾同学 编辑 | NewBeeNLP 面试锦囊之面经分享系列,持续更新中 后台回复『面试』加入讨论组交流噢 lz从3月初脚因打球扭伤了开始,投递简历,接二连三的面试鞭尸又面试,昨天才终于上岸了,分享经验~ 腾讯PCG看点&…

动态规划-买卖股票系列

121.买卖股票的最佳时机 Python: class Solution(object):def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""if len(prices)0:return 0dplen(prices)*[0]minpriceint(prices[0])for i in range (1,len(prices)):minprice…

element plus 的图片上传组件回显

element图片回显是通过修改file-list属性的url属性实现的。 <!-- 图片上传 --><el-form-item label"景区图片" prop"s_img"><el-uploadlist-type"picture-card":action"网址":on-change"handleChange":befor…

【Python-Django】基于TF-IDF算法的医疗推荐系统复现过程

复现步骤 step1&#xff1a; 修改原templates路径&#xff0c;删除&#xff0c;将setting.py中的路径置空 step2&#xff1a; 注册app python manage.py startapp [app名称]在app目录下创建static和templates目录 step3&#xff1a; 将项目中的资源文化进行拷贝 step4&#…

新能源电池试验中准确模拟高空环境大气压力的解决方案

摘要&#xff1a;针对目前新能源电池热失控和特性研究以及生产中缺乏变环境压力准确模拟装置、错误控制方法造成环境压力控制极不稳定以及氢燃料电池中氢气所带来的易燃易爆问题&#xff0c;本文提出了相应的解决方案。方案的关键一是采用了低漏率电控针阀作为下游控制调节阀实…

《省级国土空间规划编制技术规程》国家标准(GB/T 43214-2023)原文下载

《省级国土空间规划编制技术规程》国家标准&#xff08;GB/T 43214-2023&#xff0c;以下简称《规程》&#xff09;&#xff0c;将于2024年1月1日起实施&#xff0c;该《规程》由市场监管总局&#xff08;国家标准委&#xff09;9月7日批准发布。 《规程》由自然资源部组织编制…

Steam将强制执行短信验证以遏制肆虐的恶意更新

为应对最近爆发的恶意更新&#xff0c;著名游戏平台Steam出品方Valve近日发布公告称&#xff0c;将为Steam 上发布游戏的开发者实施额外的安全措施&#xff0c;包括基于短信的确认码。 游戏及软件开发商在 Steam 平台上分发其产品需要用到Steamworks&#xff0c;它支持DRM&…

GEO生信数据挖掘(九)WGCNA分析

第六节&#xff0c;我们使用结核病基因数据&#xff0c;做了一个数据预处理的实操案例。例子中结核类型&#xff0c;包括结核&#xff0c;潜隐进展&#xff0c;对照和潜隐&#xff0c;四个类别。第七节延续上个数据&#xff0c;进行了差异分析。 第八节对差异基因进行富集分析。…

LeetCode 260. 只出现一次的数字 III:异或

【LetMeFly】260.只出现一次的数字 III 力扣题目链接&#xff1a;https://leetcode.cn/problems/single-number-iii/ 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返…

数据分析案例-基于snownlp模型的MatePad11产品用户评论情感分析(文末送书)

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Android 内容提供者和内容观察者:数据共享和实时更新的完美组合

任务要求 一个作为ContentProvider提供联系人数据另一个作为Observer监听联系人数据的变化&#xff1a; 1、创建ContactProvider项目&#xff1b; 2、在ContactProvider项目中用Sqlite数据库实现联系人的读写功能&#xff1b; 3、在ContactProvider项目中通过ContentProvid…

深度学习-卷积神经网络

文章目录 应用卷积神经网络卷积处理分类问题 应用 图片分类图片检索图片分割图片风格迁移姿态估计OCR等 卷积神经网络 核概念计算机视觉中处理图片的核大小是通过经验得来的&#xff0c;而深度学习中的权重大小是自己学习出的。卷积VS神经网络&#xff1a;一个是局部观察一个…

Go-Python-Java-C-LeetCode高分解法-第十周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接&#xff1a;LeetCode-Go-Python-Java-C 欢迎订阅CSDN专栏&#xff0c;每日一题&#xff0c;和博主一起进步 LeetCode专栏 我搜集到了50道精选题&#xff0c;适合速成概览大部分常用算法 突…