高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索

news2025/1/13 10:29:01

近年来,随着深度学习技术的发展,向量搜索引发了人们的广泛关注。早在 Elasticsearch在7.2.0 版本引入了dense_vector字段类型,支持存储高维向量数据,如词嵌入或文档嵌入,以进行相似度搜索等操作。在本文中,我将展示如何在Elasticsearch 8.X 版本中使用 dense_vector 进行向量搜索。

一、背景介绍

首先,我们需要了解一下dense_vector。dense_vector是Elasticsearch用于存储高维向量的字段类型,通常用于神经搜索,以便利用NLP和深度学习模型生成的嵌入来搜索相似文本。你可以在这个链接找到更多关于dense_vector的信息。

在接下来的部分,我将展示如何创建一个简单的Elasticsearch索引,该索引包含基于文本嵌入的向量搜索功能。

二、生成向量:利用Python处理

首先,我们需要用Python和BERT模型来生成文本嵌入。以下是我们如何做到这一点的示例:

import torch
from transformers import BertTokenizer, BertModel

tokenizer = BertTokenizer.from_pretrained("bert-base-uncased")
model = BertModel.from_pretrained("bert-base-uncased")


def get_bert_embedding(text):
    inputs = tokenizer(text, return_tensors="pt", max_length=128, truncation=True, padding="max_length")
    with torch.no_grad():
        outputs = model(**inputs)
    return outputs.last_hidden_state[:, :3, :].numpy()

def print_infos():
    docs = ["占地100亩的烧烤城在淄博仅用20天即成功新建,现在已成为万人争抢“烤位”的热门去处。",
            "淄博新建的一座占地100亩的烧烤城在短短20天内建成,吸引了众多烧烤爱好者,如今“烤位”已是一位难求。",
            "在淄博,一座耗时20天新建的占地100亩的烧烤城成为众人瞩目的焦点,各种美味烧烤让万人争夺“烤位”,可谓一座难求。",
            "淄博一般指淄博市。 淄博市,简称“淄”,齐国故都,山东省辖地级市,Ⅱ型大城市"]
    for doc in docs:
        print( f"Vector for '{doc}':", get_bert_embedding( doc ) )
    
if __name__ == '__main__':
    print_infos()

在上述脚本中,我们定义了一个函数 get_bert_embedding 来生成每个文档的向量表示。然后,我们生成了四个不同的文档向量,并将其输出打印到控制台。如下图所示:

d1c016c5a6d3f661dbffe3086510aad7.png

结果参考:

Vector for '占地100亩的烧烤城在淄博仅用20天即成功新建,现在已成为万人争抢“烤位”的热门去处。': [[[-0.2703271   0.38279012 -0.29274252 ... -0.24937081  0.7212287
    0.0751707 ]
  [ 0.01726123  0.1450473   0.16286954 ... -0.20245396  1.1556625
   -0.112049  ]
  [ 0.51697373 -0.01454506  0.1063835  ... -0.2986216   0.69151103
    0.13124703]]]
Vector for '淄博新建的一座占地100亩的烧烤城在短短20天内建成,吸引了众多烧烤爱好者,如今“烤位”已是一位难求。': [[[-0.22879271  0.43286988 -0.21742335 ... -0.22972387  0.75263715
    0.03716223]
  [ 0.1252176  -0.02892866  0.17054333 ... -0.30524847  0.94903445
   -0.46865308]
  [ 0.42650488  0.34019586 -0.01442122 ... -0.17345914  0.6688627
   -0.75012964]]]

三、实战探索:向Elasticsearch中导入和搜索向量

3.1 创建索引

我们首先需要在Elasticsearch中创建一个新的索引来存储我们的文档和它们的向量表示。以下是创建索引的API调用:

PUT /my_vector_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "content_vector": {
        "type": "dense_vector",
        "dims": 3
      }
    }
  }
}

在上述代码中,我们创建了一个名为 my_vector_index 的索引,并定义了两个字段:title 和 content_vector。其中,content_vector 字段的类型被设置为 dense_vector,并指定其维度为3,这与我们前面生成的BERT向量维度一致。

3.2 导入数据

接下来,我们可以将我们的文档及其相应的向量导入到索引中。以下是一个示例的批量导入API调用:

POST my_vector_index/_bulk
{"index":{"_id":1}}
{"title":"占地100亩的烧烤城在淄博仅用20天即成功新建,现在已成为万人争抢“烤位”的热门去处。","content_vector":[-0.2703271, 0.38279012, -0.29274252]}
{"index":{"_id":2}}
{"title":"淄博新建的一座占地100亩的烧烤城在短短20天内建成,吸引了众多烧烤爱好者,如今“烤位”已是一位难求。","content_vector":[-0.22879271, 0.43286988, -0.21742335]}
{"index":{"_id":3}}
{"title":"在淄博,一座耗时20天新建的占地100亩的烧烤城成为众人瞩目的焦点,各种美味烧烤让万人争夺“烤位”,可谓一座难求。","content_vector":[-0.24912262, 0.40769795, -0.26663426]}
{"index":{"_id":4}}
{"title":"淄博一般指淄博市。 淄博市,简称“淄”,齐国故都,山东省辖地级市,Ⅱ型大城市","content_vector":["0.32247472, 0.19048998, -0.36749798]}

在这个例子中,我们使用了Elasticsearch的_bulk 接口批量导入数据。每个文档的数据由两行组成:一行包含文档的ID,另一行包含文档的标题和内容向量。注意向量的值与我们在Python代码中生成的值是相同的。

3.3 执行检索

创建并导入数据后,我们可以执行一次相似性检索。我们将使用脚本评分查询,其中我们的评分脚本将计算查询向量与每个文档的内容向量之间的余弦相似度。

以下是一个API调用的例子:

GET my_vector_index/_search
{
  "query": {
    "script_score": {
      "query": {
        "match_all": {}
      },
      "script": {
        "source": "cosineSimilarity(params.query_vector, 'content_vector') + 1.0", 
        "params": {
          "query_vector": [-0.2703271, 0.38279012, -0.29274252]  
        }
      }
    }
  }
}

在上述查询中,我们定义了一个脚本评分查询script_score。该查询首先执行一个匹配所有文档的查询(match_all),然后根据我们的脚本对每个文档进行评分。

评分脚本cosineSimilarity(params.query_vector, 'content_vector') + 1.0计算查询向量和每个文档的content_vector字段之间的余弦相似度,并将结果加1(因为余弦相似度的范围是-1到1,而Elasticsearch的评分必须是非负的)。

我们拿文档1的向量作为检索条件,执行结果如下:

5e1f6f7084f9952b625ddea74e203d76.png

四、结语

基于向量的搜索方法正在不断发展,Elasticsearch也在不断改进和扩展其功能以跟上这一趋势。

为了充分利用Elasticsearch的能力,请确保关注其官方文档和更新,以便了解最新的功能和最佳实践。使用dense_vector字段和相关的搜索方法,我们可以在Elasticsearch中实现复杂的向量搜索,为用户提供更精确和个性化的搜索体验。

推荐阅读

  1. 全网首发!从 0 到 1 Elasticsearch 8.X 通关视频

  2. 重磅 | 死磕 Elasticsearch 8.X 方法论认知清单

  3. 如何系统的学习 Elasticsearch ?

  4. 2023,做点事

  5. Elasticsearch:普通检索和向量检索的异同?

  6. 干货 | Elasticsearch 向量搜索的工程化实战

e95254832cca84592382b81f68ea9675.jpeg

更短时间更快习得更多干货!

和全球 近2000+ Elastic 爱好者一起精进!

1ae8eb84d8f49bcbf0d2e1fa7a932294.gif

大模型时代,抢先一步学习进阶干货!

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

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

相关文章

怎样录屏不带水印?分享一款无水印录制视频软件!

案例:怎样录制无水印的视频? 【我平常录制的录屏带有软件自带水印,这样十分影响观感。怎样才能录制无水印的视频?】 一款好的录屏软件,可以更好地帮助我们录制电脑屏幕上的操作或是制作教学视频。然而,很…

在四维轻云地理空间数据在线管理平台中如何上传、查看及分享数据?

四维轻云是一款地理空间数据在线管理平台,具有地理空间数据的在线管理、展示及分享等功能。在四维轻云平台中,用户可以不受时间地点的限制,随时随地在线浏览激光点云、倾斜摄影模型、正射影像、数字高程模型等地理空间数据。 现在&#xff0…

别样网站呈现方式:无缝衔接视听感受,详细讲述HTML5多媒体标签video和音频标签audio应用实例

video 语法&#xff1a; <video src"文件地址" controls"controls" </video> 常见的属性 属性 值 描 述 autoplay autoplay 视频就绪自动播放&#xff08;谷歌浏览器需要添加muted来解决自动放的问题 controls controls …

批量采集【商品详情+关键词搜索】API接口系列

批量采集【商品详情关键词搜索】API接口系列代码如下&#xff1a; item_get-获得商品详情 公共参数&#xff1a; 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;API 接口请求方式secretString是调用密钥api_nameString是API接口名称&…

深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

Qt程序打包和发布

准备工具 1、Qt Creator&#xff0c;记录Qt Creator的安装路径 2、NSIS空白脚本程序和NSIS汉化脚本程 1 Windows下打包与发布 1.1 打包成zip发布 1、通过Qt Creator build应用程序&#xff0c;选择Relaease build的应用程序占用空间少(推荐)&#xff0c;选择Debug build的应用程…

使用 PAI-Blade 优化 Stable Diffusion 推理流程

背景 AIGC是人工智能计算领域里发展迅速的重要业务。Stable Diffusion 是其中最热门的开源模型&#xff0c;受到广泛关注。然而&#xff0c;随着应用场景不断扩大&#xff0c;Stable Diffusion所面临的推理时延和计算成本问题也越来越突出。 简介 PAI-Blade是 PAI 推出的通用…

可视化搭建 - 自动批处理与冻结

性能在可视化搭建也是极为重要的&#xff0c;如何尽可能减少业务感知&#xff0c;最大程度的提升性能是关键。 其实声明式一定程度上可以说是牺牲了性能换来了可维护性&#xff0c;所以在一个完全声明式的框架下做性能优化还是非常有挑战的。我们采取了两种策略来优化性能&…

我的创作纪念日,成为创作者的第256天!

机缘 一年前刚开始学习编程&#xff0c;在网上查找资料的过程中才了解到了CSDN开发者社区。在csdn认识了很多技术大牛&#xff0c;他们的文章记录了他们的学习路径&#xff0c;看到他们从小白一步一步成长为大牛&#xff0c;这激起了我创作的热情。刚开始写博客完全是日常学习…

广域通信网 - HDLC 高级数据链路控制协议

文章目录 1 概述2 HDLC2.1 帧类型2.2 帧结构 3 扩展3.1 网工软考真题 1 概述 #mermaid-svg-JEuFH1qP4tY5jI5p {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEuFH1qP4tY5jI5p .error-icon{fill:#552222;}#mermaid-…

快看!ChatGPT的4个不为人知却非常实用的小功能

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天重点介绍四个ChatGPT很实用的小功能。 一、停止生成 如果在ChatGPT输出内容的过程中&#xff0c;我们发现结果不是自己想要的&#xff0c;可以直接点击“Stop generating”按钮&#xff0c;这样它就会立即停…

小鱼说|城市产业带与供应链系统的结合模式(2)

上一篇讲到城市产业带 的形成以及讲到 它与供应链的关系 那么我们继续把 这个话题深化一下 从原厂地到供应商 到供应链再到商城平台 城市产业带是供货的源地 经过最多二级的供应商上架 到供应链再经过最多二级的 经销商流入到各大商业平台 由于一个供应链可对接多个城市产业带 …

公网远程访问本地jupyter notebook服务 - 内网穿透

文章目录 前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5. 固定公网地址 转载自cpolar的文章&#xff1a;公网远程访问Jupyter Notebook【Cpolar内网穿透】 前言 Jupyter Notebook&am…

ChatGPT为一位英语女教师做了这件事

文 / 高扬&#xff08;微信公众号&#xff1a;量子论&#xff09; 今天有位网友加我微信&#xff0c;是某中学的英语老师&#xff0c;通过“量子论”公众号知晓了ChatGPT的一些有趣玩法&#xff0c;询问是否有办法帮她做个提示词&#xff0c;依据一个单词生成配套学习资料。 即…

代码实战深度理解RabbitMQ 5 种消息模型

5种消息模式 简单消息模式&#xff1a;1个生产者 1个队列 1个消费者&#xff1b;生产者只负责生产&#xff0c;消费者只负责消费&#xff0c;两者在同一个队列中操作工作队列消息模式&#xff1a;1个生产者 1个队列 多个消费者&#xff1b; 一条消息只能被消费一次订阅消息…

AI作曲都这么厉害了,AI生成音乐

人工智能&#xff08;AI&#xff09;正在越来越多地应用于音乐、电影和绘画等艺术领域。在之前海森大数据已经为大家介绍了AI生成绘画&#xff0c;今天带大家了解一下AI生成音乐。 在当下的应用中&#xff0c;AI音乐生成已经相对成熟&#xff0c;AI已经可以影响音乐制作过程的…

annoconda安装使用及镜像源的添加,提高软件下载速度

1 annoconda下载 文件地址列表&#xff0c;选择版本下载https://repo.anaconda.com/archive/ win10版本&#xff1a; Anaconda3-2023.03-1-Windows-x86_64 linux版本&#xff1a; Anaconda3-2023.03-1-Linux-x86_64 win10下执行exe按向导安装&#xff0c;linu…

人工智能和物联网:如何将传感器和设备数据与机器学习相结合

第一章&#xff1a;引言 人工智能&#xff08;Artificial Intelligence, AI&#xff09;和物联网&#xff08;Internet of Things, IoT&#xff09;是当今科技领域最引人注目的技术之一。随着传感器和设备的普及&#xff0c;我们能够收集到大量的实时数据。然而&#xff0c;这…

chatgpt赋能Python-python_head__

Python的head()方法 什么是head()方法&#xff1f; head()方法是Python编程语言中的一个函数&#xff0c;它用于获取一个序列的前几项。它的用法如下&#xff1a; head(n, iterable)其中&#xff0c;n表示需要返回的序列前n项&#xff0c;iterable表示需要获取前n项的序列对…

2023年海彼特全国幼儿篮球联赛·总决赛圆满落幕

5月21日&#xff0c;由北京海彼特教育科技院主办的“2023年海彼特全国幼儿篮球联赛总决赛”。在河北体育馆隆重举行&#xff0c;精彩的比赛效果使体育馆顿时成为幼儿篮球界最高端、大气的舞台。 本次盛会联合举办方有&#xff1a; 河北体育馆 亚洲少儿体育协会 北京海彼特文…