Elasticsearch:使用 ELSER v2 进行语义搜索

news2024/11/18 20:25:18

在我之前的文章 “Elasticsearch:使用 ELSER 进行语义搜索”,我们展示了如何使用 ELESR v1 来进行语义搜索。在使用 ELSER 之前,我们必须注意的是:

重要:虽然 ELSER V2 已正式发布,但 ELSER V1 仍处于 [预览] 状态。此功能处于技术预览阶段,可能会在未来版本中更改或删除。 Elastic 将努力解决任何问题,但技术预览版中的功能不受官方 GA 功能的支持 SLA 的约束,并将保留在技术预览版中。

也就是说 ELSER v1 不建议在生产环境中使用。在生产的环境中,我们建议使用 ELSER v2。由于两个版本中的使用方法稍有不同。在今天的文章中,我们以 ELSER v2 为例来进行展示。

简介

Elastic Learned Sparse EncodeR(或 ELSER)是由 Elastic 训练的 NLP 模型,使你能够使用稀疏向量表示来执行语义搜索。 语义搜索不是根据搜索词进行字面匹配,而是根据搜索查询的意图和上下文含义来检索结果。

本教程中的说明向你展示如何使用 ELSER 对数据执行语义搜索。

注意:在使用 ELSER 进行语义搜索期间,仅考虑每个字段提取的前 512 个标记。 请参阅此页面了解更多信息。

要求

要使用 ELSER 执行语义搜索,你必须在集群中部署 NLP 模型。 请参阅 ELSER 文档以了解如何下载和部署模型。

注意:如果关闭部署自动扩展,则 Elasticsearch Service 中用于部署和使用 ELSER 模型的最小专用 ML 节点大小为 4 GB。 建议打开自动扩展功能,因为它允许你的部署根据需求动态调整资源。 通过使用更多分配或每次分配更多线程可以实现更好的性能,这需要更大的 ML 节点。 自动扩展可在需要时提供更大的节点。 如果关闭自动扩展,你必须自己提供适当大小的节点。

创建索引映射

首先,必须创建目标索引的映射 - 包含模型根据你的文本创建的 token 的索引。 目标索引必须具有 sparse_vector 或 rank_features 字段类型的字段才能对 ELSER 输出进行索引。

注意:ELSER 输出必须摄取到具有 sparse_vector 或  rank_features 字段类型的字段中。 否则,Elasticsearch 会将 token 权重对解释为文档中的大量字段。 如果你收到类似于 “Limit of total fields [1000] has been exceeded while adding new fields” 的错误,则 ELSER 输出字段未正确映射,并且其字段类型不同于 sparse_vector 或 rank_features。

PUT my-index
{
  "mappings": {
    "properties": {
      "content_embedding": { 
        "type": "sparse_vector" 
      },
      "content": { 
        "type": "text" 
      }
    }
  }
}
  • content_embedding 包含生成的 token 的字段的名称。 必须在下一步的推理管道配置中引用它。
  • sparse_vector 定义字段是 sparse_vector 字段。
  • 用于创建稀疏向量表示的字段的名称。 在此示例中,字段的名称是 content。 必须在下一步的推理管道配置中引用它。
  • text 定义字段类型为文本。

使用推理处理器创建摄取管道

创建带有 inference processor 的 ingest pipeline,以使用 ELSER 来推理管道中摄取的数据。

PUT _ingest/pipeline/elser-v2-test
{
  "processors": [
    {
      "inference": {
        "model_id": ".elser_model_2",
        "input_output": [ 
          {
            "input_field": "content",
            "output_field": "content_embedding"
          }
        ]
      }
    }
  ]
}
  • input_output:配置对象,定义推理过程的输入字段和包含推理结果的输出字段。

加载数据

在此步骤中,你将加载稍后在推理摄取管道中使用的数据,以从中提取 token。

使用 msmarco-passagetest2019-top1000 数据集,该数据集是 MS MARCO Passage Ranking 数据集的子集。 它由 200 个查询组成,每个查询都附有相关文本段落的列表。 所有独特的段落及其 ID 均已从该数据集中提取并编译到 tsv 文件中。

下载文件并使用机器学习 UI 中的数据可视化工具将其上传到集群。 将名称 id 分配给第一列,将内容分配给第二列。 索引名称是 test-data。 上传完成后,你可以看到名为 test-data 的索引,其中包含 182469 个文档。

关于如何加载这个数据,请详细阅读文章 “Elasticsearch:如何部署 NLP:文本嵌入和向量搜索”。

我们可以在 Discover 中进行查看:

通过推理摄取管道摄取数据

