Elasticsearch:使用 ELSER 文本扩展进行语义搜索

news2025/1/12 6:11:17

在今天的文章里,我来详细地介绍如何使用 ELSER  进行文本扩展驱动的语义搜索。

安装

Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,请参考如下的链接来进行安装:

  • 如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch

  • Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana

在安装的时候,我们可以选择 Elastic Stack 8.x 的安装指南来进行安装。在本博文中,我将使用最新的 Elastic Stack 8.10 来进行展示。

在安装 Elasticsearch 的过程中,我们需要记下如下的信息:

部署 ELSER

我们可以参考文章 “Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR” 来部署 ELSER。

Python 安装包

在本演示中,我们将使用 Python 来进行展示。我们需要安装访问 Elasticsearch 相应的安装包 elasticsearch:

pip install elasticsearch

我们将使用 Jupyter Notebook 来进行展示。

$ pwd
/Users/liuxg/python/elser
$ jupyter notebook

准备数据

我们在项目的根目录下,创建如下的一个数据文件: data.json:

data.json

[
   {
      "title":"Pulp Fiction",
      "runtime":"154",
      "plot":"The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption.",
      "keyScene":"John Travolta is forced to inject adrenaline directly into Uma Thurman's heart after she overdoses on heroin.",
      "genre":"Crime, Drama",
      "released":"1994"
   },
   {
      "title":"The Dark Knight",
      "runtime":"152",
      "plot":"When the menace known as the Joker wreaks havoc and chaos on the people of Gotham, Batman must accept one of the greatest psychological and physical tests of his ability to fight injustice.",
      "keyScene":"Batman angrily responds 'I’m Batman' when asked who he is by Falcone.",
      "genre":"Action, Crime, Drama, Thriller",
      "released":"2008"
   },
   {
      "title":"Fight Club",
      "runtime":"139",
      "plot":"An insomniac office worker and a devil-may-care soapmaker form an underground fight club that evolves into something much, much more.",
      "keyScene":"Brad Pitt explains the rules of Fight Club to Edward Norton. The first rule of Fight Club is: You do not talk about Fight Club. The second rule of Fight Club is: You do not talk about Fight Club.",
      "genre":"Drama",
      "released":"1999"
   },
   {
      "title":"Inception",
      "runtime":"148",
      "plot":"A thief who steals corporate secrets through the use of dream-sharing technology is given the inverse task of planting an idea into thed of a C.E.O.",
      "keyScene":"Leonardo DiCaprio explains the concept of inception to Ellen Page by using a child's spinning top.",
      "genre":"Action, Adventure, Sci-Fi, Thriller",
      "released":"2010"
   },
   {
      "title":"The Matrix",
      "runtime":"136",
      "plot":"A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers.",
      "keyScene":"Red pill or blue pill? Morpheus offers Neo a choice between the red pill, which will allow him to learn the truth about the Matrix, or the blue pill, which will return him to his former life.",
      "genre":"Action, Sci-Fi",
      "released":"1999"
   },
   {
      "title":"The Shawshank Redemption",
      "runtime":"142",
      "plot":"Two imprisoned men bond over a number of years, finding solace and eventual redemption through acts of common decency.",
      "keyScene":"Andy Dufresne escapes from Shawshank prison by crawling through a sewer pipe.",
      "genre":"Drama",
      "released":"1994"
   },
   {
      "title":"Goodfellas",
      "runtime":"146",
      "plot":"The story of Henry Hill and his life in the mob, covering his relationship with his wife Karen Hill and his mob partners Jimmy Conway and Tommy DeVito in the Italian-American crime syndicate.",
      "keyScene":"Joe Pesci's character Tommy DeVito shoots young Spider in the foot for not getting him a drink.",
      "genre":"Biography, Crime, Drama",
      "released":"1990"
   },
   {
      "title":"Se7en",
      "runtime":"127",
      "plot":"Two detectives, a rookie and a veteran, hunt a serial killer who uses the seven deadly sins as his motives.",
      "keyScene":"Brad Pitt's character David Mills shoots John Doe after he reveals that he murdered Mills' wife.",
      "genre":"Crime, Drama, Mystery, Thriller",
      "released":"1995"
   },
   {
      "title":"The Silence of the Lambs",
      "runtime":"118",
      "plot":"A young F.B.I. cadet must receive the help of an incarcerated and manipulative cannibal killer to help catch another serial killer, a madman who skins his victims.",
      "keyScene":"Hannibal Lecter explains to Clarice Starling that he ate a census taker's liver with some fava beans and a nice Chianti.",
      "genre":"Crime, Drama, Thriller",
      "released":"1991"
   },
   {
      "title":"The Godfather",
      "runtime":"175",
      "plot":"An organized crime dynasty's aging patriarch transfers control of his clandestine empire to his reluctant son.",
      "keyScene":"James Caan's character Sonny Corleone is shot to death at a toll booth by a number of machine gun toting enemies.",
      "genre":"Crime, Drama",
      "released":"1972"
   },
   {
      "title":"The Departed",
      "runtime":"151",
      "plot":"An undercover cop and a mole in the police attempt to identify each other while infiltrating an Irish gang in South Boston.",
      "keyScene":"Leonardo DiCaprio's character Billy Costigan is shot to death by Matt Damon's character Colin Sullivan.",
      "genre":"Crime, Drama, Thriller",
      "released":"2006"
   },
   {
      "title":"The Usual Suspects",
      "runtime":"106",
      "plot":"A sole survivor tells of the twisty events leading up to a horrific gun battle on a boat, which began when five criminals met at a seemingly random police lineup.",
      "keyScene":"Kevin Spacey's character Verbal Kint is revealed to be the mastermind behind the crime, when his limp disappears as he walks away from the police station.",
      "genre":"Crime, Mystery, Thriller",
      "released":"1995"
   }
]
$ pwd
/Users/liuxg/python/elser
$ ls
Semantic search - ELSER.ipynb data.json

