news 2026/3/30 13:28:58

Elasticsearch:圣诞晚餐 BBQ - 图像识别

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Elasticsearch:圣诞晚餐 BBQ - 图像识别

这篇文章是之前的文章 “Elasticsearch:圣诞晚餐 BBQ”,在今天的文章中,我讲详述如何进行图像搜索并在本地运行。

安装

Elasticsearch 及 Kibana

如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么我们可以参考如下的文章来进行安装:

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

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

特别值得注意的是,我们选择 “Elastic Stack 8.x 安装” 安装指南。在本次的练习中,我们将使用最新的 Elastic Stack 8.17.1。

我们记下上面的密码,并在下面的代码中进行使用。

另外,为了能够使得我们避免警告,我们在 Kibana 中针对 xpack.encryptedSavedObjects.encryptionKey 进行设置。这个也是我们需要使用 Playground 所必须的。详细设置也可以参考文章 “Elasticsearch:使用 Playground 与你的 PDF 聊天”。 我们在 terminal 中打入如下的命令:

bin/kibana-encryption-keys generate

上述命令将生成如上所示的 3 个 keys。我们把上面的三个 keys 拷贝到 config/kibana.yml 文件的最底部,并保存。我们需要重新启动 Kibana。

创建 API key

我们拷贝上面的 API key:ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==。这个 key 将在下面用到。

下载代码

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

git clone https://github.com/liu-xiao-guo/search-vectorfaces

我们在代码的目录中发现文件 env。我们做如下的配置:

env

ES_INDEX="faces" ES_INDICES="faces-int4_hnsw-10.15,faces-int8_hnsw-10.15,faces-disk_bbq-10.15,faces-bbq_hnsw-10.15,faces-bbq_hnsw-10.15" ES_UPLOADS_INDEX="faces-bbq_hnsw-uploads" ES_HOST=https://192.168.101.219:9200 ES_API_KEY=ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==

在上面的配置中,我们需要使用电脑的私有地址,否则 docker 不能访问。我们可以使用如下的命令获得这个 IP 地址:

ifconfig | grep inet
$ ifconfig | grep inet inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet6 fe80::85:954f:1a68:fc02%en0 prefixlen 64 secured scopeid 0xe inet 192.168.101.219 netmask 0xffffff00 broadcast 192.168.101.255 inet6 2408:8207:2495:24c1:1cdc:21bc:473e:4f2a prefixlen 64 autoconf secured inet6 2408:8207:2495:24c1:5daa:5857:1bce:b355 prefixlen 64 autoconf temporary inet6 2408:8207:2495:24c1:1451:2091:5ea6:a prefixlen 64 dynamic inet6 fe80::7c85:f9ff:fe10:3d%awdl0 prefixlen 64 scopeid 0x10 inet6 fe80::7c85:f9ff:fe10:3d%llw0 prefixlen 64 scopeid 0x11 inet6 fe80::cdd1:7c41:9808:ba6e%utun0 prefixlen 64 scopeid 0x12 inet6 fe80::4c75:5fc0:89c0:6527%utun1 prefixlen 64 scopeid 0x13 inet6 fe80::2337:6f09:4249:c0a1%utun2 prefixlen 64 scopeid 0x14 inet6 fe80::ce81:b1c:bd2c:69e%utun3 prefixlen 64 scopeid 0x15 inet 198.18.198.5 --> 198.18.198.5 netmask 0xfffff800

安装 Python 库

安装如下的命令来安装 Elasticsearch 的 Python 客户端库:

pip install elasticsearch

创建索引

我们进入到 data 目录,并执行如下的命令:

python setup.py \ --es_url https://localhost:9200 \ --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
$ pwd /Users/liuxg/python/search-vectorfaces $ cd data/ $ ls faces-bbq_hnsw-10.15.json faces-disk_bbq-10.15.json faces-int8_hnsw-10.15.json requirements.txt faces-bbq_hnsw-uploads.json faces-int4_hnsw-10.15.json index.py setup.py $ python setup.py \ > --es_url https://localhost:9200 \ > --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw== Connecting to Elasticsearch at https://localhost:9200... Connected to Elasticsearch successfully. Found 5 index definition(s): faces-bbq_hnsw-10.15, faces-disk_bbq-10.15, faces-int4_hnsw-10.15, faces-int8_hnsw-10.15, faces-bbq_hnsw-uploads Creating index 'faces-bbq_hnsw-10.15'... /Users/liuxg/python/search-vectorfaces/data/setup.py:27: ElasticsearchWarning: Your license will expire in [4] days. Contact your administrator or update your license for continued use of features es.indices.create( Index 'faces-bbq_hnsw-10.15' created successfully. Creating index 'faces-disk_bbq-10.15'... Index 'faces-disk_bbq-10.15' created successfully. Creating index 'faces-int4_hnsw-10.15'... Index 'faces-int4_hnsw-10.15' created successfully. Creating index 'faces-int8_hnsw-10.15'... Index 'faces-int8_hnsw-10.15' created successfully. Creating index 'faces-bbq_hnsw-uploads'... Index 'faces-bbq_hnsw-uploads' created successfully. All 5 index(es) are ready for indexing.

我们可以在 Kibana 中进行查看:

GET _cat/indices/faces-*

我们看到已经成功地创建了 5 个索引。

写入数据

我们首先在地址 index dump 下载数据,并拷贝到 data 子目录下:

$ pwd /Users/liuxg/python/search-vectorfaces/data $ ls faces-bbq_hnsw-10.15.json faces-int4_hnsw-10.15.json requirements.txt faces-bbq_hnsw-uploads.json faces-int8_hnsw-10.15.json setup.py faces-disk_bbq-10.15.json index.py vectorfaces-index-dump.tar.gz