通过使用 ELSER 作为推理模型的推理管道重新索引数据,从文本创建标记。

POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "test-data",
    "size": 50 
  },
  "dest": {
    "index": "my-index",
    "pipeline": "elser-v2-test"
  }
}
  • Reindex 的默认批量大小为 1000。将大小减小到较小的数字可以使重新索引过程的更新更快,使你能够密切跟踪进度并尽早发现错误。

该调用返回一个任务 ID 以监控进度:

我们等到 completed 的状态变为 true:

你还可以打开训练模型 UI,选择 ELSER 下的 Pipelines 选项卡来跟踪进度。

使用 text_expansion 查询进行语义搜索

要执行语义搜索,请使用 text_expansion 查询,并提供查询文本和 ELSER 模型 ID。 下面的示例使用查询文本 “How to avoid muscle soreness after running?”,content_embedding 字段包含生成的 ELSER 输出:

GET my-index/_search
{
  "_source": false,
  "fields": [
    "content"
  ], 
   "query":{
      "text_expansion":{
         "content_embedding":{
            "model_id":".elser_model_2",
            "model_text":"How to avoid muscle soreness after running?"
         }
      }
   }
}

结果是 my-index 索引中按相关性排序的与你的查询文本含义最接近的前 10 个文档。 结果还包含为每个相关搜索结果提取的 token 及其权重。 标记是捕获相关性的学习关联,它们不是同义词。 要了解有关 token 是什么的更多信息,请参阅此页面。 可以从源中排除 token,请参阅下面的章节以了解更多信息。

