Commit 52ae85fbf8c65620b2f533ddfef7d0d29c63d01e

Authored by tangwang
1 parent 648cb4c2

1. ES docs

2. 修改索引配置: 向量改为bf16
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
docs/ES/ES_9 0 → 100644
... ... @@ -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"
... ...