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

2023-10-08 08:30

本文主要是介绍Elasticsearch:使用 ELSER 文本扩展进行语义搜索,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在今天的文章里,我来详细地介绍如何使用 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 文件可以在地址下载。

这篇关于Elasticsearch:使用 ELSER 文本扩展进行语义搜索的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/164008

相关文章

Python使用Spire.PDF实现为PDF添加水印

《Python使用Spire.PDF实现为PDF添加水印》在现代数字化办公环境中,PDF已成为一种广泛使用的文件格式,尤其是在需要保持文档格式时,下面我们就来看看如何使用Python为PDF文件添加水... 目录一、准备工作二、实现步骤1. 导入必要的库2. 创建 PdfDocument 对象3. 设置水印

Java中的ConcurrentBitSet使用小结

《Java中的ConcurrentBitSet使用小结》本文主要介绍了Java中的ConcurrentBitSet使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、核心澄清:Java标准库无内置ConcurrentBitSet二、推荐方案:Eclipse

Go语言结构体标签(Tag)的使用小结

《Go语言结构体标签(Tag)的使用小结》结构体标签Tag是Go语言中附加在结构体字段后的元数据字符串,用于提供额外的属性信息,这些信息可以通过反射在运行时读取和解析,下面就来详细的介绍一下Tag的使... 目录什么是结构体标签?基本语法常见的标签用途1.jsON 序列化/反序列化(最常用)2.数据库操作(

Java中ScopeValue的使用小结

《Java中ScopeValue的使用小结》Java21引入的ScopedValue是一种作用域内共享不可变数据的预览API,本文就来详细介绍一下Java中ScopeValue的使用小结,感兴趣的可以... 目录一、Java ScopedValue(作用域值)详解1. 定义与背景2. 核心特性3. 使用方法

spring中Interceptor的使用小结

《spring中Interceptor的使用小结》SpringInterceptor是SpringMVC提供的一种机制,用于在请求处理的不同阶段插入自定义逻辑,通过实现HandlerIntercept... 目录一、Interceptor 的核心概念二、Interceptor 的创建与配置三、拦截器的执行顺

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

SQL Server 中的表进行行转列场景示例

《SQLServer中的表进行行转列场景示例》本文详细介绍了SQLServer行转列(Pivot)的三种常用写法,包括固定列名、条件聚合和动态列名,文章还提供了实际示例、动态列数处理、性能优化建议... 目录一、常见场景示例二、写法 1:PIVOT(固定列名)三、写法 2:条件聚合(CASE WHEN)四、

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1