{
  "took": 1531,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 10000,
      "relation": "gte"
    },
    "max_score": 25.669455,
    "hits": [
      {
        "_index": "my-index",
        "_id": "fd96yo0BZ-5LgFdRMD7b",
        "_score": 25.669455,
        "fields": {
          "content": [
            "There are a few foods and food groups that will help to fight inflammation and delayed onset muscle soreness (both things that are inevitable after a long, hard workout) when you incorporate them into your postworkout eats, whether immediately after your run or at a meal later in the day. Advertisement. Advertisement."
          ]
        }
      },
      {
        "_index": "my-index",
        "_id": "nt96yo0BZ-5LgFdRLQCy",
        "_score": 23.388044,
        "fields": {
          "content": [
            "What so many out there do not realize is the importance of what you do after you work out. You may have done the majority of the work, but how you treat your body in the minutes and hours after you exercise has a direct effect on muscle soreness, muscle strength and growth, and staying hydrated. Cool Down. After your last exercise, your workout is not over. The first thing you need to do is cool down. Even if running was all that you did, you still should do light cardio for a few minutes. This brings your heart rate down at a slow and steady pace, which helps you avoid feeling sick after a workout."
          ]
        }
      },
      {
        "_index": "my-index",
        "_id": "ot96yo0BZ-5LgFdRLzD0",
        "_score": 22.550915,
        "fields": {
          "content": [
            "If you’ve been exercising more, you may be suffering from the aches and pains of having overdone it at the gym. I’ve been there. Making sure your workout is challenging without overdoing it is one way to prevent muscle soreness. But research also points to some foods and beverages that can help ward off and minimize exercise-related muscle soreness, which we’ve reported on in EatingWell Magazine. Related: Foods to Eat to Improve Your Workout Post-Workout Breakfast Recipes What to Drink Before, During and After You Exercise. Blueberries."
          ]
        }
      }
 ...

将语义搜索与其他查询相结合

你可以将 text_expansion 与复合查询中的其他查询结合起来。 例如,在布尔查询或全文查询中使用过滤子句,该查询可能会或可能不会使用与 text_expansion 查询相同的查询文本。 这使你能够合并两个查询的搜索结果。

text_expansion 查询的搜索命中得分往往高于其他 Elasticsearch 查询。 可以通过使用 boost 参数增加或减少每个查询的相关性分数来对这些分数进行正则化。 当存在不太相关的结果时,text_expansion 查询的召回率可能很高。 使用 min_score 参数来修剪那些不太相关的文档。

GET my-index/_search
{
  "query": {
    "bool": { 
      "should": [
        {
          "text_expansion": {
            "content_embedding": {
              "model_text": "How to avoid muscle soreness after running?",
              "model_id": ".elser_model_2",
              "boost": 1 
            }
          }
        },
        {
          "query_string": {
            "query": "toxins",
            "boost": 4 
          }
        }
      ]
    }
  },
  "min_score": 10 
}
  • text_expansion 和 query_string 查询都位于 bool 查询的 should 子句中。
  • text_expansion 查询的 boost 值为 1,这是默认值。 这意味着该查询结果的相关性得分不会提高。
  • query_string 查询的提升值为 4。 该查询结果的相关性得分增加,导致它们在搜索结果中排名更高。
  • 仅显示分数等于或高于 10 的结果。

优化性能

通过从文档源中排除 ELSER token 来节省磁盘空间

必须对 ELSER 生成的 token 进行索引,以便在 text_expansion 查询中使用。 但是,没有必要在文档源中保留这些术语。 你可以通过使用 source exclude 映射从文档源中删除 ELSER 术语来节省磁盘空间。

警告:重新索引使用文档源来填充目标索引。 一旦 ELSER 术语从源中排除,就无法通过重新索引来恢复它们。 从源中排除 token 是一种节省空间的优化,只有在你确定将来不需要重新索引时才应应用该优化! 仔细考虑这种权衡并确保从源中排除 ELSER 术语符合你的特定要求和用例,这一点很重要。 仔细查看禁用 _source 字段和从 _source 中包含/排除字段部分,以详细了解从 _source 中排除 token 可能产生的后果。

可以通过以下 API 调用创建从 _source 字段中排除 content_embedding 的映射:

PUT my-index
{
  "mappings": {
    "_source": {
      "excludes": [
        "content_embedding"
      ]
    },
    "properties": {
      "content_embedding": {
        "type": "sparse_vector"
      },
      "content": {
        "type": "text"
      }
    }
  }
}

注意:根据你的数据,使用 track_total_hits: false 时文本扩展查询可能会更快。

更多阅读:Elasticsearch:使用 ELSER v2 文本扩展进行语义搜索

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

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

相关文章

基于Jenkins实现的CI/CD方案

基于Jenkins实现的CI/CD方案 前言 最近基于Jenkins的基座,搭建了一套适用于我们项目小组的持续集成环境。现在把流程整理分享出来,希望可以给大家提供一些帮助和思路。 使用到的组件和版本 组件名称组件版本作用Harbor2.7.3镜像仓库Jenkins2.319.2持…

【鸿蒙系统学习笔记】网络请求

一、介绍 资料来自官网:文档中心 网络管理模块主要提供以下功能: HTTP数据请求:通过HTTP发起一个数据请求。WebSocket连接:使用WebSocket建立服务器与客户端的双向连接。Socket连接:通过Socket进行数据传输。 日常…

Adobe将类ChatGPT集成到PDF中

2月21日,全球多媒体巨头Adobe在官网宣布,推出生成式AI助手AI Assistant,并将其集成在Reader 和Acrobat 两款PDF阅读器中。 据悉,AI Assistant的功能与ChatGPT相似,可以基于PDF文档提供摘要、核心见解、基于文档内容&a…

[bing]“gang调度 Kubernetes的并发控制和一致性机制“论点的对应的源码分析

你是一位K8S专家。请分析在Kubernates(https://github.com/kubernetes/kubernetes.git)项目和调度coscheduling(https://github.com/kubernetes-sigs/scheduler-plugins/tree/master/pkg/coscheduling) 插件中支撑"PodGroup的管理和调度决策涉及到对…

​Fruity Loops Studio21.2.3软件中文版官方功能介绍

​Fruity Loops Studio 21.2 软件功能介绍 一、概述 Fruity Loops Studio,现更名为FL Studio,是一款由Image-Line公司开发的数字音频工作站(DAW)。该软件广泛用于音乐创作、编曲、录音、混音和制作。FL Studio 21.2是其近期的一…

ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables

目录 一,AArch64 异常向量表 二,栈指针以及SP寄存器的选择 三,从异常返回 一,AArch64 异常向量表 异常向量表(vector tables)是一组存放于普通内存(normal memory)空间的&#xf…

JavaWeb——002JS Vue快速入门

目录 一、JS快速入门​编辑 1、什么是JavaScript?​编辑 2、JS引入方式​编辑 2.1、示例代码 3、JS基础语法 3.1、书写语法 3.2、变量​编辑 3.3、数据类型 3.4、运算符​编辑 3.5、流程控制语句​编辑 4、JS函数 4.1、第一种函数定义方式 function funcName(参数…

什么是数组

目录 概念 案例 有变量,为什么还要数组? 概念 数组就是一个容器,用来存一批同种类型的数据。 案例 有变量,为什么还要数组? 1、假设用变量解决时间点名的需求 代码繁琐:大量变量的定义。 实现需求繁琐…

linux platform架构下I2C接口驱动开发

目录 概述 1 认识I2C协议 1.1 初识I2C 1.2 I2C物理层 1.3 I2C协议分析 1.3.1 Start、Stop、ACK 信号 1.3.2 I2C协议的操作流程 1.3.3 操作I2C注意的问题 2 linux platform驱动开发 2.1 更新设备树 2.1.1 添加驱动节点 2.1.2 编译.dts 2.1.3 更新板卡中的.dtb 2.2 …

Win11蓝屏开不了机进入安全模式的快速方法

最近,很多使用Win11电脑的用户都在反映自己遇到了蓝屏问题,这时候想通过进入系统的安全模式,来解决电脑蓝屏的问题,却不知道进入安全模式的具体操作方法,下面给大家介绍最简单快速的进入方法,帮助大家轻松解…

NDK的log.h使用__android_log_print报错app:buildCMakeDebug[x86_64]

org.gradle.api.tasks.TaskExecutionException: Execution failed for task :app:buildCMakeDebug[x86_64] 重点是 Execution failed for task :app:buildCMakeDebug[x86_64]. 我的代码&#xff1a; #include <android/log.h> #define LOG_TAG "MyJNI" #d…

游戏同步+游戏中的网络模块

原文链接&#xff1a;游戏开发入门&#xff08;九&#xff09;游戏同步技术_游戏数据同步机制流程怎么开发-CSDN博客 游戏开发入门&#xff08;十&#xff09;游戏中的网络模块_游戏开发组网-CSDN博客 3.同步技术的基本常识&#xff1a; a.同步给谁&#xff1f;某个用户&…

二叉树基础知识总结

目录 二叉树基础知识 概念 : 根节点的五个形态 : 特殊的二叉树 满二叉树 : 完全二叉树 : 二叉搜索树 : 平衡二叉搜索树 : 二叉树的性质 : 二叉树的存储结构 二叉树的顺序存储结构 二叉树的链式存储结构 二叉树的遍历方式 : 基础概念 前中后遍历 层序遍历 :…

解决Ultra 5 125H处理器核显使用solidworks卡顿问题

硬件环境&#xff1a;机械革命 无界14pro Ultra 5 125H 软件环境&#xff1a;windows11 solidworks2023 现象&#xff1a;在使用solidworks作图时&#xff0c;软件卡顿&#xff0c;鼠标无法拖动模型 解决办法&#xff1a; 1&#xff0c;下载并安装solidworks官方给出的修补程…

c语言经典测试题2

1.题1 我们来思考一下它的结果是什么&#xff1f; 我们来分析一下&#xff1a;\\是转义为字符\&#xff0c;\123表示的是一个八进制&#xff0c;算一个字符&#xff0c;\t算一个字符&#xff0c;加上\0&#xff0c;应该有13个&#xff0c;但是strlen只计算\0前的字符个数。所以…

3个脚本练习

1.判断当前磁盘剩余空间是否有20G&#xff0c;如果小于20G&#xff0c;则将报警邮件发送给管理员&#xff0c;每天检查一次磁盘剩余空间。 1.下载mailx服务并设置 yum install mailx -y vim /etc/mail.rc 将下列内容写入文件末尾即可 ​​​​​​​set from自己邮箱qq.…

【计算机网络】socket 网络套接字

网络套接字 一、端口号1. 认识端口号2. socket 二、认识TCP协议和UDP协议1. TCP协议2. UDP协议 三、网络字节序四、socket 编程1. socket 常见API2. sockaddr 结构3. 编写 UDP 服务器&#xff08;1&#xff09;socket()&#xff08;2&#xff09;bind()&#xff08;3&#xff0…

SQL注入之DNSLog外带注入

一、认识&#xff1a; 什么是dnslog呢&#xff1f; DNS就是域名解析服务&#xff0c;把一个域名转换成对应的IP地址&#xff0c;转换完成之后&#xff0c;DNS服务器就会有一个日志记录本次转换的时间、域名、域名对应的ip、请求方的一些信息&#xff0c;这个日志就叫DNSLog。…

单体微服务K8S笔记

单体微服务K8S笔记 https://blog.csdn.net/m0_48341969/article/details/126063832思路参考以上博客 //测试 https://gitee.com/yangbuyi/yi项目组织参考以上git 单体&#xff1a; 不特地介绍 微服务&#xff1a; rpc:远程过程调用 拆分&#xff0c;分别部署&#xff0…

无人机快递(物流)技术方案,无人机快递(物流)基础知识

无人机快递技术是一种利用无人机进行快递配送的先进技术。通过利用无人机&#xff0c;快递企业能够在偏远地区或难以通行的地区提供配送服务&#xff0c;同时提高配送效率并降低人力成本。 无人机基本情况 无人驾驶飞机简称“无人机”&#xff0c;是利用无线电遥控设备和自备的…