上面的数据文件 vectorfaces-index-dump.tar.gz 含有 318,526 个名人脸部 embeddings。我们使用如下的命令来解压缩:

tar xzf vectorfaces-index-dump.tar.gz
$ tar xzf vectorfaces-index-dump.tar.gz $ ls faces-bbq_hnsw-10.15.json faces-int8_hnsw-10.15.json vectorfaces-index-dump.tar.gz faces-bbq_hnsw-uploads.json index.py vectorfaces.ndjson faces-disk_bbq-10.15.json requirements.txt faces-int4_hnsw-10.15.json setup.py

在上面,我们看到文件 vectorfaces.ndjson 既是我们的 embeddings 文件。

我们使用如下的命令来写入 embeddings:

python index.py faces-bbq_hnsw-10.15 \ --es_url https://localhost:9200 \ --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==

我们需要几分钟的时间把所有的数据写入到 Elasticsearch。我们可以在 Kibana 中进行查看:

GET _cat/indices/faces-bbq_hnsw-10.15

如法炮制,我们可以使用如下的命令来写入其它的索引:

python index.py faces-disk_bbq-10.15 \ --es_url https://localhost:9200 \ --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
python index.py faces-int8_hnsw-10.15 \ --es_url https://localhost:9200 \ --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
python index.py faces-int4_hnsw-10.15 \ --es_url https://localhost:9200 \ --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==

如果你觉得写入剩下的三个索引很麻烦的话,你可以在完成第一个索引的情况下,使用如下的命令来创建其余的 3 个索引:

POST _reindex?requests_per_second=-1 { "source": { "index": "faces-bbq_hnsw-10.15" }, "dest": { "index": "faces-int8_hnsw-10.15" } } POST _reindex?requests_per_second=-1 { "source": { "index": "faces-bbq_hnsw-10.15" }, "dest": { "index": "faces-disk_bbq-10.15" } } POST _reindex?requests_per_second=-1 { "source": { "index": "faces-bbq_hnsw-10.15" }, "dest": { "index": "faces-int4_hnsw-10.15" } }

这是因为剩余的 3 个索引都是基于前面的 HNSW 索引而生成的:

运行 Demo

使用你的 Elasticsearch 凭据配置 env.local。只修改 ES_HOST 和 ES_API_KEY;其余保持不变:

ES_INDEX="faces" ES_INDICES="faces-int4_hnsw-10.15,faces-int8_hnsw-10.15,faces-disk_bbq-10.15,faces-bbq_hnsw-10.15,faces-bbq_hnsw-10.15" ES_UPLOADS_INDEX="faces-bbq_hnsw-uploads" ES_HOST=https://192.168.101.219:9200 ES_API_KEY=ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
$ pwd /Users/liuxg/python/search-vectorfaces $ ls README.md data docker-compose.yml frontend backend doc env $ cp env env.local $ ls README.md data docker-compose.yml env.local backend doc env frontend

启动应用程序:

docker-compose up

打开 http://localhost:16700 并开始测试!

我也把我的照片拍上去了。我还是其中的一个明星呢!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/25 9:38:10

Dify平台适配主流大模型:灵活调用Token资源的最佳实践

Dify平台适配主流大模型:灵活调用Token资源的最佳实践 在企业加速拥抱AI的今天,一个现实问题摆在面前:如何让大模型真正落地业务场景,而不是停留在技术演示或实验原型中?我们见过太多团队投入大量人力开发智能客服、知…

作者头像 李华
网站建设 2026/3/28 14:19:20

AUTOSAR网络管理编译与移植技术指南

AUTOSAR网络管理实战:从配置到移植的全链路解析一场“休眠”引发的系统性思考在一次车身控制器(BCM)项目调试中,团队遇到了一个典型问题:车辆熄火后,CAN总线始终无法进入低功耗状态,导致静态电流…

作者头像 李华
网站建设 2026/3/30 20:49:09

深入浅出讲解UDS协议NRC错误响应逻辑

深入理解UDS协议中的NRC错误响应机制:从原理到实战你有没有遇到过这样的场景?诊断仪发了一个读数据请求,ECU却只回了个“7F 22 XX”——三字节的否定响应,像一道谜题横在面前。这时候,是反复重试?还是抓耳挠…

作者头像 李华
网站建设 2026/3/27 12:46:08

如何制作一个 RAG 系统以获取对您数据的强大访问权限

原文:towardsdatascience.com/how-to-make-a-rag-system-to-gain-powerful-access-to-your-data-caf4bb9186ea RAG 系统是一种创新的信息检索方法。它结合了传统的信息检索方法,如向量相似度搜索,以及最先进的大语言模型技术。结合这些技术&a…

作者头像 李华
网站建设 2026/3/26 14:18:39

Dify平台的冷启动优化策略研究

Dify平台的冷启动优化策略研究 在大模型技术迅猛发展的今天,越来越多企业试图将LLM(大语言模型)融入实际业务场景。然而现实却常常令人沮丧:一个看似简单的智能客服或知识问答系统,从构思到可演示原型往往需要数周甚至…

作者头像 李华
网站建设 2026/3/29 15:55:57

Dify平台如何保障长时间运行任务的稳定性?

Dify平台如何保障长时间运行任务的稳定性? 在当今企业级AI应用日益复杂的背景下,一个常被忽视但至关重要的问题浮出水面:当AI系统需要持续运行数小时甚至跨天交互时,如何确保它不会“断片”、不会丢状态、不会因一次网络抖动而前功…

作者头像 李华