Elasticsearch:使用 Elasticsearch 进行语义搜索

在数字时代,搜索引擎在通过浏览互联网上的大量可用信息来检索数据方面发挥着重要作用。 此方法涉及用户在搜索栏中输入特定术语或短语,期望搜索引擎返回与这些确切关键字匹配的结果。

虽然关键字搜索对于简化信息检索非常有价值,但它也有其局限性。 主要缺点之一在于它对词汇匹配的依赖。 关键字搜索将查询中的每个单词视为独立的实体,通常会导致结果可能与用户的意图不完全一致。 此外,不明确的查询可能会产生不同的解释,从而导致混合或不准确的结果。

当处理上下文严重影响含义的语言时,会出现另一个关键限制。 词语的含义在很大程度上取决于具体情况。 单独使用关键字可能无法正确捕获这些查询,这可能会导致误解。

随着我们的数字环境不断发展,我们对更精致、更直观的搜索体验的期望也在不断变化。 这为语义搜索的出现铺平了道路,语义搜索是一种旨在超越传统基于关键字的方法的局限性的方法。 通过关注搜索查询的意图和上下文含义,语义搜索为关键字搜索带来的挑战提供了一种有前景的解决方案。

如上面的图片所示,如果我们通过 keyword 来进行搜索,我们想搜索的是 apple 水果,但是我们最终可能得到是关于 apple(苹果)公司的有关信息。其实它并不是我们想要的。

什么是语义搜索?

语义搜索是在互联网上搜索内容的高级方式。 它不仅仅是匹配单词,而是理解你真正在寻找的内容。 它能找出你的话背后的含义以及它们之间的关系。

这项技术使用人工智能和理解人类语言等技术。 几乎就像它在说人类一样! 它着眼于大局,检查具有相似含义的单词以及与你所问问题相关的其他想法。

基本上,语义搜索可以帮助你从互联网上的大量内容中准确获取所需的内容。 这就像与一个超级聪明的搜索引擎交谈,它不仅可以获取你所说的单词,还可以获取你真正想要查找的内容。 这使得它非常适合做研究、查找信息,甚至获得符合你兴趣的建议。

语义搜索的好处

  1. 精确度和相关性:语义搜索通过理解用户意图和上下文提供高度相关的结果。
  2. 自然语言理解:它理解复杂的查询,使自然语言交互更加有效。
  3. 消除歧义:它解决歧义查询,根据用户行为和上下文提供准确的结果。
  4. 个性化:语义搜索从用户行为中学习以获取定制结果,从而随着时间的推移提高相关性。

Elastic Search 中的语义搜索

Elastic Search 提供语义搜索,重点关注搜索查询的含义和上下文,而不仅仅是匹配关键字。 它使用自然语言处理(NLP)和向量搜索来实现这一目标。 Elastic 有自己的预训练表示模型,称为 Elastic Learned Sparse EncodeR (ELSER)。

在进入 ELSER 之前,让我们更多地了解 NLP 和向量搜索。

自然语言处理(NLP)

自然语言处理是人工智能的一个分支,致力于使计算机能够以有价值且有用的方式理解、解释和生成人类语言。

NLP 涉及一组允许计算机处理和分析大量自然语言数据的技术和算法。 这包括以下任务:

  • 文本理解:NLP 帮助计算机理解一篇文章的内容。 它可以找出文本中的重要内容,例如姓名、关系和感受。
  • 文本处理:这涉及将句子分解为单词或短语、将单词简化为其基本形式以及识别句子的不同部分等任务。
  • 命名实体识别 (NER):NLP 可以识别文本中的特殊事物,例如人名、地名或组织名称。 这有助于理解正在讨论的内容。

向量搜索

向量搜索是一种涉及将数据点或信息表示为多维空间中的向量的技术。 空间的每个维度代表文档或数据点的不同特征或属性。

在这个向量空间中,相似的文档或数据点彼此距离更近。 这允许有效的基于相似性的搜索。 例如,如果你正在搜索与给定文档相似的文档,则可以计算表示文档的向量之间的相似度以查找最接近的匹配项。

向量搜索广泛用于各种应用,包括:

  1. 推荐系统:它有助于根据用户的喜好向他们推荐类似的项目。
  2. 信息检索:它允许在大型语料库中查找相似的文档。
  3. 异常检测:它有助于识别异常或异常数据点。

