混合搜索与多重嵌入:一次有趣又毛茸茸的猫咪搜索之旅!(二)

这是继上一篇文章  “混合搜索与多重嵌入:一次有趣又毛茸茸的猫咪搜索之旅!(一)” 的续篇。这这篇文章中,我们讲使用本地 Elasticsearch 部署来完成整个演示。这是一个简单的 Python Web 应用程序,展示了可以在 Elastic 中实现的不同类型的搜索:

  1. 词汇搜索
  2. 文本和图像嵌入的向量搜索
  3. 结合词汇和向量搜索的混合搜索

在本展示中,除了使用现有的代码,我们还讲探讨使用 semantic_text 字段来完成整个演示。

准备工作

安装

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

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

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

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

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

我们记下上面的信息。它们将在如下的配置中进行使用。

为了能够使得 RRF多路招行排名能够运行,我们必须使用订阅功能:

克隆代码

我们使用如下的命令来下载代码:

git clone https://github.com/jospdeleon/elasticats

我们必须安装好 Python,并在代码的根目录下打入如下的命令:

$ pwd
/Users/liuxg/python/elasticats
$ python --version
Python 3.11.8
$ python -m venv .venv
$ ls -al
total 264
drwxr-xr-x   16 liuxg  staff    512 Nov  1 17:16 .
drwxr-xr-x@ 141 liuxg  staff   4512 Nov  1 17:02 ..
-rw-r--r--    1 liuxg  staff    329 Nov  1 17:02 .env-template
-rw-r--r--    1 liuxg  staff     34 Nov  1 17:02 .flaskenv
drwxr-xr-x   12 liuxg  staff    384 Nov  1 17:02 .git
-rw-r--r--    1 liuxg  staff   3192 Nov  1 17:02 .gitignore
drwxr-xr-x    6 liuxg  staff    192 Nov  1 17:16 .venv
-rw-r--r--    1 liuxg  staff   3135 Nov  1 17:02 README.md
-rw-r--r--    1 liuxg  staff  70441 Nov  1 17:02 Search flowchart.png
-rw-r--r--    1 liuxg  staff   5466 Nov  1 17:02 app.py
-rw-r--r--    1 liuxg  staff  17450 Nov  1 17:02 data.json
-rw-r--r--    1 liuxg  staff    121 Nov  1 17:02 notes.txt
-rw-r--r--    1 liuxg  staff    667 Nov  1 17:02 requirements.txt
-rw-r--r--    1 liuxg  staff   4561 Nov  1 17:02 search.py
drwxr-xr-x    5 liuxg  staff    160 Nov  1 17:02 static
drwxr-xr-x    5 liuxg  staff    160 Nov  1 17:02 templates

我们接着使用如下的命令来进行安装:

$ source .venv/bin/activate
(.venv) $ pip3 install -r requirements.txt

拷贝证书

我们把 Elasticsearch 的证书拷贝到当前的目录下:

$ pwd
/Users/liuxg/python/elasticats
$ cp ~/elastic/elasticsearch-8.15.3/config/certs/http_ca.crt .
$ ls -w
README.md            app.py               http_ca.crt          requirements.txt     static
Search flowchart.png data.json            notes.txt            search.py            templates

从上面我们可以看出来 http_ca.crt 已经被拷贝到当前的目录下。

修改文件

我们把上面的 .env-template 文件拷贝到 .env 文件中,并对它进行相应的修改:

(.venv) $ cp .env-template .env

我们使用一个我们喜欢的编辑器对 .env 进行编辑。它的内容如下:

# Make a copy of this file with the name .env and assign values to variables# Your Elastic Cloud credentials
export ES_USER="elastic"
export ES_PASSWORD="DgmQkuRWG5RQcodxwGxH"
export ES_ENDPOINT="localhost"
export OPENAI_API_KEY="YOUR_OPEN_AI_KEY"# The name of the Elasticsearch index, you can change this
ES_INDEX=my-cats

你需要根据自己的配置进行相应的修改。

在原来的文件中,它使用的是 Elastic Clould 来进行完成的。在我们的演示中,我们将使用本地 Elasitcsearch 部署来完成。我们需要修改文件 search.py

search.py

        # self.es = Elasticsearch(cloud_id=os.environ['ELASTIC_CLOUD_ID'],#                         api_key=os.environ['ELASTIC_API_KEY'])elastic_user=os.getenv('ES_USER')elastic_password=os.getenv('ES_PASSWORD')elastic_endpoint=os.getenv("ES_ENDPOINT")url = f"https://{elastic_user}:{elastic_password}@{elastic_endpoint}:9200"self.es = Elasticsearch(url, ca_certs = "./http_ca.crt", verify_certs = True)

