Elasticsearch:使用 ELSER 进行语义搜索 - sparse_vector

news2024/9/21 22:26:02

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

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

重要:有关在 Elastic Stack 中执行语义搜索的最简单方法,请参阅 semantic_text 端到端教程。

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

要求

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

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

如果你已经安装完毕并部署好,你可以在机器学习页面查看:

创建索引映射

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

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

  1. 包含生成的标记的字段的名称。下一步必须在推理管道配置中引用它。
  2. 包含标记的字段是 sparse_vector 字段。
  3. 创建稀疏向量表示的字段的名称。在此示例中,字段的名称为 content。下一步必须在推理管道配置中引用它。
  4. 字段类型,在此示例中为 text。

要了解如何优化空间,请参阅通过从文档源中排除 ELSER 标记来节省磁盘空间部分。

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

使用 ingest pipeline inference processor ingest pipeline 创建 ingest pipeline,以使用 ELSER 对管道中摄取的数据进行推理。

PUT _ingest/pipeline/elser-v2-test
{
  "processors": [
    {
      "inference": {
        "model_id": ".elser_model_2",
        "input_output": [  /* 1 */
          {
            "input_field": "content",
            "output_field": "content_embedding"
          }
        ]
      }
    }
  ]
}

配置对象定义推理过程的 input_field 和包含推理结果的 output_field。

加载数据

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

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

重要:msmarco-passagetest2019-top1000 数据集未用于训练模型。它在本教程中仅用作易于访问的示例数据集以用于演示目的。你可以使用不同的数据集来测试工作流程并熟悉它。

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

我们可以通过如下的命令来查看 test_data 的映射:

GET test-data/_mapping
{
  "test-data": {
    "mappings": {
      "_meta": {
        "created_by": "file-data-visualizer"
      },
      "properties": {
        "content": {
          "type": "text"
        },
        "id": {
          "type": "long"
        }
      }
    }
  }
}

通过 inference ingest pipeline 采集数据

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

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

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

GET _tasks/022z5o7HRqaGwOTjIMMZSw:897221

你还可以打开 Trained Models UI,选择 ELSER 下的 Pipelines 选项卡来跟踪进度。

等上面的 reindex 完毕后,我们可以查看:

GET my-index/_search

使用 sparse_vector 查询进行语义搜索

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

GET my-index/_search
{
   "query":{
      "sparse_vector":{
         "field": "content_embedding",
         "inference_id": "my-elser-endpoint",
         "query": "How to avoid muscle soreness after running?"
      }
   }
}

注意:在 8.15 之前的版本,我们使用 text expansion 来对数据进行搜索。text_expansion 已经是过时的了。不被推荐使用。

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

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

我们首先使用如下的命令来创建 my-elser-model inference id。

PUT _inference/sparse_embedding/my-elser-model
{
  "service": "elser",
  "service_settings": {
    "num_allocations": 1,
    "num_threads": 1
  }
}

我们再使用如下的命令来进行搜索:

GET my-index/_search
{
   "query":{
      "sparse_vector":{
         "field": "content_embedding",
         "inference_id": "my-elser-model",
         "query": "How to avoid muscle soreness after running?"
      }
   }
}

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

你可以将 sparse_vector 与复合查询中的其他查询相结合。例如,在 Boolean 或全文查询中使用过滤子句,查询文本与 sparse_vector 查询相同(或不同)。这样你就可以将两个查询的搜索结果结合起来。

sparse_vector 查询的搜索命中率往往高于其他 Elasticsearch 查询。可以使用 boost 参数增加或减少每个查询的相关性分数来规范这些分数。如果存在大量相关性较低的结果,sparse_vector 查询的召回率可能会很高。使用 min_score 参数来修剪那些相关性较低的文档。