创建应用并进行演示

连接 Elasticsearch

我们可以参考文章 “Elasticsearch:关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x” 在 Python 中连接 Elasticsearch。接下来,我们需要导入我们需要的模块。

from elasticsearch import Elasticsearch, helpers
from urllib.request import urlopen
import getpass
import json

现在我们可以实例化 Python Elasticsearch 客户端。

然后我们创建一个客户端对象来实例化 Elasticsearch 类的实例。

ELASTCSEARCH_CERT_PATH = "/Users/liuxg/elastic/elasticsearch-8.10.0/config/certs/http_ca.crt"
 
client = Elasticsearch(  ['https://localhost:9200'],
    basic_auth = ('elastic', 'vXDWYtL*my3vnKY9zCfL'),
    ca_certs = ELASTCSEARCH_CERT_PATH,
    verify_certs = True)

🔐 注意:getpass 使我们能够安全地提示用户输入凭据,而无需将其回显到终端或将其存储在内存中。为了方便,我们将不使用 getpass。在代码中我们使用硬编码。你也可以使用 API keys 来进行连接。详细细节,请参考文章  “Elasticsearch:关于在 Python 中使用 Elasticsearch 你需要知道的一切 - 8.x”。

使用 ELSER 索引文档

为了在我们的 Elasticsearch 集群上使用 ELSER,我们需要创建一个包含运行 ELSER 模型的推理处理器的摄取管道。 让我们使用 put_pipeline 方法添加该管道。

client.ingest.put_pipeline(
    id="elser-ingest-pipeline", 
    description="Ingest pipeline for ELSER",
    processors=[
    {
      "inference": {
        "model_id": ".elser_model_1",
        "target_field": "ml",
        "field_map": {
          "plot": "text_field"
        },
        "inference_config": {
          "text_expansion": {
            "results_field": "tokens"
          }
        }
      }
    }
  ]
)

让我们记下该 API 调用中的一些重要参数:

  • inference:使用机器学习模型执行推理的处理器。
  • model_id:指定要使用的机器学习模型的 ID。 在此示例中,模型 ID 设置为 .elser_model_1。
  • target_field:定义存储推理结果的字段。 这里设置为 ml。
  • text_expansion:为推理过程配置文本扩展选项。 在此示例中,推理结果将存储在名为 “tokens” 的字段中。

使用映射创建索引

要在索引时使用 ELSER 模型,我们需要创建支持 text_expansion 查询的索引映射。 映射必须包含 rank_features 类型的字段才能使用我们感兴趣的特征向量。 该字段包含 ELSER 模型根据输入文本创建的 token 权重对。

让我们使用我们需要的映射创建一个名为 elser-example-movies 的索引。

client.indices.create(
  index="elser-example-movies",
  settings={
      "index": {
          "number_of_shards": 1,
          "number_of_replicas": 1,
          "default_pipeline": "elser-ingest-pipeline"
      }
  },
  mappings={
    "properties": {
      "plot": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "ml.tokens": {
        "type": "rank_features"
      },
    }
  }
)

在运行完上面的代码后,我们可以在 Kibana 里进行查看:

GET elser-example-movies/_mapping

从上面的输出中,我们可以看到 elser-example-movies 索引已经被成功地创建。

摄入文档

让我们插入 12 部电影的示例数据集。

