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

这篇文章是之前的文章 "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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

安装 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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

我们可以在 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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

这是因为剩余的 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 并开始测试!

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

相关推荐
是Judy咋!3 小时前
Elasticsearch---单机部署
大数据·elasticsearch·搜索引擎
java坤坤3 小时前
Elasticsearch Java实战手册:搭建、条件构建与分页优化
java·elasticsearch
初次攀爬者8 小时前
知识库-向量化功能-流式分片
后端·elasticsearch
Dxy123931021610 小时前
Elasticsearch向量搜索介绍
大数据·elasticsearch
only°夏至besos10 小时前
基于 Dinky + FlinkSQL + Flink CDC 同步 MySQL 数据到 Elasticsearch、Kafka
mysql·elasticsearch·flink
Filotimo_10 小时前
在java后端开发中,ES的用处
java·elasticsearch·jenkins
回吐泡泡oO10 小时前
ElasticSearch添加登录校验(仅供参考)
java·elasticsearch·jenkins
Elastic 中国社区官方博客10 小时前
使用 Elasticsearch 的 Profile API 对比 dense vector 搜索性能
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
是Judy咋!10 小时前
Elasticsearch---集群部署(SSL + X-Pack)
大数据·elasticsearch·ssl