ES 如何实现向量搜索【以图搜图/语义搜索】

这篇具有很好参考价值的文章主要介绍了ES 如何实现向量搜索【以图搜图/语义搜索】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ES 如何实现向量搜索

在 ES 的使用过程中,通过设置分词器可以灵活地按照文本字面实现搜索和查询。但是在某些场景下,向量搜索非常有必要,比如 CV 方面的以图搜图和 NLP 领域的语义搜索。较新的 ES 版本支持稠密向量搜索,详情如下。相关片段设置重在强调特定的关键点,需要根据自己具体使用的工具或方式进行改动或设置。

设置 mappings

此处重点就是 “dense_vector” 的 type 设置,"dims"设置为具体的向量长度。

{
        "mappings": {
            "properties": {
                "entity_name": {
                    "type": "keyword"
                },
                "entity_name_embedding":{
                  	# 此处为 mappings 中关于稠密向量设置的重点
                    "type": "dense_vector",
                    "dims": 768
                }
            }
        }
}

新建 index

按照前面设置的 mappings 创建 index。

导入数据

以 BERT 预训练模型 [CLS] 位置的输出 768 维度的 embedding 为例,上传一维数组即可(python 中),但是长度必须严格和 mappings 中保持一致。

查询体 query body

{
  "query": {
    # 通过 script score 来自定义查询的分值计算
    "script_score": {
      "query": {
        # 此处可以结合其他约束条件
        "match_all": {}
      },
      # 稠密向量查询的重点在此处,通过 script 的方式指定具体的计算方式
      # 此处是计算余弦相似度,也可以替换其他的相似度
      "script": {
		# 余弦相似度计算需要两个参数:本次待查询的向量 queryVector 和索引中的字段 entity_name_embedding
        "source": "cosineSimilarity(params.queryVector, 'entity_name_embedding')",
        "lang": "painless",
		# 此处将本次待查询的向量传入,注意“params”中 queryVector 和 “source”中的书写要保持一致。
        "params": {
          # 768 维的待查询向量
          "queryVector": [0.99, 0.85, ..., 0.94, 0.96, 0.01]   
        }
      }
    }
  }
}

其他

  • index 中的数据和 query body 应该相互配合,保证涉及计算相似度的字段都有数据。比如 index 中一共 100 个 doc,entity_name_embedding 是稠密向量字段,那么每个 doc 都应该有 768 维的稠密向量,否则查询的时候会因为没有数据或参与相似度计算的数据不全而报错。

  • ES 实现字面分词的查询底层是通过倒排索引和 TF-IDF,实现稠密向量的查询是通过降低向量维度、提前构建近邻搜索图等方式来实现快速地召回。

  • 除了 ES 以外,Milvus 等工具也支持向量搜索。文章来源地址https://www.toymoban.com/news/detail-509869.html

到了这里,关于ES 如何实现向量搜索【以图搜图/语义搜索】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • opencv实现以图搜图

    在您的C++代码中,首先需要导入OpenCV库。您可以使用以下语句导入核心模块: 使用OpenCV的 imread 函数加载要搜索的图像和目标图像。例如,假设您要搜索的图像是\\\"search_image.jpg\\\",目标图像是\\\"target_image.jpg\\\",您可以使用以下代码加载它们: cpp 使用OpenCV的特征提取方法(如SIFT、

    2024年02月05日
    浏览(27)
  • java elasticsearch 实现以图搜图效果

    前言: 现在需要用java+elasticsearch的方式实现以图搜图的效果,效果如下: 相关文章:https://blog.csdn.net/m0_52640724/article/details/129357847 实现效果如下: java:jdk11 elasticsearch:7.17.3 windows:win10 linux:centos7.9 此算法是使用pytorch中resnet50模型计算图片的张量,数据存入elasticsearch中,

    2024年02月10日
    浏览(25)
  • Java+ElasticSearch+Pytorch实现以图搜图

    以图搜图,涉及两大功能:1、提取图像特征向量。2、相似向量检索。 第一个功能我通过编写pytorch模型并在java端借助djl调用实现,第二个功能通过elasticsearch7.6.2的dense_vector、cosineSimilarity实现。 创建demo.py,输入代码,借助resnet提取图像特征 保存好的model.pt文件放入java项目的

    2024年02月02日
    浏览(30)
  • Pytorch基于VGG cosine similarity实现简单的以图搜图(图像检索)

    代码如下: 上述代码的核心思想类似于感知损失(Perceptual Loss),利用VGG提取图像的多级特征,从而比较两张图像之间的相似性。区别在于Perceptual Loss中一般使用MAE,MSE比较特征的距离,而这里的代码使用余弦相似度。 一个例子如下,给定一张狸花的图像(query)如下: 我们希望

    2024年02月13日
    浏览(29)
  • 某某88以图搜图

    声明:本文仅限学习交流使用,禁止用于非法用途、商业活动等。否则后果自负。如有侵权,请告知删除,谢谢!本教程也没有专门针对某个网站而编写,单纯的技术研究 cnVub29iaHR0cHM6Ly9zLjE2ODguY29tL3lvdXl1YW4vaW5kZXguaHRtPw== 1.对应接口: 2.难点: 1.sign从直观来看是32位,所以我们可

    2024年02月15日
    浏览(26)
  • OpenCV #以图搜图:均值哈希算法(Average Hash Algorithm)原理与实验

    均值哈希算法(Average Hash Algorithm,简称aHash) 是哈希算法的一种,主要用来做相似图片的搜索工作。   均值哈希算法(aHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过缩小图像的每个像素与平均灰度值的比较,生成一组哈希值。最后,

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

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

    2024年02月16日
    浏览(34)
  • OpenCV #以图搜图:感知哈希算法(Perceptual hash algorithm)的原理与实验

    感知哈希算法(Perceptual Hash Algorithm,简称pHash) 是哈希算法的一种,主要可以用来做以图搜索/相似图片搜索工作。   感知哈希算法(pHash)首先将原图像缩小成一个固定大小的像素图像,然后将图像转换为灰度图像,通过使用离散余弦变换(DCT)来获取频域信息。然后,根

    2024年02月05日
    浏览(40)
  • 【深度学习】以图搜索- 2021sota repVgg来抽取向量 + facebook的faiss的做特征检索, 从环境搭建到运行案例从0到1

    Faiss的全称是Facebook AI Similarity Search。 这是一个开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法。 暴力检索耗时巨大,对于一个要求实时人脸识别的应用来说是不可取的。 而Faiss则为这种场景提供了一套解决方案。 Faiss从两个方面改善了暴力搜索算法存在

    2024年02月15日
    浏览(31)
  • 【NLP】什么是语义搜索以及如何实现 [Python、BERT、Elasticsearch]

    语义搜索是一种先进的信息检索技术,旨在通过理解搜索查询和搜索内容的上下文和含义来提高搜索结果的准确性和相关性。与依赖于匹配特定单词或短语的传统基于的搜索不同,语义搜索会考虑查询的意图、上下文和语义。 语义搜索在搜索结果的精度和相关性至关重

    2024年02月04日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包