如上所示,我们把 ELASTIC CLOUD 部分的代码注释掉,然后我们替换为自己的本地部署。

由于我使用的是 Python 3.11 版本,我还特意修改了如下的两行代码:

app.py

113 行

 print(f"Total results: {results['hits']['total']['value']}")

106 行

print (f"Search query: {search_params['query']}")

在原始仓库里的代码如下:

print(f'Search query: {search_params['query']}')
print(f'Total results: {results['hits']['total']['value']}')

写入数据到 Elasticsearch 中

在运行应用程序之前,你需要先索引 data.json 中的文档。在 data.json 中的文档类似如这样的数据:

  {"cat_id": "70417071","name": "Luke & ( Leia)felv+","url":"https://www.petfinder.com/cat/luke-leiafelv-70417071/va/herndon/fancy-cats-rescue-team-va145/","summary": "Hello, I'm Luke Skywalker, your future feline companion. My tale is a magical one. I was just a regular cat, but one night, under the full moon, I discovered I could speak human language. Startled, I ran away, finding myself here. I'm curious, smart, sweet, and friendly, not to mention a bit goofy and brave. My best friend, Princess Leia, is here too. We're a playful, cuddly, energetic duo who love adventures. I promise to fill your life with purrs, laughter, and endless love. I may not be a Jedi, but I can surely be the hero of your heart.","age": "Adult","gender": "Male","size": "Medium","coat":"Short","breed":"Abyssinian","photo":"images/Abyssinian/70417071.jpeg"}

我们在 .venv 环境中运行如下的命令:

flask reindex
(.venv) $ flask reindex
modules.json: 100%|████████████████████████████████████████████████████████| 122/122 [00:00<00:00, 150kB/s]
config_sentence_transformers.json: 100%|███████████████████████████████████| 116/116 [00:00<00:00, 648kB/s]
README.md: 100%|██████████████████████████████████████████████████████| 1.91k/1.91k [00:00<00:00, 10.2MB/s]
0_CLIPModel/special_tokens_map.json: 100%|████████████████████████████████| 389/389 [00:00<00:00, 1.26MB/s]
0_CLIPModel/tokenizer_config.json: 100%|██████████████████████████████████| 604/604 [00:00<00:00, 1.68MB/s]
0_CLIPModel/preprocessor_config.json: 100%|███████████████████████████████| 316/316 [00:00<00:00, 4.95MB/s]
0_CLIPModel/config.json: 100%|█████████████████████████████████████████| 4.03k/4.03k [00:00<00:00, 106MB/s]
0_CLIPModel/merges.txt: 100%|████████████████████████████████████████████| 525k/525k [00:00<00:00, 616kB/s]
0_CLIPModel/vocab.json: 100%|████████████████████████████████████████████| 961k/961k [00:01<00:00, 928kB/s]
pytorch_model.bin: 100%|████████████████████████████████████████████████| 605M/605M [00:35<00:00, 17.0MB/s]
Connected to Elasticsearch!
Traceback (most recent call last):██████████████████████████████████████| 605M/605M [00:35<00:00, 17.4MB/s]

如上所示,我们可以看到有 15 个文档写入到 Elasticsearch 中。我们可以在 Kibana 里进行查看:

GET my-cats/_mapping

上面的命令显示:

{"my-cats": {"mappings": {"properties": {"age": {"type": "keyword"},"breed": {"type": "keyword"},"cat_id": {"type": "keyword"},"coat": {"type": "keyword"},"gender": {"type": "keyword"},"img_embedding": {"type": "dense_vector","dims": 512,"index": true,"similarity": "cosine","index_options": {"type": "int8_hnsw","m": 16,"ef_construction": 100}},"name": {"type": "text"},"photo": {"type": "keyword"},"size": {"type": "keyword"},"summary": {"type": "text"},"summary_embedding": {"type": "dense_vector","dims": 384,"index": true,"similarity": "cosine","index_options": {"type": "int8_hnsw","m": 16,"ef_construction": 100}},"url": {"type": "keyword"}}}}
}

从上面我们可以看出来,其中有两个字段是 dense_vector 类型的字段:img_embedding 及 summary_embedding

GET my-cats/_count

GET my-cats/_search

运行应用

我们现在可以运行并测试该应用程序:

(.venv) $> flask run
(.venv) $ flask run
Connected to Elasticsearch!
{'cluster_name': 'elasticsearch','cluster_uuid': 'WH5NAJ8DRxO39VVTv6caLQ','name': 'liuxgm.local','tagline': 'You Know, for Search','version': {'build_date': '2024-10-09T22:08:00.328917561Z','build_flavor': 'default','build_hash': 'f97532e680b555c3a05e73a74c28afb666923018','build_snapshot': False,'build_type': 'tar','lucene_version': '9.11.1','minimum_index_compatibility_version': '7.0.0','minimum_wire_compatibility_version': '7.17.0','number': '8.15.3'}}* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:5000
Press CTRL+C to quit* Restarting with stat
Connected to Elasticsearch!
{'cluster_name': 'elasticsearch','cluster_uuid': 'WH5NAJ8DRxO39VVTv6caLQ','name': 'liuxgm.local','tagline': 'You Know, for Search','version': {'build_date': '2024-10-09T22:08:00.328917561Z','build_flavor': 'default','build_hash': 'f97532e680b555c3a05e73a74c28afb666923018','build_snapshot': False,'build_type': 'tar','lucene_version': '9.11.1','minimum_index_compatibility_version': '7.0.0','minimum_wire_compatibility_version': '7.17.0','number': '8.15.3'}}* Debugger is active!* Debugger PIN: 682-962-783

从上面,我们可以看到服务器运行于 http://127.0.0.1:5000。我们在浏览器中进行访问:

首先,我们不用选任何的选项,直接点击 Submit 按钮。我们可以看到我们搜索到 15 个结果。这个是我们所有猫。

接下来,你可以选择任何过滤器,将它们与描述字段中的任何文本组合,或上传猫的类似图像。注意:目前,存在分页问题,​​在进行后续搜索(搜索后)时,结果不会从第一页开始。作为解决方法,请对你想要测试的每次搜索使用 “Reset” 按钮。

在上面,我们选择了 

  1. Persian: 72378135_2 (Garth) - multiple cats in the pic

它显示有多个图片被匹配了。

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

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

相关文章

算法【Java】—— 动态规划之路径问题

前言 本文章终点解析第一道题目【不同路径】和最后一道题目【地下城游戏】的动态规划思路&#xff0c;中间几道题目会很快过完&#xff0c;大家如果不熟悉动态规划的思路可以重点看一下这两道题目的解析。 不同路径 https://leetcode.cn/problems/unique-paths 解析&#xf…

FPGA实现串口升级及MultiBoot(五)通过约束脚本添加IPROG实例

本文目录索引 一个指令和三种方式通过约束脚本添加Golden位流工程MultiBoot位流工程验证example1总结代码缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7MB:MicroBlaze上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针对以上四句话我…

jmeter基础02_下载安装jmeter

&#xff08;安装包windows、mac、Linux通用&#xff09; Step1. 官网下载 官网地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi 官网可见最新版本的jmeter和要求的jdk版本&#xff0c;先说结论&#xff1a;建议下载Binaries-zip格式包即可。 安装包有2大类&am…

理解鸿蒙app 开发中的 context

是什么 Context是应用中对象的上下文&#xff0c;其提供了应用的一些基础信息&#xff0c;例如resourceManager&#xff08;资源管理&#xff09;、applicationInfo&#xff08;当前应用信息&#xff09;、dir&#xff08;应用文件路径&#xff09;、area&#xff08;文件分区…

Linux:git的了解和基础使用(保姆级教程)

文章目录 引言一、git是什么1.1 版本控制器git1.2 git的历史 二、git的使用2.1 安装git2.2 创建gitee账号2.3 git三板斧2.3.1 add2.3.2 commit2.3.3 push 三. git的补充总结 引言 git是一款软件&#xff0c;它用于帮助我们来管理代码以及文件&#xff0c;掌握并使用git可以很有…

探索LINQ在C#中的应用:从基本查询到数据联接

LINQ&#xff08;语言集成查询&#xff09;是微软为.NET框架开发的一种强大功能&#xff0c;于2007年作为C# 3.0和Visual Basic .NET 9.0的一部分引入。LINQ的诞生旨在提供一种一致且直观的方式来查询和操作数据&#xff0c;无论数据来源是内存中的集合、数据库还是XML文档。 …

鸿蒙UI开发——实现环形文字

1、背 景 有朋友提问&#xff1a;您好关于鸿蒙UI想咨询一个问题 如果我想实现展示环形文字是需要通过在Text组件中设置transition来实现么&#xff0c;还是需要通过其他方式来实现。 针对这位粉丝朋友的提问&#xff0c;我们做一下解答。 2、实现环形文字效果 ❓ 什么是环形…

搭建轻量级文件服务器Dufs

前言 Dufs是什么&#xff1f; 答&#xff1a;是一款轻量级文件管理服务器&#xff0c;类似于FTP服务器但又比FTP更好用易于管理。 Dufs有什么特性&#xff1f; 答&#xff1a; ‌静态文件服务…

