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

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

提示:在使用 ELSER v1 进行语义搜索期间,仅考虑每个字段的前 512 个提取的标记。 有关详细信息,请参阅此页面。

要求

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

创建索引映射

首先,必须创建目标索引的映射 —— 包含模型根据你的文本创建的标记的索引。 目标索引必须有一个具有 rank_features 字段类型的字段来索引 ELSER 输出。

PUT my-index
{"mappings": {"properties": {"ml.tokens": {"type": "rank_features" },"text_field": {"type": "text" }}}
}

注意:

  • 包含预测的字段是 rank_features 字段。
  • 用于创建稀疏矢量表示的 text 字段。

有关 rank_features 字段的使用,请详细阅读文章 “Elasticsearch:Rank feature query - 排名功能查询”。

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

创建一个带有推理处理器的摄取管道,以使用 ELSER 对管道中摄取的数据进行推理。

PUT _ingest/pipeline/elser-v1-test
{"processors": [{"inference": {"model_id": ".elser_model_1","target_field": "ml","field_map": {"text": "text_field"},"inference_config": {"text_expansion": { "results_field": "tokens"}}}}]
}

text_expansion 推理类型需要在推理摄取处理器中使用。

加载数据

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

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

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

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

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

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

POST _reindex?wait_for_completion=false
{"source": {"index": "test-data"},"dest": {"index": "my-index","pipeline": "elser-v1-test"}
}

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

GET _tasks/<task_id>

你还可以打开经过训练的模型 UI,选择 ELSER 下的 Pipelines 选项卡以跟踪进度。 完成该过程可能需要几分钟时间。

我们通过如下的命令来查看被写入的文档:

GET my-index/_search

使用 text_expansion 查询进行语义搜索

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

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

上面搜索的结果是:

结果是根据相关性排序的 my-index 索引中与你的查询文本含义最接近的前 10 个文档。 结果还包含为每个相关搜索结果提取的 token 及其权重。

"hits":[{"_index":"my-index","_id":"978UAYgBKCQMet06sLEy","_score":18.612831,"_ignored":["text.keyword"],"_source":{"id":7361587,"text":"For example, if you go for a run, you will mostly use the muscles in your lower body. Give yourself 2 days to rest those muscles so they have a chance to heal before you exercise them again. Not giving your muscles enough time to rest can cause muscle damage, rather than muscle development.","ml":{"tokens":{"muscular":0.075696334,"mostly":0.52380747,"practice":0.23430172,"rehab":0.3673556,"cycling":0.13947526,"your":0.35725075,"years":0.69484913,"soon":0.005317828,"leg":0.41748235,"fatigue":0.3157955,"rehabilitation":0.13636169,"muscles":1.302141,"exercises":0.36694175,(...)},"model_id":".elser_model_1"}}},(...)
]

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

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

来自 text_expansion 查询的搜索命中往往得分高于其他 Elasticsearch 查询。 这些分数可以通过使用 boost 参数增加或减少每个查询的相关性分数来规范化。 text_expansion 查询的召回率可能很高,因为相关性较低的结果很长。 使用 min_score 参数修剪那些不太相关的文档。

GET my-index/_search
{"query": {"bool": { "should": [{"text_expansion": {"ml.tokens": {"model_text": "How to avoid muscle soreness after running?","model_id": ".elser_model_1","boost": 1 }}},{"query_string": {"query": "toxins","boost": 4 }}]}},"min_score": 10
}

说明

  • text_expansion 和 query_string 查询都在 bool 查询的 should 子句中。
  • text_expansion 查询的提升值为 1,这是默认值。 这意味着该查询结果的相关性分数没有提高。
  • query_string 查询的提升值为 4。 此查询结果的相关性分数增加,导致它们在搜索结果中排名更高。
  • 仅显示分数等于或高于 10 的结果。

