
在我之前的文章 "Elasticsearch:部署 ELSER - Elastic Learned Sparse EncoderR",我描述了如何安装 ELSER 模型。在今天的文章中,我来讲讲如何在隔离的环境中安装 ELSER 模型。如果你在有网路的情况下,最容易安装 ELSER 的方法是是使用 inference API。我们可以通过如下的方式来进行。为了测试的方便,我们可以使用如下的方法来删除已经安装好的 ELSER 模型:
ini
`DELETE /_ml/trained_models/.elser_model_2?force=true`AI写代码
这样,我们确保在我们的安装中没有 ELSER 的安装:

我们接下来打入如下的命令来进行安装:
bash
`
1. PUT _inference/sparse_embedding/my_test_elser_inf_id
2. {
3. "service": "elasticsearch",
4. "service_settings": {
5. "model_id": ".elser_model_2",
6. "num_allocations": 1,
7. "num_threads": 1
8. }
9. }
`AI写代码

等过一会儿,我们再查看 Trained Modesl 页面:

我们可以看到已经成功部署的 .elser_model_2 模型。
更多阅读:Elasticsearch:如何为 Elastic Stack 部署 E5 模型 - 下载及隔离环境
在网路隔离的环境中安装 ELSER
如果你想在受限或封闭网络中部署 ELSER ,你有两个选项:
-
创建你自己的 HTTP / HTTPS 端点并将模型文件放在上面,
-
把模型文件放到所有具备 master 资格节点的 config 目录里的某个子目录中。
我们首先按照之前的方法来卸载已经安装好的 ELSER 模型:
ini
`DELETE /_ml/trained_models/.elser_model_2?force=true`AI写代码
模型工件文件
对于跨平台版本,你的系统里需要以下文件:
arduino
`
1. https://ml-models.elastic.co/elser_model_2.metadata.json
2. https://ml-models.elastic.co/elser_model_2.pt
3. https://ml-models.elastic.co/elser_model_2.vocab.json
`AI写代码
对于优化版本,你的系统里需要以下文件:
arduino
`
1. https://ml-models.elastic.co/elser_model_2_linux-x86_64.metadata.json
2. https://ml-models.elastic.co/elser_model_2_linux-x86_64.pt
3. https://ml-models.elastic.co/elser_model_2_linux-x86_64.vocab.json
`AI写代码
markdown
`
1. $ pwd
2. /Users/liuxg/elastic/elasticsearch-9.2.1/config/models
3. $ wget https://ml-models.elastic.co/elser_model_2.metadata.json
4. --2025-12-02 13:52:20-- https://ml-models.elastic.co/elser_model_2.metadata.json
5. Resolving ml-models.elastic.co (ml-models.elastic.co)... 34.120.127.120
6. Connecting to ml-models.elastic.co (ml-models.elastic.co)|34.120.127.120|:443... connected.
7. HTTP request sent, awaiting response... 200 OK
8. Length: 621 [application/json]
9. Saving to: 'elser_model_2.metadata.json'
11. elser_model_2.metadata.json 100%[===============================================>] 621 --.-KB/s in 0s
13. 2025-12-02 13:52:21 (37.0 MB/s) - 'elser_model_2.metadata.json' saved [621/621]
15. $ wget https://ml-models.elastic.co/elser_model_2.pt
16. --2025-12-02 13:52:27-- https://ml-models.elastic.co/elser_model_2.pt
17. Resolving ml-models.elastic.co (ml-models.elastic.co)... 34.120.127.120
18. Connecting to ml-models.elastic.co (ml-models.elastic.co)|34.120.127.120|:443... connected.
19. HTTP request sent, awaiting response... 200 OK
20. Length: 438123914 (418M) [application/octet-stream]
21. Saving to: 'elser_model_2.pt'
23. elser_model_2.pt 100%[===============================================>] 417.83M 19.5MB/s in 24s
25. 2025-12-02 13:52:53 (17.1 MB/s) - 'elser_model_2.pt' saved [438123914/438123914]
27. $ wget https://ml-models.elastic.co/elser_model_2.vocab.json
28. --2025-12-02 13:53:12-- https://ml-models.elastic.co/elser_model_2.vocab.json
29. Resolving ml-models.elastic.co (ml-models.elastic.co)... 34.120.127.120
30. Connecting to ml-models.elastic.co (ml-models.elastic.co)|34.120.127.120|:443... connected.
31. HTTP request sent, awaiting response... 200 OK
32. Length: 329405 (322K) [application/json]
33. Saving to: 'elser_model_2.vocab.json'
35. elser_model_2.vocab.json 100%[===============================================>] 321.68K 433KB/s in 0.7s
37. 2025-12-02 13:53:13 (433 KB/s) - 'elser_model_2.vocab.json' saved [329405/329405]
38. $ pwd
39. /Users/liuxg/elastic/elasticsearch-9.2.1/config/models
40. $ ls
41. elser_model_2.metadata.json elser_model_2.pt elser_model_2.vocab.json
`AI写代码
使用 HTTP 服务器
INFO:如果你使用现有的 HTTP 服务器,要注意模型下载器只支持无密码的 HTTP 服务器。
你可以使用任意 HTTP 服务来部署 ELSER 。这个示例使用官方的 Nginx Docker 镜像来搭建一个新的 HTTP 下载服务。
1)下载模型工件文件。如上所示,下载上面的三个文件,并把他们放入到 config 目录下的 models 子目录下。
2)把文件放到你选择的某个子目录里。
3)运行以下命令:
bash
`
1. export ELASTIC_ML_MODELS="/path/to/models"
2. docker run --rm -d -p 8080:80 --name ml-models -v ${ELASTIC_ML_MODELS}:/usr/share/nginx/html nginx
`AI写代码
针对我的情况:
bash
`
1. export ELASTIC_ML_MODELS="/Users/liuxg/elastic/elasticsearch-9.2.1/config/models"
2. docker run --rm -d -p 8080:80 --name ml-models -v ${ELASTIC_ML_MODELS}:/usr/share/nginx/html nginx
`AI写代码
markdown
`
1. $ export ELASTIC_ML_MODELS="/Users/liuxg/elastic/elasticsearch-9.2.1/config/models"
2. $ docker run --rm -d -p 8080:80 --name ml-models -v ${ELASTIC_ML_MODELS}:/usr/share/nginx/html nginx
3. Unable to find image 'nginx:latest' locally
4. latest: Pulling from library/nginx
5. b89cf3ec7a3e: Pull complete
6. 2254fb813b11: Pull complete
7. 40b6fc5618c6: Pull complete
8. bb8ecb62799c: Pull complete
9. cc57e8335c98: Pull complete
10. cf9a807fe41d: Pull complete
11. 88770be1d442: Pull complete
12. Digest: sha256:553f64aecdc31b5bf944521731cd70e35da4faed96b2b7548a3d8e2598c52a42
13. Status: Downloaded newer image for nginx:latest
14. 9697b5bef2ffd721babcef106e723d2ffe3990235276ff29ce27325210b75afc
`AI写代码
别忘了把 /path/to/models 改成模型工件文件所在子目录的路径。
这些命令会启动一个带有 Nginx 服务器的本地 Docker 镜像,并把包含模型文件的子目录挂载进去。因为需要下载和构建 Docker 镜像,第一次启动可能会花更长时间,之后的运行会更快。
4)通过在浏览器中访问下面这个 URL 来验证 Nginx 是否正常运行:
arduino
`http://{IP_ADDRESS_OR_HOSTNAME}:8080/elser_model_2.metadata.json`AI写代码
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::c24:187e:e0e5:7cb6%en0 prefixlen 64 secured scopeid 0xe
6. inet 192.168.101.209 netmask 0xffffff00 broadcast 192.168.101.255
7. inet6 2408:8207:2495:24c1:e5:a50c:16e5:6aed prefixlen 64 autoconf secured
8. inet6 2408:8207:2495:24c1:d568:879a:8d00:583b prefixlen 64 autoconf temporary
9. inet6 2408:8207:2495:24c1:1451:2091:5ea6:3 prefixlen 64 dynamic
10. inet6 fe80::74cb:fcff:fee0:5914%awdl0 prefixlen 64 scopeid 0x10
11. inet6 fe80::74cb:fcff:fee0:5914%llw0 prefixlen 64 scopeid 0x11
12. inet6 fe80::893f:7412:e4ba:cb1e%utun0 prefixlen 64 scopeid 0x12
13. inet6 fe80::4192:8070:e906:4697%utun1 prefixlen 64 scopeid 0x13
14. inet6 fe80::2a44:3b1c:bca:64bc%utun2 prefixlen 64 scopeid 0x14
15. inet6 fe80::ce81:b1c:bd2c:69e%utun3 prefixlen 64 scopeid 0x15
16. inet 198.18.192.51 --> 198.18.192.51 netmask 0xfffff800
17. inet 10.211.55.2 netmask 0xffffff00 broadcast 10.211.55.255
18. inet6 fe80::80a9:97ff:fe43:7964%bridge100 prefixlen 64 scopeid 0x17
19. inet6 fdb2:2c26:f4e4::1 prefixlen 64
20. inet 10.37.129.2 netmask 0xffffff00 broadcast 10.37.129.255
21. inet6 fe80::80a9:97ff:fe43:7965%bridge101 prefixlen 64 scopeid 0x19
22. inet6 fdb2:2c26:f4e4:1::1 prefixlen 64` AI写代码

如果 Nginx 运行正常,你会看到模型的 metadata 文件内容。
5)在 config/elasticsearch.yml 文件中加入下面这一行,把你的 Elasticsearch 部署指向 HTTP 服务器上的模型工件:
arduino
`xpack.ml.model_repository: http://{IP_ADDRESS_OR_HOSTNAME}:8080`AI写代码