【软考】系统分析师第二版 新增章节 第20章微服务系统分析与设计

微服务系统是一类基于微服务架构风格的分布式系统&#xff0c;它将应用程序拆分成多个独立的小型服务&#xff0c;每个服务都运行在独立的进程中&#xff0c;并采用轻量级通信协议进行通信。这些服务可以由不同的团队开发、不同的编程语言编写&#xff0c;并且可以按需部署。微…

基于SSM的校园美食交流系统【附源码】

基于SSM的校园美食交流系统 效果如下&#xff1a; 管理员主页面 用户主页面 美食信息页面 美食资讯页面 修改密码页面 论坛中心页面 研究背景 随着高校信息化建设的不断推进&#xff0c;校园生活日益丰富多样&#xff0c;学生对于美食的需求与探索也愈发旺盛。然而&#xff…

PICO+Unity MR空间网格

官方链接&#xff1a;空间网格 | PICO 开发者平台 注意&#xff1a;该功能只能打包成APK在PICO 4 Ultra上真机运行&#xff0c;无法通过串流或PICO developer center在PC上运行。使用之前要开启视频透视。 在 Inspector 窗口中的 PXR_Manager (Script) 面板上&#xff0c;勾选…

斗破QT编程入门系列之前言:认识Qt:获取与安装(四星斗师)

本系列是在学习完C之后&#xff0c;然后通过Qt构建界面来&#xff0c;赋予枯燥的代码新的样貌&#xff0c;这样我们才能开发出更人性化的程序&#xff0c;同时会进一步提高初学者对编程的兴趣&#xff0c;大家加油&#xff0c;斗破Qt来了。 斗破Qt目录&#xff1a; 斗破Qt编程…

PyTorch核心概念:从梯度、计算图到连续性的全面解析(三)

文章目录 Contiguous vs Non-Contiguous TensorTensor and ViewStrides非连续数据结构&#xff1a;Transpose( )在 PyTorch 中检查Contiguous and Non-Contiguous将不连续张量&#xff08;或视图&#xff09;转换为连续张量view() 和 reshape() 之间的区别总结 参考文献 Contig…

家庭宽带如何开启公网ipv4和ipv6

好久没更新了&#xff0c;最近在家里折腾nas。一来自己有下电影的习惯&#xff0c;二来手机的icloud容量也不够了。所以买了群晖的423,但是nas要想用的畅快&#xff0c;外网访问必不可少。所以我之前研究了下&#xff0c;打家里的电信快带打通了外网。 一般nas的服务商基本都会…

【Linux】Ansible集中化运维工具(详解)安装、常用模块、playbook脚本

文章目录 一、Ansible安装及远程控制1、关闭防火墙和SELinux2、安装ansible3、配置SSH无密码登录1、在管理机上生成一对密钥2、将公钥下发到远程主机3、保管密钥 4、主机目录 二、常用模块1、setup模块2、copy模块3、file模块4、shell模块5、script模块6、ping模块7、group模块…

基于 RNN 的语言模型

基于 RNN 的语言模型 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类网络连接中包含环路的 神经网络的总称。 给定一个序列&#xff0c;RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度&#xff0c;历史状态被循环累积&#xff0c;并作为…

第二十九篇——线性代数:“矩阵”到底怎么用?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学中的线性代数&#xff0c;再生活中的落地和应用&#xff0c;是我这个…

nodejs:下载,安装,系统环境配置,更换镜像

​​​​下载 地址&#xff1a;https://nodejs.org/zh-cn/download/prebuilt-installer 安装包 开始安装 安装完成 给文件夹添加权限 创建两个文件夹 node_cache node_global 更新环境变量 修改环境变量&#xff0c;新的全局模块路径&#xff0c;这样在任何位置运行命令时都…

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

2024.11.9更新 开关mpo ulps 感觉有用但是还是掉驱动&#xff0c;现在确定是window顶驱动问题 按网上的改注册表和组策略会让自己也打不上驱动 目前感觉最好的办法就是&#xff0c;重置此电脑&#xff0c;然后你就摆着电脑挂个十分钟半小时别动&#xff0c;一开始他是不显示…

案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索

河北省某检察院是当地重要的法律监督机构&#xff0c;肩负着维护法律尊严和社会公平正义的重要职责。该机构依法独立行使检察权&#xff0c;负责对犯罪行为提起公诉&#xff0c;并监督整个诉讼过程&#xff0c;同时积极参与社会治理&#xff0c;保护公民权益&#xff0c;推动法…