NLP 与向量搜索的工作原理

1)Vector embedding:
        在此步骤中,NLP 涉及将文本数据转换为数值向量。 使用词嵌入等技术将文本中的每个单词转换为高维向量

2.相似度分数:

        引擎将向量化查询与向量化文档进行比较以确定它们的相似性。

3)人工神经网络算法:

        近似最近邻 (ANN) 算法可有效查找高维空间中的近似最近邻。

4)查询处理:

        用户的查询经历与文档类似的处理以生成向量表示。

5)距离计算:

        引擎计算向量化查询和文档之间的距离(相似度分数)。

6)最近邻搜索:

        引擎查找嵌入最接近查询嵌入的文档。

7)排名结果:

        结果根据相似度分数进行排名。

ELSER

ELSER 是一个经过专门设计的预训练模型,可以出色地理解上下文和意图,而无需进行复杂的微调。 ELSER 目前仅适用于英语,其开箱即用的适应性使其成为各种自然语言处理任务的宝贵工具。 它对稀疏向量表示的利用提高了处理文本数据的效率。 ELSER 的词汇表中包含约 30,000 个术语,通过用上下文相关的对应项替换术语来优化查询,确保精确而全面的搜索结果。

让我们深入探讨如何利用 ELSER 的潜力来增强 Elasticsearch 中的搜索能力。你可以参考文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR” 来配置自己的 ELSER。

第 1 步:创建具有所需映射的索引

  • 在 Elasticsearch 中,“索引 (index)” 是指具有共同特征或属于相似类别的文档的集合。 它类似于关系数据库中的表或其他一些 NoSQL 数据库中的类型。 索引中的每个文档都分配有一个唯一标识符,并且包含 JSON 格式的结构化数据。
  • 定义索引的映射,该映射将包含模型根据您的输入生成的 token。 该索引必须有一个 rank_features 字段类型的字段来索引 ELSER 输出。
PUT <index-name>
{"mappings": {"properties": {"ml.tokens": { "type": "rank_features" },"name": { "type": "text" }}}
}

第 2 步:使用推理处理器创建摄取管道

  • Elasticsearch 中的摄取管道使您能够在索引之前对数据应用各种转换。 这些转换包括字段删除、文本值提取和数据丰富等任务。
  • 管道包含一组称为处理器的可定制任务。 这些处理器以顺序方式运行,对传入文档实施特定修改。使用推理处理器创建摄取管道,以使用 ELSER 对正在摄取的数据进行推理。
PUT _ingest/pipeline/<pipeline-name>
{"processors": [{"inference": {"model_id": ".elser_model_1","target_field": "ml","field_map": { "text": "text_field"},"inference_config": {"text_expansion": { "results_field": "tokens"}}}}]
}

第 3 步:将数据添加到索引

  • 索引映射和摄取管道已设置,现在我们可以开始向索引添加数据。
  • 摄取管道作用于传入数据并将相关标记添加到文档中
curl -X POST 'https://<url>/<index-name>/_doc?pipeline=<ingest-pipeline-name' -H 'Content-Type: application/json' -H 'Authorization: ApiKey <Replace_with_created_API_key>' -d '{"name" : "How to Adapt Crucial Conversations to Global Audiences"
}'

摄取管道作用于传入数据并将相关 token 添加到文档中:

{"name" : "How to Adapt Crucial Conversations to Global Audiences","ml":{"tokens": {"voice": 0.057680283,"education": 0.18481751,"questions": 0.4389099,"adaptation": 0.6029656,"language": 0.4136539,"quest": 0.082507774,"presentation": 0.035054933,"context": 0.2709603,"talk": 0.17953876,"communication": 1.0619682,"international": 0.38651025,"different": 0.25769454,"conversation": 1.03593,"train": 0.021380302,"audience": 0.97641367,"development": 0.33928272,"adapt": 0.90020984,"certification": 0.45675382,"cultural": 0.63132435,"distraction": 0.38943478,"success": 0.09179027,"cultures": 0.82463825,"essay": 0.2730616,"institute": 0.21582486,},"model_id":".elser_model_1"}
}

