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 @@ | @@ -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,7 +994,8 @@ | ||
| 994 | "type": "dense_vector", | 994 | "type": "dense_vector", |
| 995 | "dims": 1024, | 995 | "dims": 1024, |
| 996 | "index": true, | 996 | "index": true, |
| 997 | - "similarity": "dot_product" | 997 | + "similarity": "dot_product", |
| 998 | + "element_type": "bfloat16" | ||
| 998 | }, | 999 | }, |
| 999 | "image_embedding": { | 1000 | "image_embedding": { |
| 1000 | "type": "nested", | 1001 | "type": "nested", |
| @@ -1003,7 +1004,8 @@ | @@ -1003,7 +1004,8 @@ | ||
| 1003 | "type": "dense_vector", | 1004 | "type": "dense_vector", |
| 1004 | "dims": 1024, | 1005 | "dims": 1024, |
| 1005 | "index": true, | 1006 | "index": true, |
| 1006 | - "similarity": "dot_product" | 1007 | + "similarity": "dot_product", |
| 1008 | + "element_type": "bfloat16" | ||
| 1007 | }, | 1009 | }, |
| 1008 | "url": { | 1010 | "url": { |
| 1009 | "type": "text" | 1011 | "type": "text" |
| @@ -1017,7 +1019,8 @@ | @@ -1017,7 +1019,8 @@ | ||
| 1017 | "type": "dense_vector", | 1019 | "type": "dense_vector", |
| 1018 | "dims": 512, | 1020 | "dims": 512, |
| 1019 | "index": true, | 1021 | "index": true, |
| 1020 | - "similarity": "dot_product" | 1022 | + "similarity": "dot_product", |
| 1023 | + "element_type": "bfloat16" | ||
| 1021 | }, | 1024 | }, |
| 1022 | "url": { | 1025 | "url": { |
| 1023 | "type": "text" | 1026 | "type": "text" |