# Load data into a JSON object
with open('data.json') as f:
   data_json = json.load(f)

print(data_json)

# Prepare the documents to be indexed
documents = []
for doc in data_json:
    documents.append({
        "_index": INDEX_NAME,
        "_source": doc,
    })

# Use helpers.bulk to index
helpers.bulk(client, documents)

print("Done indexing documents into `search-movies` index!")

我们可以到 Kibana 里进行查看:

GET elser-example-movies/_search

检查新文档以确认它现在有一个 "ml": {"tokens":...} 字段,其中包含新的附加术语列表。 这些术语是你针对 ELSER 推理的字段的文本扩展。 ELSER 实质上创建了一个扩展术语树,以提高文档的语义可搜索性。 我们将能够使用 text_expansion 查询来搜索这些文档。

但首先让我们从简单的关键字搜索开始,看看 ELSER 如何提供开箱即用的语义相关结果。

使用 ELSER 查询文档

让我们使用 ELSER 测试语义搜索。

response = client.search(
    index='elser-example-movies', 
    size=3,
    query={
        "text_expansion": {
            "ml.tokens": {
                "model_id":".elser_model_1",
                "model_text":"child toy"
            }
        }
    }
)

for hit in response['hits']['hits']:
    doc_id = hit['_id']
    score = hit['_score']
    title = hit['_source']['title']
    plot = hit['_source']['plot']
    print(f"Score: {score}\nTitle: {title}\nPlot: {plot}\n")

最终的 jupyter 文件可以在地址下载。

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

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

相关文章

3.primitive主数据类型和引用 认识变量

3.1 声明变量 Java注重类型。它不会让你做出把长颈鹿类型变量装进兔子类型变量中这种诡异又危险的举动——如果有人对长颈鹿调用“跳跃”这个方法会发生什么样的悲剧?并且它也不会让你将浮点数类型变量放进整数类型的变量中,除非你先跟编译器确认过数字…

自动驾驶传感器技术

自动驾驶传感器技术是自动驾驶系统的关键组成部分,它使车辆能够感知并理解周围环境。本文将深入探讨自动驾驶传感器技术,包括常见类型、工作原理以及它们在自动驾驶中的作用。 1. 摄像头 摄像头的工作原理 摄像头是基于光学原理的传感器,其…

知识图谱1_2——下载neo4j客户端

客户端下载 这里展现一种通过客户端进行操作的方法 https://neo4j.com/download/ 下载desktop客户端 填写完成后开始下载 下载完成后&#xff0c;在命令行输入 chmod x <文件名> #给予文件权限 sudo add-apt-repository universe #安装.appimage所需的包fuse&#x…

Gooxi国鑫搭载第四代英特尔至强可扩展处理器系列服务器焕新登场

由算力驱动的数字经济渗透到了百行千业&#xff0c;在驱动传统经济转型升级和效能优化的同时&#xff0c;也大幅度增加了各行业数据处理能力的需求 。 面对千行百业加速创新应用和AIGC时代像潮水一样奔涌算力需求&#xff0c;得益于第四代英特尔至强可扩展处理器以及基于Gooxi最…

功率谱密度估计 - welch方法的实现

因本人知识欠缺&#xff0c;后续再对下述展开讲述。 clc;clear;close all; fs 44100; t 0:1/fs:1-1/fs; x randn(size(t));load("myfir64.mat"); filtercoe myfir64; y filter(filtercoe, 1, x);[Hx, w] freqz(filtercoe, 1, fs); fx w*fs/2/pi; subplot(211…

RK3568平台开发系列讲解(驱动篇)rk3568 的 pinctrl 子系统驱动

🚀返回专栏总目录 文章目录 一、pinctrl 子系统简介二、rk3568 的 pinctrl 子系统驱动2.1、PIN_BANK2.2、PIN_BANK_IDX2.3、MUX2.4、phandle沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 是一个庞大而完善的系统,尤其是驱动框架,像 GPIO 这种最基本的驱动不…

MySQL8 间隙锁在11种情况下的锁持有情况分析

测试环境及相关必要知识 测试环境为mysql 8 版本 间隙锁&#xff08;Gap Lock&#xff09;&#xff1a;用于锁定索引范围之间的间隙&#xff0c;防止其他事务在此间隙中插入新记录。间隙锁主要用于防止幻读问题。 在可重复读的隔离级别下默认打开该锁机制&#xff0c;解决幻…

Hadoop设置hdfs全局指令