第 4 步:执行语义搜索

  • 使用 text expansion 查询来执行语义搜索。 提供查询文本和 ELSER 模型 ID。
  • 文本扩展查询使用自然语言处理模型将查询文本转换为 token 权重对列表,然后将其用于针对 rank_features 字段的查询。
GET <index-name>/_search
{"query":{"text_expansion":{"ml.tokens":{"model_id":".elser_model_1","model_text":<query_text>}}}
}

第 5 步:将语义搜索与其他查询结合起来

  • 我们还可以将 text_expansion 与复合查询中的其他查询结合起来,以获得更精细的结果。
GET my-index/_search
{"query": {"bool": { "should": [{"text_expansion": {"ml.tokens": {"model_text": <query_text>,"model_id": ".elser_model_1",}}},{"query_string": {"query": <query_text>,}}]}}
}

我们还可以将 text_expansion 与复合查询中的其他查询结合起来,以获得更精细的结果。
与 Elasticsearch 中的其他查询相比,text_expansion 查询通常会产生更高的分数。 我们可以使用 boost 参数调整相关性分数。

更多阅读:

  • Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR

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

  • Elasticsearch:使用 ELSER 释放语义搜索的力量:Elastic Learned Sparse EncoderR

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

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

相关文章

红黑树是如何实现的?

文章目录 一、红黑树的概念二、红黑树的性质三、红黑树和AVL树对比四、红黑树的插入1. 红黑树的结点定义2. 父亲的颜色3. 叔叔的颜色为红色4. 叔叔不存在5. 叔叔存在且为黑6. 插入的抽象图 五、红黑树的验证1. 检查平衡2. 计算高度与旋转次数3. 验证 六、 红黑树与AVL树的比较 …

【数据结构】——顺序表详解

大家好&#xff01;当我们学习了动态内存管理后&#xff0c;就可以写一个管理数据的顺序表了&#xff01;&#xff01;&#xff01; 顺序表的理解&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的一种…

青藏高原1-km分辨率生态环境质量变化数据集(2000-2020)

青藏高原平均海拔4000米以上&#xff0c;人口1300万&#xff0c;是亚洲九大河流的源头&#xff0c;为超过15亿人口提供淡水、食物和其他生态系统服务&#xff0c;被誉为地球第三极和亚洲水塔。然而&#xff0c;在该地区的人与自然的关系的研究是有限的&#xff0c;尤其是在精细…

高德地图根据两点的经纬度计算两点之间的距离(修正版)

SQL语句可以用来计算两个经纬度之间的距离。下面是一个示例的SQL语句&#xff1a; SELECT id, ( 6371 * ACOS( COS( RADIANS( lat1 ) ) * COS( RADIANS( lat2 ) ) * COS( RADIANS( lng2 ) - RADIANS( lng1 ) ) SIN( RADIANS( lat1 ) ) * SIN( RADIANS( lat2 ) ) ) ) AS dista…

PyTorch - 模型训练损失 (Loss) NaN 问题的解决方案

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/133378367 在模型训练中&#xff0c;如果出现 NaN 的问题&#xff0c;严重影响 Loss 的反传过程&#xff0c;因此&#xff0c;需要加入一些微小值…

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群&#xff0c;开始。 前提条件&#xff0c;docker安装了docker-compose。如果没安装的话&#xff0c;参考这里 docker-compose文件参考bitnami官网&#xff1a;https://github.com/bitnami/contai…

巧用@Conditional注解根据配置文件注入不同的bean对象

项目中使用了mq&#xff0c;kafka两种消息队列进行发送数据&#xff0c;为了避免硬编码&#xff0c;在项目中通过不同的配置文件自动识别具体消息队列策略。这里整理两种实施方案&#xff0c;仅供参考&#xff01; 方案一&#xff1a;创建一个工具类&#xff0c;然后根据配置文…

Swift 周报 第三十八期

文章目录 前言新闻和社区苹果自研调制解调器芯片受挫&#xff1a;速度太慢容易过热&#xff0c;落后高通 3 年App Store 现已接受适用于最新版操作系统的 App 和游戏提交 提案通过的提案正在审查的提案驳回的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组…

vue 实现弹出菜单,解决鼠标点击其他区域的检测问题