如果你使用你自己的 HTTP 或 HTTPS 服务器,请相应地修改地址。要确保写明协议("http://" 或 "https://")。确保所有具备 master 资格的节点都能访问你指定的服务器。
6)在所有具备 master 资格的节点上重复步骤 5。
7)逐个重启这些 master 资格节点。
8)在 Kibana 主菜单中进入 Trained Models 页面,或者使用全局搜索。你会在训练模型列表中看到 ELSER。

9)点击 Add trained model 按钮,选择你在步骤 1 下载并想部署的 ELSER 模型版本,然后点击 Download。所选模型会从你配置的 HTTP/HTTPS 服务器下载。



10)下载完成后,点击 Start deployment 按钮来启动部署。

11)填写一个 deployment ID,选择优先级,并设置 allocations 数量和每个 allocation 的线程数。

12)点击 Start。

HTTP 服务器只在下载模型时需要。下载完成后,你可以停止并删除这个服务。
在本示例中,你可以运行下面的命令来停止使用的 Docker 镜像:
arduino
`docker stop ml-models`AI写代码
markdown
`
1. $ docker stop ml-models
2. ml-models
3. $ docker ps
4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
`AI写代码
使用基于文件的访问
要使用基于文件的访问,请按以下步骤操作:
1)下载模型工件文件。我们可以按照上面的步骤来进行。
2)把这些文件放到 Elasticsearch 部署的 config 目录里的 models 子目录中。
bash
`
1. $ pwd
2. /Users/liuxg/elastic/elasticsearch-9.2.1/config/models
3. $ ls
4. elser_model_2.metadata.json elser_model_2.pt elser_model_2.vocab.json
`AI写代码
3)在 config/elasticsearch.yml 文件中加入下面这一行,把你的 Elasticsearch 部署指向这个模型目录:
bash
`xpack.ml.model_repository: file://${path.home}/config/models/`AI写代码