GET my-index/_search
{
  "_source": {
    "exclude": [
      "content_embedding",
      "id",
      "model_id"
     ]
    }, 
  "query": {
    "bool": {  /* 1 */
      "should": [
        {
          "sparse_vector": {
            "field": "content_embedding",
            "inference_id": "my-elser-model",
            "query": "How to avoid muscle soreness after running?",
            "boost": 1 /* 2 */ 
          }
        },
        {
          "query_string": {
            "query": "toxins",
            "boost": 4. /* 3 */ 
          }
        }
      ]
    }
  },
  "min_score": 10 /* 4 */
}

  • sparse_vector 和 query_string 查询均位于布尔查询的 should 子句中。
  • sparse_vector 查询的 boost 值为 1,这是默认值。这意味着此查询结果的相关性分数不会提高。
  • query_string 查询的 boost 值为 4。此查询结果的相关性分数会增加,从而使其在搜索结果中的排名更高。
  • 仅显示分数等于或高于 10 的结果。

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

ELSER 生成的标记必须编入索引才能用于 sparse_vector 查询。但是,没有必要在文档源中保留这些术语。你可以使用 source exclude 映射从文档源中删除 ELSER 术语,从而节省磁盘空间。

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

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

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

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

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

相关文章

[医疗 AI ] 3D TransUNet:通过 Vision Transformer 推进医学图像分割

[医疗 AI ] 3D TransUNet:通过 Vision Transformer 推进医学图像分割’ 论文地址 - https://arxiv.org/pdf/2310.07781 0. 摘要 医学图像分割在推进医疗保健系统的疾病诊断和治疗计划中起着至关重要的作用。U 形架构,俗称 U-Net,已被证明在…

提高实时多媒体传输效率的三大方法

实时多媒体数据传输面临的挑战 实时多媒体数据的传输具有数据量巨大、对时延和时延抖动高度敏感及能容忍丢分组的特点。然而,当今互联网的网络层协议提供的仅是一种“尽最大努力服务”,对分组的端到端时延、时延抖动和分组丢失率等指标不做任何承诺。这…

MySQL的延迟复制

目录 1 MySQL 延迟复制介绍 1.1 延迟复制语法: 1.2 延迟复制可用于多种用途: 1.3 延迟复制的有关的参数 1.4 延迟复制的操作 2 MySQL 延迟复制 实操 2.1 实验环境 2.2 对 SLAVE --MySQL-3 进行延迟复制操作 2.3 停止相关进程的原因 2.4 实验测试 2.5 动…

Variomes:支持基因组变异筛选的高召回率搜索引擎

《Bioinformatics》2022 Variomes: https://candy.hesge.ch/Variomes Source code: https://github.com/variomes/sibtm-variomes SynVar: https://goldorak.hesge.ch/synvar 文章摘要(Abstract) 动机(Mot…

读软件开发安全之道:概念、设计与实施07密码学(上)

1. 加密工具 1.1. 加密工具之所以没有得到充分使用,就是因为人们往往认为密码学是一个准入门槛极高的专业领域 1.2. 如今的加密学大部分都源自纯数学,所以只要能够正确使用,加密学确实行之有效 1.2.1. 不代表这些算法本身确实无法破解&…

机器学习 | 基于wine数据集的KMeans聚类和PCA降维案例

KMeans聚类:K均值聚类是一种无监督的学习算法,它试图根据数据的相似性对数据进行聚类。无监督学习意味着不需要预测结果,算法只是试图在数据中找到模式。在k均值聚类中,我们指定希望将数据分组到的聚类数。该算法将每个观察随机分…

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比

四大消息队列:Kafka、ActiveMQ、RabbitMQ、RocketMQ对比 1. 社区活跃度2. 持久化消息3. 技术实现4. 高并发性能5. RabbitMQ与Kafka对比 💖The Begin💖点点关注,收藏不迷路💖 在软件开发中,消息队列&#xf…

【Redis】Redis数据结构——Hash 哈希