Elasticsearch:使用 ELSER 进行语义搜索相关推荐

  1. 使用 LangChain 和 Elasticsearch 的隐私优先 AI 搜索

    作者:Dave Erickson 在过去的几个周末里,我一直在 "即时工程" 的迷人世界中度过,并了解像 Elasticsearch® 这样的矢量数据库如何通过充当长期记忆和语义知 ...

  2. Elastic Learned Sparse Encoder 简介:Elastic 用于语义搜索的 AI 模型

    作者:Aris Papadopoulos, Gilad Gal 寻找意义,而不仅仅是文字 我们很高兴地与大家分享,在 8.8 中,Elastic ® 提供开箱即用的语义搜索.语义搜索旨在根据文本的意图 ...

  3. 深度RNN解决语义搜索难题

    深度RNN解决语义搜索难题 2016-08-15 22:34 转载 CSDN 0条评论 雷锋网(搜索"雷锋网"公众号关注)按:本文作者张俊林,主要介绍了3种基于深度RNN的语义搜索 ...

  4. Graph Search就是语义搜索

    上周Facebook向发出媒体邀请函,上写"来看看我们正在构建什么",引发了媒体的众多猜想.15日,扎克伯格向人们展示了Graph Search--facebook的语义搜索引擎. ...

  5. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  6. elasticsearch实战三部曲之三:搜索操作

    elasticsearch实战三部曲之三:搜索操作 2019年01月13日 21:35:18 博陵精骑 阅读数:1367 标签: elasticsearch 更多 个人分类: elasticsearc ...

  7. recv返回值为0_基于GNES和Tensorflow 2.0的大规模视频语义搜索

    BLOG ABOUT ARCHIVE SUBSCRIBE https://github.com/gnes-ai/gnes​github.com Background 项目背景 Nov 22, 2019 ...

  8. 【Elasticsearch】Elasticsearch:Searchable snapshot - 可搜索的快照

    1.概述 转载:Elasticsearch:Searchable snapshot - 可搜索的快照 可搜索快照使你可以使用快照(snapshot)以极具成本效益的方式搜索不经常访​​问的只读数据. ...

  9. “进化”的搜索方式:揭秘微软语义搜索背后的技术

    编者按:作为一项云搜索服务,Azure 认知搜索集成了强大的 API 和工具,帮助开发人员构建丰富的搜索体验.不止于现状,微软的研究员们为 Azure 认知搜索"加持"了语义搜索功 ...

最新文章

  1. js如何改变HTML属性,javascript – 如何动态设置HTML lang属性?
  2. linux下各个头文件及作用总结
  3. VC2005中依然没有Refactoring和Code Expansion.
  4. AUTOSAR从入门到精通100讲(二十二)-手把手教你写Demo系列之车道线检测
  5. 水晶报表-简单数据类型(Crystal 语法)
  6. 【PAT - 甲级1020】Tree Traversals (25分)(树的遍历,给定中序后序,求层次遍历)
  7. 继承演练 动物 狗 哮天犬 c# 1613703354
  8. linux时区的几个代码片段
  9. 2016级算法第四次上机-B ModricWang的序列问题
  10. CSS基本知识—浮动
  11. Windows Server 2008 R2 主域控制器委派DNS到子域控控制器
  12. EF DbContext.Configuration.ProxyCreationEnabled 什么鬼?
  13. 初探内联方式的 onload=doSomething()为何要加()?而js代码的 onload=doSomething 和 addEventListener 为何不加()?...
  14. python 直方图的绘制方法全解_5种方法教你用Python玩转histogram直方图
  15. excel文件修复工具_七款免费的PDF处理工具
  16. 推荐下载使用:功能强大的光盘刻录软件NERO 9.0中文版(最新官方原版+有效序列号)(转)...
  17. 【手拉手 带你准备电赛】使用定时器中断更改PWM占空比
  18. 如何将一个div水平垂直居中?6种方法做推荐
  19. 2021-2025年中国共享Web托管服务行业市场供需与战略研究报告
  20. 奇点云 x 阿里云 | 联合发布综合体数字化转型与数据创新解决方案

热门文章

  1. 使用OpenXML更新Word文档中的表格
  2. UE4_击中伴随爆炸音效及效果
  3. MySQL 表别名(Alias)
  4. linux命令ls什么意思,ls是什么意思(精通 Linux 的 ls 命令)
  5. exe4j 打包springboot项目启动失败报错:java.lang.NoClassDefFoundError: BOOT-INF/classes/...
  6. Java版打飞机小游戏
  7. JS根据身份证号码计算年龄和性别
  8. python图像处理《数字图像处理与python实现》读书笔记
  9. 熵值法综合评价分析流程
  10. 通讯录(动态版本)--C语言