news 2026/9/2 22:29:12

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/9/3 1:22:52

零基础理解高性能计算中的并行模型

从零开始读懂高性能计算中的并行模型:拆解“算得快”的底层逻辑你有没有想过,为什么今天的AI大模型能在几小时内完成训练,而十几年前的程序跑个天气预报都要几天?答案藏在一个词里:并行。我们每天都在用“多任务”形容…

作者头像 李华
网站建设 2026/9/2 23:30:08

Dify平台权限管理体系详解:满足企业多角色协作需求

Dify平台权限管理体系详解:满足企业多角色协作需求 在AI应用从实验室走向企业生产环境的过程中,一个常被忽视却至关重要的问题浮出水面:如何让非技术背景的业务人员安全、高效地参与AI系统构建? 设想这样一个场景:市场…

作者头像 李华
网站建设 2026/9/2 15:06:45

OTLP Trace数据结构

根据你的问题,OTLP(OpenTelemetry Protocol)是OpenTelemetry项目原生的数据传输协议,其数据模型基于ProtoBuf(Protocol Buffers)定义。你可以直接使用OpenTelemetry官方提供的Java类库来处理其Trace数据&am…

作者头像 李华
网站建设 2026/9/3 1:30:46

Dify支持的主流大模型列表及Token调用配置指南

Dify支持的主流大模型列表及Token调用配置指南 在企业加速拥抱AI的今天,如何快速、低成本地将大语言模型(LLM)能力集成到实际业务中,已成为技术团队的核心命题。尽管OpenAI、通义千问等厂商提供了强大的API服务,但直接…

作者头像 李华
网站建设 2026/9/2 19:01:25

安全、可控的 NPM 释放背后的秘诀

我有一支技术全面、经验丰富的小型团队,专注高效交付中等规模外包项目,有需要外包项目的可以联系我上个月,我在 npm 文档里挖到一个被埋得很深的细节——那种“多数人根本不会翻到”的角落。结果它直接改变了我对 预发布(prerelea…

作者头像 李华
网站建设 2026/9/2 19:56:21

Dify平台的数据版本快照功能使用详解

Dify平台的数据版本快照功能使用详解 在AI应用从实验走向生产的今天,一个常被忽视但至关重要的问题浮出水面:我们如何像管理代码一样,严谨地管理那些“看不见”的AI配置?比如一段提示词的微调、一次检索策略的变更,或是…

作者头像 李华