将嵌入映射到 Elasticsearch 字段类型:semantic_text、dense_vector、sparse_vector

作者: Andre Luiz

讨论如何以及何时使用 semantic_textdense_vectorsparse_vector,以及它们与嵌入生成的关系。

通过这个自定进度的 Search AI 实践学习亲自体验向量搜索。你可以开始免费云试用,或者在本地机器上尝试 Elastic。


多年来,使用嵌入来提升信息检索的相关性和准确性已经显著增长。像 Elasticsearch 这样的工具已经发展出支持这种类型数据的专用字段类型,比如密集向量、稀疏向量和语义文本。然而,为了获得良好的效果,关键在于理解如何正确地将嵌入映射到 Elasticsearch 可用的字段类型:semantic_textdense_vectorsparse_vector

本文将讨论这些字段类型、各自的适用时机,以及它们在索引和查询过程中与嵌入生成和使用策略之间的关系。

密集向量类型

在 Elasticsearch 中,dense_vector 字段类型用于存储密集向量,这些向量是文本的数值表示,其中几乎所有维度都是相关的。这些向量由语言模型生成,如 OpenAI、Cohere 和 Hugging Face,旨在捕捉文本的整体语义含义,即使它与其他文档没有共享相同的词语。

在 Elasticsearch 中,密集向量的维度上限为 4096,具体取决于所使用的模型。例如,all-MiniLM-L6-v2 模型生成 384 维向量,而 OpenAI 的 text-embedding-ada-002 生成 1536 维向量。

当需要更大的控制权时,例如使用预生成的向量、应用自定义相似度函数或与外部模型集成,dense_vector 字段通常被作为存储这类嵌入的默认类型。

何时以及为何使用 dense_vector 类型?

密集向量非常适合用于捕捉句子、段落或完整文档之间的语义相似性。当目标是比较文本的整体含义,即使它们不共享相同词语时,它们也表现得非常好。

当你已经有一个外部嵌入生成流程,使用如 OpenAI、Cohere 或 Hugging Face 等模型,并且只想手动存储和查询这些向量时,dense_vector 字段是理想选择。这种字段类型高度兼容嵌入模型,并在生成和查询上提供完全的灵活性,让你可以控制向量的生成、索引以及搜索中的使用方式。

此外,它支持多种语义搜索形式,如 KNNscript_score 查询,适用于需要调整排序逻辑的场景。这些能力使 dense_vector 成为 RAG(检索增强生成)、推荐系统以及基于相似度的个性化搜索等应用的理想选择。

最后,该字段允许你自定义相关性逻辑,可使用如 cosineSimilaritydotProductl2norm 等函数,根据你使用场景的需求来调整排序。

对于那些需要灵活性、自定义能力和与高级用例兼容性的用户来说,密集向量仍然是最佳选择。

如何对 dense_vector 类型使用查询?

对定义为 dense_vector 的字段进行搜索时,使用的是 k-nearest neighbor 查询(KNN 查询)。该查询用于查找与查询向量最接近的文档。以下是一个将 KNN 查询应用于 dense_vector 字段的示例:

{"knn": {"field": "my_dense_vector","k": 10,"num_candidates": 50,"query_vector": [/* vector generated by model */]}
}

除了使用 Knn 查询外,如果需要自定义文档评分,也可以使用 script_score 查询,将其与如 cosineSimilarity、dotProduct 或 l2norm 等向量比较函数结合,以更可控的方式计算相关性。请看示例:

{
"script_score": {"query": { "match_all": {} },"script": {"source": "cosineSimilarity(params.query_vector,
'my_dense_vector') + 1.0","params": {"query_vector": [/* vector */]}}}
}

如果你想深入了解,我推荐阅读文章《How to set up vector search in Elasticsearch》。

稀疏向量类型

sparse_vector 字段类型用于存储稀疏向量,这种向量的大多数值为零,只有少数词语具有显著权重。这种向量常见于基于词项的模型,如 SPLADE 或 ELSER(Elastic Learned Sparse EncodeR)。

何时以及为何使用稀疏向量类型?

稀疏向量非常适合在需要词汇层面更精确搜索,同时不牺牲语义智能的情况下使用。它们将文本表示为 token/value 对,仅突出最相关的词语及其权重,提供了清晰性、控制力和效率。

这种字段类型在基于词项生成向量时特别有用,比如 ELSER 或 SPLADE 模型,根据词元在文本中的相对重要性为每个词元分配不同权重。

当你想控制查询中特定词语的影响时,稀疏向量类型允许你手动调整词语的权重,以优化结果排序。

主要优势包括搜索的透明性,因为可以清楚理解为什么某个文档被认为相关;存储效率,因为只保存非零值的词元,而密集向量则保存所有维度。

此外,稀疏向量是混合搜索策略的理想补充,甚至可以与密集向量结合,将词汇精度与语义理解融合。

如何对稀疏向量类型使用查询?

sparse_vector 查询允许你基于词元/值格式的查询向量搜索文档。下面是查询示例:

{"query": {"sparse_vector": {"field": "field_sparse","query_vector": {"token1": 0.5,"token2": 0.3,"token3": 0.2}}}
}

如果你更喜欢使用训练好的模型,可以使用推理端点,它会自动将查询文本转换为稀疏向量:

{"query": {"sparse_vector": {"field": "field_sparse","inference_id": "the inference ID to produce the token/weights","query": "search text"}}
}

要进一步了解这个主题,我建议阅读《Understanding sparse vector embeddings with trained ML models》。

语义文本类型 - semantic_text

semantic_text 字段类型是 Elasticsearch 中使用语义搜索最简单、最直接的方式。它通过推理端点自动处理嵌入生成,既在索引时也在查询时完成。这意味着你不必担心手动生成或存储向量。

何时以及为何使用 semantic_text

semantic_text 字段是采用 Elasticsearch 语义搜索最简单直接的方式。它适合那些想以最少技术投入开始,并且不想手动处理向量的用户。该字段自动化了嵌入生成和向量搜索映射等步骤,使设置更快、更方便。

当你重视简洁和抽象时,应考虑使用 semantic_text,它消除了手动配置映射、嵌入生成和数据接收流程的复杂性。只需选择推理模型,剩下的由 Elasticsearch 处理。

主要优势包括自动嵌入生成(在索引和查询时进行),以及预配置支持所选推理模型的现成映射。

此外,该字段原生支持长文本自动拆分(文本分块),允许将大段文本分成更小的片段,每个片段都有自己的嵌入,提升搜索精度。这极大提高了生产力,特别适合希望快速交付价值且不想处理语义搜索底层工程的团队。

不过,虽然 semantic_text 提供速度和简洁,但也有一定限制。它支持市场标准模型,只要它们作为 Elasticsearch 中的推理端点可用。但不支持像 dense_vector 字段那样使用外部生成的嵌入。

如果你需要更多控制嵌入生成方式、想使用自己的嵌入,或者需要结合多个字段进行高级策略,dense_vectorsparse_vector 字段则提供了适合更定制或领域专用场景的灵活性。

如何对 semantic_text 类型使用查询

semantic_text 出现之前,查询要根据嵌入类型(密集或稀疏)使用不同的查询。稀疏字段用 sparse_vector 查询,密集字段用 KNN 查询。

使用 semantic_text 类型时,搜索通过 semantic 查询进行,它自动生成查询向量,并与已索引文档的嵌入进行比较。semantic_text 类型允许你定义一个推理端点来嵌入查询,如果没有指定,则会使用索引时相同的端点来处理查询。

{"query": {"semantic": {"field": "semantic_text_field","query": "search text"}}
}

要了解更多,我建议阅读文章《Elasticsearch:使用 semantic_text 简化语义搜索》。

总结

在选择如何在 Elasticsearch 中映射嵌入时,理解你想如何生成向量以及需要多少控制权是非常重要的。如果你追求简单,semantic_text 字段支持自动且可扩展的语义搜索,适合很多初始用例。当需要更多控制、微调性能或与自定义模型集成时,dense_vectorsparse_vector 字段提供所需的灵活性。

理想的字段类型取决于你的用例、可用基础设施以及机器学习堆栈的成熟度。最重要的是,Elastic 提供了构建现代且高度适应性搜索系统的工具。

原文:Elasticsearch new semantic_text mapping: Simplifying semantic search - Elasticsearch Labs

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

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

相关文章

uniapp取消浏览自动填充

为了防止浏览器自动将记住的密码回填进type"password"输入框&#xff0c;所以在type"password"输入框上面加了两行代码&#xff0c;使浏览器将密码填充到新加的输入框里&#xff0c;并将这两个input隐藏掉 <input type"password" autocomple…

从数据包到可靠性:UDP/TCP协议的工作原理分析

之前我们已经使用udp/tcp的相关接口写了一些简单的客户端与服务端代码。也了解了协议是什么&#xff0c;包括自定义协议和知名协议比如http/https和ssh等。现在我们再回到传输层&#xff0c;对udp和tcp这两传输层巨头协议做更深一步的分析。 一.UDP UDP相关内容很简单&#xf…

显卡、Cuda和pytorch兼容问题

这里写目录标题 驱动与CUDA版本兼容性问题1. **驱动与CUDA版本兼容性问题**2. **任务特性与硬件适配差异**3. **优化策略与框架配置差异**4. **散热与功耗限制**5. **数据传输与CPU瓶颈**排查建议总结 查询PyTorch中实际使用的CUDA版本**1. 查询PyTorch中实际使用的CUDA版本***…

DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案

DeepSeek 作为当前最热门的开源大模型之一&#xff0c;其强大的语义理解和生成能力吸引了大量开发者和企业关注。然而在实际部署过程中&#xff0c;无论是本地运行还是云端服务&#xff0c;用户往往会遇到各种技术挑战。本文将全面剖析 DeepSeek 部署中的常见问题&#xff0c;提…

Hadoop的目录结构和组成

Hadoop 目录结构 bin 目录&#xff1a;包含了 Hadoop 的各种命令行工具&#xff0c;如hadoop、hdfs等&#xff0c;用于启动和管理 Hadoop 集群&#xff0c;以及执行各种数据处理任务。etc 目录&#xff1a;存放 Hadoop 的配置文件&#xff0c;包括core-site.xml、hdfs-site.xm…

Python Matplotlib 库【绘图基础库】全面解析

让AI成为我们的得力助手&#xff1a;《用Cursor玩转AI辅助编程——不写代码也能做软件开发》 一、发展历程 Matplotlib 由 John D. Hunter 于 2003 年创建&#xff0c;灵感来源于 MATLAB 的绘图系统。作为 Python 生态中最早的可视化工具之一&#xff0c;它逐渐成为科学计算领…

车载以太网驱动智能化:域控架构设计与开发实践

title: 车载以太网驱动专用车智能化&#xff1a;域控架构设计与开发实践 date: 2023-12-01 categories: 新能源汽车 tags: [车载以太网, 电子电气架构, 域控架构, 专用车智能化, SOME/IP, AUTOSAR] 引言&#xff1a;专用车智能化转型的挑战与机遇 专用车作为城市建设与工业运输…

图论模板(部分)

图论模板&#xff08;部分&#xff09; maincpp #include <iostream> #include <climits> #include <limits>typedef unsigned long long ull; typedef long long ll; typedef long double ld; typedef std::pair<int, int> PII;#define rep(i, n) f…

2025年【道路运输企业安全生产管理人员】考试题库及道路运输企业安全生产管理人员考试内容

一、考试概述 2025年道路运输企业安全生产管理人员考试题库由【安全生产模拟考试一点通】平台发布&#xff0c;涵盖安全生产法律法规、车辆技术管理、从业人员管理、应急预案编制等核心领域。考试重点考察考生对安全生产主体责任、风险管控、隐患排查等实务操作的掌握程度&…

分贝计在噪音污染源识别中的用途

分贝计在噪音污染源识别中的作用 噪音污染是现代社会面临的一个普遍问题&#xff0c;尤其在城市化进程加快的背景下&#xff0c;交通、工业、建筑和娱乐活动等产生的噪音对人们的生活质量和健康造成了严重影响。为了有效管理和控制噪音污染&#xff0c;首先需要准确识别噪音的…

deepin v23.1 搜狗输入法next配置中文输入法下默认用英文标点

deepin23.1下, fcitx5的 deepin next搜狗输入法的属性页无法配置中文状态下默认用英文标点, 但是可以改以下配置来实现这一点. 搜狗输入法运行期间&#xff0c;用户修改的配置被存储在以下位置&#xff1a; ~/.config/cpis/module/im/fcitx5/com.sogou.ime.ng.fcitx5.deepin/k…

C语言:在 Win 10 上,g++ 如何编译 gtk 应用程序

在 Windows 10 上使用 g&#xff08;或 gcc&#xff09;编译基于 GTK 的 C 语言程序是完全可行的&#xff0c;且相比 Tcc 更为推荐&#xff0c;因为 g&#xff08;GNU 编译器套件&#xff09;对 GTK 的支持更加完善&#xff0c;配置也更简单。以下是详细步骤和注意事项&#xf…

84.评论日记

原链接 这个视频我发了四五条评论。评论内容甚至和下面这个视频内的其他评论一样。 找了另外的账号也发了。 发现&#xff0c;无论是我这个账号&#xff0c;还是其他的账号&#xff0c;评论都无法看到。 我大胆猜测有一种机制&#xff0c;某些官号会被设置成一种高检测的等…

【RabbitMQ】整合 SpringBoot,实现工作队列、发布/订阅、路由和通配符模式

文章目录 工作队列模式引入依赖配置声明生产者代码消费者代码 发布/订阅模式引入依赖声明生产者代码发送消息 消费者代码运行程序 路由模式声明生产者代码消费者代码运行程序 通配符模式声明生产者代码消费者代码运行程序 工作队列模式 引入依赖 我们在创建 SpringBoot 项目的…

Python-92:最大乘积区间问题

问题描述 小R手上有一个长度为 n 的数组 (n > 0)&#xff0c;数组中的元素分别来自集合 [0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]。小R想从这个数组中选取一段连续的区间&#xff0c;得到可能的最大乘积。 你需要帮助小R找到最大乘积的区间&#xff0c;并输出这…

windows触摸板快捷指南

以下是结构化整理后的触控手势说明&#xff0c;采用清晰的层级划分和标准化表述&#xff1a; **触控手势操作规范****1. 单指操作****2. 双指操作****3. 三指操作****4. 四指操作** **优化说明&#xff1a;** 触控手势操作规范 1. 单指操作 手势功能描述等效操作单击滑动选择…

VSCode launch.json 配置参数详解

使用 launch.json 配置调试环境时&#xff0c;会涉及到多个参数&#xff0c;用于定义调试器的行为和目标执行环境。以下是一些常用的配置参数&#xff1a; 1、"type" &#xff1a;指定调试器的类型&#xff0c;例如 "node" 表示 Node.js 调试器&#xff0…

mAP、AP50、AR50:目标检测中的核心评价指标解析

在目标检测任务中&#xff0c;评价指标是衡量模型性能的核心工具。其中&#xff0c;mAP&#xff08;mean Average Precision&#xff09;、AP50&#xff08;Average Precision at IoU0.5&#xff09;和AR50&#xff08;Average Recall at IoU0.5&#xff09;是最常用的指标。本…

【论文阅读】A Survey on Multimodal Large Language Models

目录 前言一、 背景与核心概念1-1、多模态大语言模型&#xff08;MLLMs&#xff09;的定义 二、MLLMs的架构设计2-1、三大核心模块2-2、架构优化趋势 三、训练策略与数据3-1、 三阶段训练流程 四、 评估方法4-1、 闭集评估&#xff08;Closed-set&#xff09;4-2、开集评估&…

[已解决] LaTeX “Unicode character“ 报错 (中文字符处理)

问题&#xff1a; 写 LaTeX 文档&#xff0c;特别是包含中文时&#xff0c;经常遇到类似下图的 “Unicode character XXXXXX” 报错 (X) Unicode character 本 (U672C) LaTeX [行 xx, 列 x] (X) Unicode character 报 (U62A5) LaTeX [行 xx, 列 x] ...这通常意味着我们的 LaTe…