弹出菜单应该具有的功能&#xff0c;当鼠标点击其他区域时&#xff0c;则关闭该菜单。 问题来了&#xff0c;怎么检测鼠标点击了其他区域而不是当前菜单&#xff1f; 百度“JS检测区域外的点击事件”&#xff0c;会发现有很多方法&#xff0c;有递归检测父元素&#xff0c;有遍…

Blender导出FBX给UE5

最近在学习UE5的资源导入&#xff0c;总结如下&#xff1a; 建模使用Blender&#xff0c;UE5版本是5.3 1.纯静态模型导入UE5 Blender FBX导出设置保持默认即可&#xff0c; UE5把导入设置里Miscellaneous下Force Front XAxis和Convert Scene Unit勾选即可 2.带骨骼动画的模型…

react项目优化

随着项目体积增大&#xff0c;打包的文件体积会越来越大&#xff0c;需要优化&#xff0c;原因无非就是引入的第三方插件比较大导致&#xff0c;下面我们先介绍如何分析各个文件占用体积的大小。 1.webpack-bundle-analyzer插件 如果是webpack作为打包工具的项目可以使用&…

MySQL 连接查询(多表查询 二)

基本介绍 作用&#xff1a;连接查询&#xff08;Join&#xff09;操作&#xff0c;用于联结多个表以获取更全面和准确的数据 基本分类&#xff1a; 内连接&#xff1a;相当于查询A、B交集部分数据&#xff08;去掉迪卡尔积无效组合&#xff09;外连接&#xff1a; 左外连接&…

lwIP 开发指南(下)

目录 NETCONN 编程接口简介netbuf 数据缓冲区netconn 连接结构netconn 编程API 函数 NETCONN 编程接口UDP 实验NETCONN 实现UDPNETCONN 接口的UDP 实验硬件设计软件设计下载验证 NETCONN 接口编程TCP 客户端实验NETCONN 实现TCP 客户端连接步骤NETCONN 接口的TCPClient 实验硬件…

freertos中函数调用和启动第一个任务(栈相关!!!!!!)

本内容仅就一些较难理解的点讲解&#xff0c;请结合其它文章实用 在函数调用时&#xff0c;m3的处理器使用r0-r3共四个寄存器传参&#xff0c;其余的使用栈传参。 但是&#xff0c;如果传入的参数是全局变量&#xff0c;则不需传参&#xff0c;因为全局变量在函数内部是可见的…

【算法练习Day8】 kmp算法找出字符串中第一个匹配项的下标反转字符串中的单词重复的子字符串

、​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 kmp算法找出字符串中第…

2023版 STM32实战5 基本定时器中断

基本定时器简介与特性 -1-时钟可分频 -2-计数模式只可以选择累加 -3-只可以用来定时&#xff08;含中断&#xff09; 查看时钟源 如图定时器7的时钟最大为72MHZ 定时时间的计算 通用定时器的时间计算公式为 Tout &#xff08;&#xff08;arr1&#xff09;&#xff08;psc1&…

Spring修炼之路(2)依赖注入(DI)

一、概念 依赖注入&#xff08;Dependency Injection,DI&#xff09;。 测试pojo类 : Address.java 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 . 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 . 二、 注入方式 2.1构造器注入 我们在之前的案例已经…

【Java】异常

1. Java的异常概念 1.1 异常体系结构 从上图中可以看到&#xff1a; 1. Throwable&#xff1a;是异常体系的顶层类&#xff0c;其派生出两个重要的子类, Error 和 Exception 2. Error&#xff1a;指的是JVM无法解决的严重问题&#xff0c;比如&#xff1a;JVM的内部错误、资源…

Apache Flume

Flume 1.9.0 Developer Guide【Flume 1.9.0开发人员指南】 Introduction【介绍】 摘自&#xff1a;Flume 1.9.0 Developer Guide — Apache Flume Overview【概述】 Apache Flume is a distributed, reliable, and available system for efficiently collecting, aggregati…

PHP8中的构造方法和析构方法-PHP8知识详解

今日分享的内容是php8中的构造方法和析构方法&#xff0c;我们把构造方法和析构方法这两个方法分开来讲&#xff1a; 1、构造方法 构造方法存在于每个声明的类中&#xff0c;主要作用是执行一些初始化任务。如果类中没有直接声明构造方法&#xff0c;那么类会默认地生成一个没…