4)在所有具备 master 资格的节点上重复步骤 2 和步骤 3。
5)逐个重启这些 master 资格节点。
6)在 Kibana 主菜单中进入 Trained Models 页面,或者使用全局搜索。你会在训练模型列表中看到 ELSER。
7)点击 Add trained model 按钮,选择你在步骤 1 下载并想部署的 ELSER 模型版本,然后点击 Download。所选模型会从你在步骤 2 放置的模型目录中下载。
8)下载完成后,点击 Start deployment 按钮来启动部署。
9)填写一个 deployment ID,选择优先级,并设置 allocations 数量和每个 allocation 的线程数。
10)点击 Start。
测试 ELSER
你可以在 Kibana 中测试已部署的模型。进入主菜单的 Trained Models 页面,或者使用全局搜索,在训练模型列表中找到已部署的 ELSER 模型,然后在 Actions 菜单中选择 Test model。


你可以使用现有索引中的数据来测试模型。选择索引,然后选择要在其上测试 ELSER 的字段。输入搜索查询并点击 Test。使用与文档相关的查询可以更方便地评估模型的召回率。
结果会显示所选字段的十个随机值,以及每个文档与查询的相关性得分。得分越高,文档与查询的相关性越强。你可以点击 Reload examples 来重新加载示例文档。