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

安装
Elasticsearch 及 Kibana
如果你还没有安装好自己的 Elasticsearch 及 Kibana,那么我们可以参考如下的文章来进行安装:
特别值得注意的是,我们选择 "Elastic Stack 8.x 安装" 安装指南。在本次的练习中,我们将使用最新的 Elastic Stack 8.17.1。
我们记下上面的密码,并在下面的代码中进行使用。
另外,为了能够使得我们避免警告,我们在 Kibana 中针对 xpack.encryptedSavedObjects.encryptionKey 进行设置。这个也是我们需要使用 Playground 所必须的。详细设置也可以参考文章 "Elasticsearch:使用 Playground 与你的 PDF 聊天"。 我们在 terminal 中打入如下的命令:
bash
`bin/kibana-encryption-keys generate`AI写代码
上述命令将生成如上所示的 3 个 keys。我们把上面的三个 keys 拷贝到 config/kibana.yml 文件的最底部,并保存。我们需要重新启动 Kibana。
创建 API key
我们拷贝上面的 API key:ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==。这个 key 将在下面用到。
下载代码
我们使用如下的命令来下载代码:
bash
`git clone https://github.com/liu-xiao-guo/search-vectorfaces`AI写代码
我们在代码的目录中发现文件 env。我们做如下的配置:
env
ini
`
1. ES_INDEX="faces"
2. 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"
3. ES_UPLOADS_INDEX="faces-bbq_hnsw-uploads"
4. ES_HOST=https://192.168.101.219:9200
5. ES_API_KEY=ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码
在上面的配置中,我们需要使用电脑的私有地址,否则 docker 不能访问。我们可以使用如下的命令获得这个 IP 地址:
go
`ifconfig | grep inet`AI写代码
markdown
`
1. $ ifconfig | grep inet
2. inet 127.0.0.1 netmask 0xff000000
3. inet6 ::1 prefixlen 128
4. inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
5. inet6 fe80::85:954f:1a68:fc02%en0 prefixlen 64 secured scopeid 0xe
6. inet 192.168.101.219 netmask 0xffffff00 broadcast 192.168.101.255
7. inet6 2408:8207:2495:24c1:1cdc:21bc:473e:4f2a prefixlen 64 autoconf secured
8. inet6 2408:8207:2495:24c1:5daa:5857:1bce:b355 prefixlen 64 autoconf temporary
9. inet6 2408:8207:2495:24c1:1451:2091:5ea6:a prefixlen 64 dynamic
10. inet6 fe80::7c85:f9ff:fe10:3d%awdl0 prefixlen 64 scopeid 0x10
11. inet6 fe80::7c85:f9ff:fe10:3d%llw0 prefixlen 64 scopeid 0x11
12. inet6 fe80::cdd1:7c41:9808:ba6e%utun0 prefixlen 64 scopeid 0x12
13. inet6 fe80::4c75:5fc0:89c0:6527%utun1 prefixlen 64 scopeid 0x13
14. inet6 fe80::2337:6f09:4249:c0a1%utun2 prefixlen 64 scopeid 0x14
15. inet6 fe80::ce81:b1c:bd2c:69e%utun3 prefixlen 64 scopeid 0x15
16. inet 198.18.198.5 --> 198.18.198.5 netmask 0xfffff800
`AI写代码
安装 Python 库
安装如下的命令来安装 Elasticsearch 的 Python 客户端库:
go
`pip install elasticsearch`AI写代码
创建索引
我们进入到 data 目录,并执行如下的命令:
arduino
`
1. python setup.py \
2. --es_url https://localhost:9200 \
3. --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码
bash
`
1. $ pwd
2. /Users/liuxg/python/search-vectorfaces
3. $ cd data/
4. $ ls
5. faces-bbq_hnsw-10.15.json faces-disk_bbq-10.15.json faces-int8_hnsw-10.15.json requirements.txt
6. faces-bbq_hnsw-uploads.json faces-int4_hnsw-10.15.json index.py setup.py
7. $ python setup.py \
8. > --es_url https://localhost:9200 \
9. > --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
10. Connecting to Elasticsearch at https://localhost:9200...
11. Connected to Elasticsearch successfully.
12. 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
13. Creating index 'faces-bbq_hnsw-10.15'...
14. /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
15. es.indices.create(
16. Index 'faces-bbq_hnsw-10.15' created successfully.
17. Creating index 'faces-disk_bbq-10.15'...
18. Index 'faces-disk_bbq-10.15' created successfully.
19. Creating index 'faces-int4_hnsw-10.15'...
20. Index 'faces-int4_hnsw-10.15' created successfully.
21. Creating index 'faces-int8_hnsw-10.15'...
22. Index 'faces-int8_hnsw-10.15' created successfully.
23. Creating index 'faces-bbq_hnsw-uploads'...
24. Index 'faces-bbq_hnsw-uploads' created successfully.
26. All 5 index(es) are ready for indexing.
`AI写代码
我们可以在 Kibana 中进行查看:
bash
`GET _cat/indices/faces-*`AI写代码