在终端进入用户个人环境变量配置文件 vim ~/.bashrc 然后添加如下内容 export PATH$PATH:/usr/local/hadoop/bin 添加到你的hadoop下载目录的bin目录为止就可以了 重新激活一下配置文件 source ~/.bashrc hdfs有专属于自己的文件存储目录,加上特殊的指令就可以箱终端一…

windows redis 自启动 Redis服务无法启动报错1067问题

如果你的系统服务里面已经有redis服务并且无法启动&#xff0c;则使用下面的命令卸载此服务 ! 1、停止Redis服务&#xff1a; redis-server --service-uninstall 2、删除系统服务 sc delete redis 进入到你的Redis安装目录&#xff0c;我的在以下目录&#xff0c;谨记此时不…

Pikachu靶场——XSS漏洞(Cross-Site Scripting)

文章目录 1. XSS&#xff08;Cross-Site Scripting&#xff09;1.1 反射型XSS(get)1.2 反射型XSS(post)1.3 存储型XSS1.4 DOM型XSS1.5 DOM型XSS-X1.6 XSS盲打1.7 XSS之过滤1.8 XSS之htmlspecialcharss1.9 XSS之href输出1.10 XSS之JS输出1.11 XSS 漏洞防御 1. XSS&#xff08;Cr…

计算机毕设 招聘网站爬取与大数据分析可视化 - python 分析 可视化 flask

文章目录 0 前言1 课题背景2 实现效果3 Flask框架4 Echarts5 爬虫6 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自…

SpringTask ----定时任务框架 ----苍穹外卖day10

目录 SpringTask 需求分析 快速入门 使用步骤 ​编辑业务开发 SpringTask 定时任务场景特化的框架 需求分析 快速入门 使用cron表达式来使用该框架 使用步骤 添加注解 自定义定时任务类 重点在于以下cron表达式的书写,精确表达触发的间隔 业务开发 主task方法 time使用(-…

No168.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

JUC第十七讲:JUC集合: ConcurrentLinkedQueue详解

JUC第十七讲&#xff1a;JUC集合: ConcurrentLinkedQueue详解 本文是JUC第十七讲&#xff1a;JUC集合 - ConcurrentLinkedQueue详解。ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中时间最长的…

【Java】微服务——Feign远程调用

目录 1.Feign替代RestTemplate1&#xff09;引入依赖2&#xff09;添加注解3&#xff09;编写Feign的客户端4&#xff09;测试5&#xff09;总结 2.自定义配置2.1.配置文件方式2.2.Java代码方式 3.Feign使用优化4.最佳实践4.1.继承方式4.2.抽取方式4.3.实现基于抽取的最佳实践1…

老鼠走迷宫java ---递归

题目 有一个八行七列的数组&#xff0c;红色的格子代表墙&#xff0c;白色格子代表可以走的格子&#xff1b; 假定老鼠起点在map【1】【1】&#xff0c;设计算法帮老鼠找到到达终点map【6】【5】的路线。 思路 1.findWay方法就是专门来找出迷宫的路径 2.如果找到&#xff…

阿里测试师用UI自动化测试实现元素定位!

随着IT行业的发展&#xff0c;产品愈渐复杂&#xff0c;web端业务及流程更加繁琐&#xff0c;目前UI测试仅是针对单一页面&#xff0c;操作量大。为了满足多页面功能及流程的需求及节省工时&#xff0c;设计了这款UI 自动化测试程序。旨在提供接口&#xff0c;集成到蜗牛自动化…

第3章 Micro SaaS 的挑战

目录 1.对系统和平台的依赖 2.个人动力/责任随你而止 3.无尽的客户支持 4.模仿者 最后的想法 尽管 Micro SaaS 有很多好处&#xff0c;但这种商业模式并非没有其独特的缺点&#xff0c;您在开始时需要注意这些缺点。 以下是您需要了解的 Micro SaaS 的一些主要挑战&#…

BeanFactory和FactoryBean,ApplicationContext的关系

他们的区别比较容易理解&#xff0c;从字面意思就能区分开来&#xff0c;BeanFactory是Bean工厂&#xff0c;而FactoryBean是工厂BeanBeanFactory&#xff0c;Spring中工厂的顶层规范&#xff0c;他是IOC容器的核心接口&#xff0c;它的职责包括&#xff1a;实例化、定位、配置…

AIGC AI绘画 Midjourney 参数大全详细列表

AIGC ChatGPT 职场案例60集&#xff0c; Power BI 商业智能 68集&#xff0c; 数据库Mysql8.0 54集 数据库Oracle21C 142集&#xff0c; Office&#xff0c; Python &#xff0c;ETL Excel 2021 实操&#xff0c;函数&#xff0c;图表&#xff0c;大屏可视化 案例实战 http:…