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

这篇具有很好参考价值的文章主要介绍了高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

近年来,随着深度学习技术的发展,向量搜索引发了人们的广泛关注。早在 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 来生成每个文档的向量表示。然后,我们生成了四个不同的文档向量,并将其输出打印到控制台。如下图所示:

elasticsearch 向量搜索,elasticsearch,python,大数据,搜索引擎,全文检索

结果参考:

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的向量作为检索条件,执行结果如下:

elasticsearch 向量搜索,elasticsearch,python,大数据,搜索引擎,全文检索

四、结语

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

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

推荐阅读

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

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

  3. 如何系统的学习 Elasticsearch ?

  4. 2023,做点事

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

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

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

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

elasticsearch 向量搜索,elasticsearch,python,大数据,搜索引擎,全文检索

大模型时代,抢先一步学习进阶干货!文章来源地址https://www.toymoban.com/news/detail-606455.html

到了这里,关于高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 构建搜索引擎,而非向量数据库(Vector DB) [译]

    作者: Panda Smith 在过去 12 个月中,我们见证了向量数据库(Vector DB)创业公司的迅猛增长。我此刻并不打算深入探讨它们各自的设计取舍。相反,我更想探讨和解释一些关于向量数据库的常见理解——它是什么、它的功能用途,以及在解决问题时,我们应如何恰当地利用向

    2024年02月04日
    浏览(36)
  • Elasticsearch 向量相似搜索

    Elasticsearch 向量相似搜索的原理涉及使用密集向量(dense vector)来表示文档,并通过余弦相似性度量来计算文档之间的相似性。以下是 Elasticsearch 向量相似搜索的基本原理: 向量表示文档 : 文档的文本内容经过嵌入模型(如BERT、Word2Vec等)处理,得到一个密集向量(dense v

    2024年02月04日
    浏览(42)
  • Elasticsearch:使用 Elasticsearch 向量搜索和 FastAPI 构建文本搜索应用程序

    在我的文章 “Elastic:开发者上手指南” 的 “ NLP - 自然语言处理及矢量搜索 ”,我对 Elastic Stack 所提供的矢量搜索有大量的描述。其中很多的方法需要使用到 huggingface.co 及 Elastic 的机器学习。这个对于许多的开发者来说,意味着付费使用。在那些方案里,带有机器学习的

    2024年02月09日
    浏览(40)
  • 向量数据库:使用Elasticsearch实现向量数据存储与搜索

    Here’s the table of contents:   Elasticsearch在7.x的版本中支持 向量检索 。在向量函数的计算过程中,会对所有匹配的文档进行线性扫描。因此,查询预计时间会随着匹配文档的数量线性增长。出于这个原因,建议使用查询参数来限制匹配文档的数量(类似二次查找的逻辑,先使

    2024年02月07日
    浏览(42)
  • Elasticsearch:运用向量搜索通过图像搜索找到你的小狗

    作者:ALEX SALGADO 你是否曾经遇到过这样的情况:你在街上发现了一只丢失的小狗,但不知道它是否有主人? 了解如何使用向量搜索或图像搜索来做到这一点。 您是否曾经遇到过这样的情况:你在街上发现了一只丢失的小狗,但不知道它是否有主人? 在 Elasticsearch 中通过图像

    2024年02月03日
    浏览(33)
  • Elasticsearch:向量搜索 (kNN) 实施指南 - API 版

    作者:Jeff Vestal 本指南重点介绍通过 HTTP 或 Python 使用 Elasticsearch API 设置 Elasticsearch 以进行近似 k 最近邻 (kNN) 搜索。 对于主要使用 Kibana 或希望通过 UI 进行测试的用户,请访问使用 Elastic 爬虫的语义搜索入门指南。你也可以参考文章 “ChatGPT 和 Elasticsearch:OpenAI 遇见私有数

    2024年02月04日
    浏览(43)
  • Elasticsearch:如何部署 NLP:文本嵌入和向量搜索

    作为我们自然语言处理 (NLP) 博客系列的一部分,我们将介绍一个使用文本嵌入模型生成文本内容的向量表示并演示对生成的向量进行向量相似性搜索的示例。我们将在 Elasticsearch 上部署一个公开可用的模型,并在摄取管道中使用它来从文本文档生成嵌入。然后,我们将展示如

    2024年02月05日
    浏览(46)
  • Elasticsearch 中的向量搜索:设计背后的基本原理

    作者:ADRIEN GRAND 实现向量数据库有不同的方法,它们有不同的权衡。 在本博客中,你将详细了解如何将向量搜索集成到 Elastisearch 中以及我们所做的权衡。 你有兴趣了解 Elasticsearch 用于向量搜索的特性以及设计是什么样子吗? 一如既往,设计决策有利有弊。 本博客旨在详细

    2024年02月10日
    浏览(35)
  • 快速入门:使用 Gemini Embeddings 和 Elasticsearch 进行向量搜索

    Gemini 是 Google DeepMind 开发的多模态大语言模型家族,作为 LaMDA 和 PaLM 2 的后继者。由 Gemini Ultra、Gemini Pro 和 Gemini Nano 组成,于 2023 年 12 月 6 日发布,定位为 OpenAI 的竞争者 GPT-4。 本教程演示如何使用 Gemini API 创建嵌入并将其存储在 Elasticsearch 中。 Elasticsearch 将使我们能够执

    2024年01月21日
    浏览(31)
  • Elasticsearch:语义搜索、知识图和向量数据库概述

    结合对你自己的私有数据执行语义搜索的概述 语义搜索是一种使用自然语言处理算法来理解单词和短语的含义和上下文以提供更准确的搜索结果的搜索技术。 这种方法基于这样的想法:搜索引擎不仅应该匹配查询中的,还应该尝试理解用户搜索的意图以及所使用的单

    2024年02月16日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包