Commit 52ae85fbf8c65620b2f533ddfef7d0d29c63d01e
1 parent
648cb4c2
1. ES docs
2. 修改索引配置: 向量改为bf16
Showing
14 changed files
with
378 additions
and
3 deletions
Show diff stats
docs/ES/1_ES安装.md renamed to docs/ES/ES_8.18/1_ES安装.md
docs/ES/1_ES配置和使用.md renamed to docs/ES/ES_8.18/1_ES配置和使用.md
docs/ES/2_kibana安装.md renamed to docs/ES/ES_8.18/2_kibana安装.md
docs/ES/3.1_hanlp安装.md renamed to docs/ES/ES_8.18/3.1_hanlp安装.md
docs/ES/3.2_jieba插件安装.md renamed to docs/ES/ES_8.18/3.2_jieba插件安装.md
docs/ES/3.3_ik分词器.md renamed to docs/ES/ES_8.18/3.3_ik分词器.md
docs/ES/3_ansj分词插件安装.md renamed to docs/ES/ES_8.18/3_ansj分词插件安装.md
docs/ES/4_索引和查询测试.md renamed to docs/ES/ES_8.18/4_索引和查询测试.md
docs/ES/README__ES查询相关.md renamed to docs/ES/ES_8.18/README__ES查询相关.md
docs/ES/README__分词相关.md renamed to docs/ES/ES_8.18/README__分词相关.md
docs/ES/README__性能优化.md renamed to docs/ES/ES_8.18/README__性能优化.md
docs/ES/install.sh renamed to docs/ES/ES_8.18/install.sh
| ... | ... | @@ -0,0 +1,372 @@ |
| 1 | + | |
| 2 | +### 目标说明 | |
| 3 | + | |
| 4 | +**Ubuntu 单机单节点服务器**上安装 **Elasticsearch 9.3.1(9.x 最新小版本)** 的安装与基础调优文档。 | |
| 5 | + | |
| 6 | +- 不依赖 GPU(只用 CPU + bfloat16 向量) | |
| 7 | +- 使用官方 APT 源安装,自动带上自带的 JDK(满足 9.3 的要求) | |
| 8 | +- 适用于 Ubuntu 20.04/22.04/24.04 等常见版本 | |
| 9 | +- 单机单节点模式:`discovery.type: single-node` | |
| 10 | + | |
| 11 | +--- | |
| 12 | + | |
| 13 | +### 1. 系统与前置检查 | |
| 14 | + | |
| 15 | +- 操作系统:`Ubuntu 20.04+`(推荐 22.04 / 24.04) | |
| 16 | +- 需要 root 或 `sudo` 权限 | |
| 17 | +- 确保系统时间正确、网络能访问 `artifacts.elastic.co` | |
| 18 | + | |
| 19 | +```bash | |
| 20 | +lsb_release -a # 查看 Ubuntu 版本 | |
| 21 | +curl -I https://artifacts.elastic.co | |
| 22 | +``` | |
| 23 | + | |
| 24 | +--- | |
| 25 | + | |
| 26 | +### 2. 添加 Elasticsearch 9.x 官方 APT 仓库 | |
| 27 | + | |
| 28 | +#### 2.1 导入 GPG 公钥 | |
| 29 | + | |
| 30 | +```bash | |
| 31 | +sudo mkdir -p /usr/share/keyrings | |
| 32 | + | |
| 33 | +wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch \ | |
| 34 | + | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg | |
| 35 | +``` | |
| 36 | + | |
| 37 | +#### 2.2 添加 9.x APT 源 | |
| 38 | + | |
| 39 | +```bash | |
| 40 | +echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/9.x/apt stable main" \ | |
| 41 | + | sudo tee /etc/apt/sources.list.d/elastic-9.x.list | |
| 42 | +``` | |
| 43 | + | |
| 44 | +#### 2.3 更新包索引 | |
| 45 | + | |
| 46 | +```bash | |
| 47 | +sudo apt-get update | |
| 48 | +``` | |
| 49 | + | |
| 50 | +--- | |
| 51 | + | |
| 52 | +### 3. 安装 Elasticsearch 9.3.1 | |
| 53 | + | |
| 54 | +默认 `apt install elasticsearch` 会安装当前 9.x 仓库里的最新小版本(例如 9.3.1)。 | |
| 55 | + | |
| 56 | +```bash | |
| 57 | +sudo apt-get install elasticsearch | |
| 58 | +``` | |
| 59 | + | |
| 60 | +安装完成后,可以确认版本: | |
| 61 | + | |
| 62 | +```bash | |
| 63 | +/usr/share/elasticsearch/bin/elasticsearch --version | |
| 64 | +# 预期显示: 9.3.1 ... | |
| 65 | +``` | |
| 66 | + | |
| 67 | +> 说明: | |
| 68 | +> - 安装包自带并使用自己的 JDK(目前为 22),不依赖系统的 OpenJDK 17。 | |
| 69 | +> - 不需要自己配置 `JAVA_HOME`,除非有特殊需求。 | |
| 70 | + | |
| 71 | +--- | |
| 72 | + | |
| 73 | +### 4. 基础配置(单机单节点) | |
| 74 | + | |
| 75 | +编辑 `elasticsearch.yml`(路径 `/etc/elasticsearch/elasticsearch.yml`),调整最基本的选项: | |
| 76 | + | |
| 77 | +```bash | |
| 78 | +sudo vim /etc/elasticsearch/elasticsearch.yml | |
| 79 | +``` | |
| 80 | + | |
| 81 | +常用设置示例(仅示意关键行): | |
| 82 | + | |
| 83 | +```yaml | |
| 84 | +cluster.name: searchengine-cluster | |
| 85 | +node.name: node-1 | |
| 86 | + | |
| 87 | +network.host: 0.0.0.0 | |
| 88 | +http.port: 9200 | |
| 89 | + | |
| 90 | +# 单机开发用(生产集群请改成多节点配置) | |
| 91 | +discovery.type: single-node | |
| 92 | + | |
| 93 | +# 安全相关(按你当前 8.18 的做法决定是否开) | |
| 94 | +xpack.security.enabled: false | |
| 95 | +``` | |
| 96 | + | |
| 97 | +> 如果后续扩展为多节点集群,需要去掉 `discovery.type: single-node`,并按官方文档配置 `cluster.initial_master_nodes`、`seed_hosts` 等参数。 | |
| 98 | + | |
| 99 | +--- | |
| 100 | + | |
| 101 | +### 5. 使用 bfloat16 半精度向量的注意事项 | |
| 102 | + | |
| 103 | +- **前提:必须是 Elasticsearch 9.3+**。 | |
| 104 | +- 你的项目中,9.3 集群创建索引时,要使用已修改过的 `mappings/search_products.json`(`dense_vector` 增加 `element_type: "bfloat16"`)。 | |
| 105 | +- 在这台新机器的 9.3 集群上: | |
| 106 | + - 创建索引时用 bfloat16 版 mapping; | |
| 107 | + - 从 MySQL 重新同步数据。 | |
| 108 | + | |
| 109 | +这一部分是应用层的事,和 ES 安装本身无冲突,只要确保 **老 8.18 集群继续用原 mapping,新 9.3 集群用新 mapping** 即可。 | |
| 110 | + | |
| 111 | +--- | |
| 112 | + | |
| 113 | +### 6. 启动与开机自启 | |
| 114 | + | |
| 115 | +#### 6.1 手动启动 / 停止 | |
| 116 | + | |
| 117 | +```bash | |
| 118 | +# 启动 | |
| 119 | +sudo systemctl start elasticsearch | |
| 120 | + | |
| 121 | +# 查看状态 | |
| 122 | +sudo systemctl status elasticsearch | |
| 123 | + | |
| 124 | +# 停止 | |
| 125 | +sudo systemctl stop elasticsearch | |
| 126 | +``` | |
| 127 | + | |
| 128 | +#### 6.2 设置开机自启 | |
| 129 | + | |
| 130 | +```bash | |
| 131 | +sudo systemctl enable elasticsearch | |
| 132 | +``` | |
| 133 | + | |
| 134 | +--- | |
| 135 | + | |
| 136 | +### 7. 验证服务是否正常 | |
| 137 | + | |
| 138 | +#### 7.1 本机访问 | |
| 139 | + | |
| 140 | +```bash | |
| 141 | +curl http://127.0.0.1:9200 | |
| 142 | +``` | |
| 143 | + | |
| 144 | +预期返回类似: | |
| 145 | + | |
| 146 | +```json | |
| 147 | +{ | |
| 148 | + "name" : "node-1", | |
| 149 | + "cluster_name" : "searchengine-cluster", | |
| 150 | + "cluster_uuid" : "...", | |
| 151 | + "version" : { | |
| 152 | + "number" : "9.3.1", | |
| 153 | + ... | |
| 154 | + }, | |
| 155 | + "tagline" : "You Know, for Search" | |
| 156 | +} | |
| 157 | +``` | |
| 158 | + | |
| 159 | +#### 7.2 远程访问(如有) | |
| 160 | + | |
| 161 | +如果你在 `elasticsearch.yml` 里把 `network.host` 配成了 `0.0.0.0`,且机器安全组 / 防火墙允许 9200 端口,被访问方可以: | |
| 162 | + | |
| 163 | +```bash | |
| 164 | +curl http://<es-server-ip>:9200 | |
| 165 | +``` | |
| 166 | + | |
| 167 | +--- | |
| 168 | + | |
| 169 | +### 8. Kibana 9.x 安装与配置(单机) | |
| 170 | + | |
| 171 | +> 说明:Kibana 版本必须与 Elasticsearch 大版本一致,这里以 9.3.1 为例,使用同一个 9.x APT 仓库。 | |
| 172 | + | |
| 173 | +#### 8.1 安装 Kibana | |
| 174 | + | |
| 175 | +前面已经添加了 `elastic-9.x` APT 源,这里直接安装 Kibana: | |
| 176 | + | |
| 177 | +```bash | |
| 178 | +sudo apt-get install kibana | |
| 179 | +``` | |
| 180 | + | |
| 181 | +安装完成后,可通过下面命令查看版本(可选): | |
| 182 | + | |
| 183 | +```bash | |
| 184 | +/usr/share/kibana/bin/kibana --version | |
| 185 | +``` | |
| 186 | + | |
| 187 | +#### 8.2 Kibana 基础配置 | |
| 188 | + | |
| 189 | +编辑 `kibana.yml`(默认路径 `/etc/kibana/kibana.yml`),至少确认以下几项: | |
| 190 | + | |
| 191 | +```bash | |
| 192 | +sudo vim /etc/kibana/kibana.yml | |
| 193 | +``` | |
| 194 | + | |
| 195 | +常用示例(单机、关闭安全的开发环境): | |
| 196 | + | |
| 197 | +```yaml | |
| 198 | +server.host: "0.0.0.0" # 允许外部访问,如只本机用可改为 "localhost" | |
| 199 | +server.port: 5601 | |
| 200 | + | |
| 201 | +elasticsearch.hosts: ["http://127.0.0.1:9200"] # 指向本机 ES | |
| 202 | + | |
| 203 | +# 如果 ES 开启了 xpack.security,需要在这里配置账号密码 | |
| 204 | +# elasticsearch.username: "kibana_system" | |
| 205 | +# elasticsearch.password: "your_password" | |
| 206 | +``` | |
| 207 | + | |
| 208 | +> 生产环境建议: | |
| 209 | +> - 打开 Elasticsearch 的安全功能(`xpack.security.enabled: true`),用官方向导生成用户和证书; | |
| 210 | +> - Kibana 使用 `kibana_system` 用户连接 ES,并通过 HTTPS 访问; | |
| 211 | +> - `server.host` 不要暴露为 0.0.0.0,配合防火墙 / 反向代理限制访问来源。 | |
| 212 | + | |
| 213 | +#### 8.3 启动与开机自启 Kibana | |
| 214 | + | |
| 215 | +```bash | |
| 216 | +# 启动 Kibana | |
| 217 | +sudo systemctl start kibana | |
| 218 | + | |
| 219 | +# 查看状态 | |
| 220 | +sudo systemctl status kibana | |
| 221 | + | |
| 222 | +# 设置开机自启 | |
| 223 | +sudo systemctl enable kibana | |
| 224 | +``` | |
| 225 | + | |
| 226 | +#### 8.4 验证 Kibana 访问 | |
| 227 | + | |
| 228 | +浏览器访问: | |
| 229 | + | |
| 230 | +```text | |
| 231 | +http://<kibana-server-ip>:5601 | |
| 232 | +``` | |
| 233 | + | |
| 234 | +如果 ES 未启用安全,首次打开一般会直接进入 Kibana 首页; | |
| 235 | +如果启用了安全机制,将提示登录,使用你在 ES 初始化时创建的账号密码(如 `elastic` 用户)。 | |
| 236 | + | |
| 237 | +--- | |
| 238 | + | |
| 239 | +### 9. 与现有 SearchEngine 项目集成 | |
| 240 | + | |
| 241 | +在这台新机器上跑你的 SearchEngine 项目时: | |
| 242 | + | |
| 243 | +- 环境变量或配置里的 ES 地址需要指向这台机器,例如: | |
| 244 | + - `ES_HOST=http://127.0.0.1:9200` | |
| 245 | +- 按你项目已有脚本执行索引初始化和数据导入(在 9.3 上推荐使用 bfloat16 版 mapping): | |
| 246 | + - 创建索引:使用 `mappings/search_products.json`(bfloat16 版本) | |
| 247 | + - 执行你现有的数据导入脚本:`./scripts/ingest.sh <tenant_id> true` 或 `python main.py ingest ...` | |
| 248 | + | |
| 249 | +--- | |
| 250 | + | |
| 251 | +### 10. 常见问题提示 | |
| 252 | + | |
| 253 | +- **端口 9200 无法访问** | |
| 254 | + - 检查 `systemctl status elasticsearch` 是否正常运行; | |
| 255 | + - 检查 `network.host` 是否配置为可访问地址; | |
| 256 | + - 检查防火墙(`ufw`、安全组)是否放行 9200。 | |
| 257 | +- **版本不是 9.3.1** | |
| 258 | + - 确认你添加的是 `https://artifacts.elastic.co/packages/9.x/apt`; | |
| 259 | + - `apt-cache policy elasticsearch` 查看当前仓库里的版本;如有旧版本仓库,需要清理旧的 `elastic-*.list` 文件。 | |
| 260 | + | |
| 261 | +--- | |
| 262 | + | |
| 263 | +### 11. 性能与系统配置优化(单机节点) | |
| 264 | + | |
| 265 | +> 以下为单机节点在物理机 / 大内存云主机上的推荐基础调优,参考了 8.18 版本的线上配置。具体数值请根据机器内存大小和实际压测结果微调。 | |
| 266 | + | |
| 267 | +#### 10.1 JVM 堆内存设置 | |
| 268 | + | |
| 269 | +编辑 `jvm.options`(或单独的 options 文件),为 ES 分配合适的堆内存,一般建议: | |
| 270 | + | |
| 271 | +- 堆内存占物理内存的 1/2 左右,但不要超过 32GB | |
| 272 | +- 例如 64GB 物理内存的机器: | |
| 273 | + | |
| 274 | +```bash | |
| 275 | +sudo vim /etc/elasticsearch/jvm.options | |
| 276 | +``` | |
| 277 | + | |
| 278 | +示例(根据实际内存调整): | |
| 279 | + | |
| 280 | +```text | |
| 281 | +-Xms32g | |
| 282 | +-Xmx32g | |
| 283 | +``` | |
| 284 | + | |
| 285 | +修改完成后需要重启 Elasticsearch 生效。 | |
| 286 | + | |
| 287 | +#### 10.2 Elasticsearch 内部缓存相关配置 | |
| 288 | + | |
| 289 | +在 `/etc/elasticsearch/elasticsearch.yml` 中,根据机器内存和查询特征,控制 fielddata 与 query cache 占比,例如: | |
| 290 | + | |
| 291 | +```yaml | |
| 292 | +# Fielddata Cache(主要用于排序、聚合) | |
| 293 | +indices.fielddata.cache.size: 40% # 占物理内存的 40% 上限 | |
| 294 | + | |
| 295 | +# Query Cache(用于相同过滤条件的命中缓存) | |
| 296 | +indices.queries.cache.size: 30% # 占堆内存的 30% 上限 | |
| 297 | +``` | |
| 298 | + | |
| 299 | +对于你当前的电商搜索场景,如果聚合比较多(分类 / 规格分面等),可以适当提高 fielddata cache;如果过滤条件组合多而重复率不高,可以适当降低 query cache。 | |
| 300 | + | |
| 301 | +#### 10.3 内核参数(sysctl)优化 | |
| 302 | + | |
| 303 | +编辑 `/etc/sysctl.conf`,追加如下内容(来自现有 8.18 生产配置,可直接沿用到 Ubuntu): | |
| 304 | + | |
| 305 | +```bash | |
| 306 | +sudo vim /etc/sysctl.conf | |
| 307 | +``` | |
| 308 | + | |
| 309 | +推荐配置示例: | |
| 310 | + | |
| 311 | +```text | |
| 312 | +# tangwang - Elasticsearch 内核参数优化 | |
| 313 | +# 最大文件句柄数 | |
| 314 | +fs.file-max = 1000000 | |
| 315 | + | |
| 316 | +# 允许的 VMA 数量(映射的虚拟内存区域,用于 mmap 索引文件) | |
| 317 | +vm.max_map_count = 655360 | |
| 318 | + | |
| 319 | +# 脏页写回相关(削峰写入) | |
| 320 | +vm.dirty_ratio = 10 | |
| 321 | +vm.dirty_background_ratio = 5 | |
| 322 | +vm.dirty_writeback_centisecs = 200 | |
| 323 | +vm.dirty_expire_centisecs = 6000 | |
| 324 | + | |
| 325 | +# inode cache 回收权重 | |
| 326 | +vm.vfs_cache_pressure = 200 | |
| 327 | + | |
| 328 | +# 尽可能少用 swap(内存充裕环境建议 0) | |
| 329 | +vm.swappiness = 0 | |
| 330 | +``` | |
| 331 | + | |
| 332 | +修改后执行: | |
| 333 | + | |
| 334 | +```bash | |
| 335 | +sudo sysctl -p | |
| 336 | +``` | |
| 337 | + | |
| 338 | +#### 10.4 文件句柄与进程数限制(limits.conf) | |
| 339 | + | |
| 340 | +编辑 `/etc/security/limits.conf`,为所有用户(特别是运行 ES 的用户)提升文件描述符和进程数上限: | |
| 341 | + | |
| 342 | +```bash | |
| 343 | +sudo vim /etc/security/limits.conf | |
| 344 | +``` | |
| 345 | + | |
| 346 | +示例(参考现有 8.18 配置): | |
| 347 | + | |
| 348 | +```text | |
| 349 | +# tangwang - ES 资源限制调优 | |
| 350 | +* soft nofile 655350 | |
| 351 | +* hard nofile 655350 | |
| 352 | +root soft nofile 655350 | |
| 353 | +root hard nofile 655350 | |
| 354 | + | |
| 355 | +* soft nproc 102400 | |
| 356 | +* hard nproc 409600 | |
| 357 | + | |
| 358 | +# 允许进程锁定内存(配合后续如需 mlockall 等) | |
| 359 | +* soft memlock unlimited | |
| 360 | +* hard memlock unlimited | |
| 361 | +``` | |
| 362 | + | |
| 363 | +修改完成后,建议重新登录终端 / 重启服务,使新的 limits 生效。 | |
| 364 | + | |
| 365 | +#### 10.5 单机节点模式小结 | |
| 366 | + | |
| 367 | +单机单节点模式下,最关键的是: | |
| 368 | + | |
| 369 | +- 在 `elasticsearch.yml` 中设置 `discovery.type: single-node`,避免 ES 等待集群选主; | |
| 370 | +- 为 ES 分配足够的堆和系统资源(JVM 堆 + sysctl + limits); | |
| 371 | +- 使用 bfloat16 向量字段,减小内存与磁盘占用,有利于在线搜索性能; | |
| 372 | +- 通过你现有的压测脚本(搜索 QPS / 延迟、批量索引速度)验证上述参数,在此基础上微调即可。 | ... | ... |
mappings/search_products.json
| ... | ... | @@ -994,7 +994,8 @@ |
| 994 | 994 | "type": "dense_vector", |
| 995 | 995 | "dims": 1024, |
| 996 | 996 | "index": true, |
| 997 | - "similarity": "dot_product" | |
| 997 | + "similarity": "dot_product", | |
| 998 | + "element_type": "bfloat16" | |
| 998 | 999 | }, |
| 999 | 1000 | "image_embedding": { |
| 1000 | 1001 | "type": "nested", |
| ... | ... | @@ -1003,7 +1004,8 @@ |
| 1003 | 1004 | "type": "dense_vector", |
| 1004 | 1005 | "dims": 1024, |
| 1005 | 1006 | "index": true, |
| 1006 | - "similarity": "dot_product" | |
| 1007 | + "similarity": "dot_product", | |
| 1008 | + "element_type": "bfloat16" | |
| 1007 | 1009 | }, |
| 1008 | 1010 | "url": { |
| 1009 | 1011 | "type": "text" |
| ... | ... | @@ -1017,7 +1019,8 @@ |
| 1017 | 1019 | "type": "dense_vector", |
| 1018 | 1020 | "dims": 512, |
| 1019 | 1021 | "index": true, |
| 1020 | - "similarity": "dot_product" | |
| 1022 | + "similarity": "dot_product", | |
| 1023 | + "element_type": "bfloat16" | |
| 1021 | 1024 | }, |
| 1022 | 1025 | "url": { |
| 1023 | 1026 | "type": "text" | ... | ... |