我们看到已经成功地创建了 5 个索引。
写入数据
我们首先在地址 index dump 下载数据,并拷贝到 data 子目录下:
markdown
`
1. $ pwd
2. /Users/liuxg/python/search-vectorfaces/data
3. $ ls
4. faces-bbq_hnsw-10.15.json faces-int4_hnsw-10.15.json requirements.txt
5. faces-bbq_hnsw-uploads.json faces-int8_hnsw-10.15.json setup.py
6. faces-disk_bbq-10.15.json index.py vectorfaces-index-dump.tar.gz
`AI写代码
上面的数据文件 vectorfaces-index-dump.tar.gz 含有 318,526 个名人脸部 embeddings。我们使用如下的命令来解压缩:
go
`tar xzf vectorfaces-index-dump.tar.gz` AI写代码
markdown
`
1. $ tar xzf vectorfaces-index-dump.tar.gz
2. $ ls
3. faces-bbq_hnsw-10.15.json faces-int8_hnsw-10.15.json vectorfaces-index-dump.tar.gz
4. faces-bbq_hnsw-uploads.json index.py vectorfaces.ndjson
5. faces-disk_bbq-10.15.json requirements.txt
6. faces-int4_hnsw-10.15.json setup.py
`AI写代码
在上面,我们看到文件 vectorfaces.ndjson 既是我们的 embeddings 文件。
我们使用如下的命令来写入 embeddings:
arduino
`
1. python index.py faces-bbq_hnsw-10.15 \
2. --es_url https://localhost:9200 \
3. --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码


我们需要几分钟的时间把所有的数据写入到 Elasticsearch。我们可以在 Kibana 中进行查看:
bash
`GET _cat/indices/faces-bbq_hnsw-10.15`AI写代码

如法炮制,我们可以使用如下的命令来写入其它的索引:
arduino
`
1. python index.py faces-disk_bbq-10.15 \
2. --es_url https://localhost:9200 \
3. --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码
arduino
`
1. python index.py faces-int8_hnsw-10.15 \
2. --es_url https://localhost:9200 \
3. --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码
arduino
`
1. python index.py faces-int4_hnsw-10.15 \
2. --es_url https://localhost:9200 \
3. --es_apikey ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码
如果你觉得写入剩下的三个索引很麻烦的话,你可以在完成第一个索引的情况下,使用如下的命令来创建其余的 3 个索引:
bash
`
1. POST _reindex?requests_per_second=-1
2. {
3. "source": {
4. "index": "faces-bbq_hnsw-10.15"
5. },
6. "dest": {
7. "index": "faces-int8_hnsw-10.15"
8. }
9. }
11. POST _reindex?requests_per_second=-1
12. {
13. "source": {
14. "index": "faces-bbq_hnsw-10.15"
15. },
16. "dest": {
17. "index": "faces-disk_bbq-10.15"
18. }
19. }
21. POST _reindex?requests_per_second=-1
22. {
23. "source": {
24. "index": "faces-bbq_hnsw-10.15"
25. },
26. "dest": {
27. "index": "faces-int4_hnsw-10.15"
28. }
29. }
`AI写代码
这是因为剩余的 3 个索引都是基于前面的 HNSW 索引而生成的:
运行 Demo
使用你的 Elasticsearch 凭据配置 env.local。只修改 ES_HOST 和 ES_API_KEY;其余保持不变:
ini
`
1. ES_INDEX="faces"
2. 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"
3. ES_UPLOADS_INDEX="faces-bbq_hnsw-uploads"
4. ES_HOST=https://192.168.101.219:9200
5. ES_API_KEY=ZksxQlZKc0JZUG5pX1NBR2Z2Yjg6M3haQlpuYTZGX0NUd1BNWVM3cXdSdw==
`AI写代码
markdown
`
1. $ pwd
2. /Users/liuxg/python/search-vectorfaces
3. $ ls
4. README.md data docker-compose.yml frontend
5. backend doc env
6. $ cp env env.local
7. $ ls
8. README.md data docker-compose.yml env.local
9. backend doc env frontend
`AI写代码
启动应用程序:
go
`docker-compose up`AI写代码

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



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