哈希 命令hsethgethexistshdelhkeyshvalshgetallhmgethlenhsetnxhincrbyhincrbyfloat命令小结 内部编码使用场景缓存⽅式对⽐ ⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数组、映射。在 Redis 中&#…

Python furl库:一键搞定复杂URL操作

更多Python学习内容:ipengtao.com 在Web开发和数据处理的过程中,URL的解析、修改和构建是不可避免的操作。然而,直接操作URL字符串不仅繁琐,而且容易出错。Python的furl库提供了一种简单且强大的方法来处理URL,使得URL…

简易的 Websocket + 心跳机制 + 尝试重连

文章目录 演示大纲基础 WebSocket前端: 添加心跳机制前端: 尝试重新连接历史代码 还没有写完,bug 是有的,我在想解决办法了… 演示 大纲 基础的 webSocket 连接前后端:添加心跳机制后端无心跳反应,前端尝试重新连接设置重新连接…

Java 日常反常识踩坑

作者:若渝 本文主要是日常业务开发中自身碰到过跟常识不一致的坑,问题虽然基础,但却可能造成比较大的线上问题。 一、转 BigDecimal 类型时精度丢失 public class Test { public static void main(String[] args) { BigDecimal bi…

算法-分隔链表

一、题目描述 (一) 题目 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。 (二) 示例 示例 1: 输入:…

用Python实现9大回归算法详解——07. 支持向量机回归算法

1. 支持向量机回归的基本概念 支持向量机回归(Support Vector Regression, SVR)是支持向量机(SVM)的一个应用,主要用于回归任务。与分类任务中的 SVM 类似,SVR 通过找到一个最大化边界(即支持向…

[WUSTCTF2020]spaceclub

上sublime txt 每一行的长短对应一个二进制位,长空格是1,短空格是0,全部替换掉得到 上python脚本 import binasciiwith open(attachment_5.txt, r) as file:lines file.readlines() # 逐行读取文本内容output # 初始化输出字符串# 遍历…

vscode 写了未定义的方法不报错,配置全局ESLint

最近接触了一个旧的vue2的项目,里面没有ts和eslint配置 在正在维护的页面里复制了其他页面的一个方法,方法里面包含lodash的cloneDeep,cloneDeep在这个页面并没有引入,但是vscode却没有提示,很不友好,容易…

JUC阻塞队列(五):SynchronousQueue

1、SynchronousQueue介绍 SynchronousQueue与前边的其他几个阻塞队列的差异是挺大的,在一般逻辑中队列是一个用 来存储数据的中间容器(前边几个阻塞队列也是用来存放数据的),但SynchronousQueue 却不是用来存放数据的,…

自动控制——用描述函数法分析非线性系统的稳定性与自激振荡

用描述函数法分析非线性系统的稳定性与自激振荡 引言 在控制系统中,非线性系统的稳定性和自激振荡(self-oscillation)问题往往较线性系统更为复杂。为了分析这些问题,描述函数法(Describing Function Method&#xf…

QtWebEngineView加载本地网页

直接加载放在exe同级目录下的资源是不行的,需要把资源通过qrc放到exe里面,然后通过类似qrc:/robotHtml/index.html这样的路径加载才行。 mWebView new QWebEngineView(parent);// mWebView->load(QUrl::fromLocalFile("./robotHtml/index.html&…

Vue3集成高德离线地图实践

1. 离线地图效果预览 2. 地图下载器下载离线地图 根据需要选择地图,我这边选择高德地图,层级选择0-15级别即可,进行下载 3. 放到nginx内网服务器 注意配置允许跨域 4. Vue3核心代码 // main.js // 初始化vue-amap initAMapApiLoader({o…

联想LJ2405打印机清零方法

联想LJ2405D_LJ2455D_LJ2605D硒鼓清零方法 在设备待机状态下,打开前盖,然后按住开始键不松手,直到所有指示灯全部亮起后再松开手,然后将硒鼓取出再装回,盖上前盖,清零操作完成。 联想LJ2405打印机碳粉清零…