当前位置: 首页 > news >正文

【Elasticsearch】昂贵算法与廉价算法

在 Elasticsearch 里,“昂贵”并不单指“CPU 时间”,而是综合了 **CPU、内存、磁盘 I/O、网络传输** 以及 **实现复杂度** 的代价。下面把常见“昂贵算法”拆开说:

1. **高计算密度的文本算法**  
• **match_phrase + slop**(带跨距的短语)  
• **span_near / span_first / span_or**(跨度查询)  
• **script_score** 自己写 Groovy/Painless(循环、数学函数、外部字段)  
代价:每条文档都要跑正则、循环或复杂数学,CPU 飙升。

2. **向量/距离计算**  
• **dense_vector + cosineSimilarity / dotProduct**  
• **knn search + 向量量化再打分**  
代价:一次向量运算 O(D)(D=维度),高维(512/1024) 再乘以 window_size=500 就十几万浮点乘法。

3. **机器学习/学习排序 (LTR)**  
• **rank_feature + xgboost 模型**  
• **自定义 feature、pair-wise loss**  
代价:每条文档要提取几十上百个特征 → 内存抖动 + JNI 调用。

4. **跨字段或跨索引 Join**  
• **has_child / has_parent / nested** 多层查询  
• **terms lookup** 从另一索引拉百万 ID 列表  
代价:大量随机磁盘读 + 网络序列化。

5. **大窗口二次脚本**  
把 window_size 调到 5 000 甚至 50 000,再跑上述任意算法,延迟直接秒级起步。

---

一句话判断“贵不贵”:  
**只要该算法在单条文档上的耗时 > 一次普通 BM25 match 的 5~10 倍,或需要额外内存/磁盘随机读,就可以称为“昂贵的算法”**——放到 rescore 里,只对 Top-N 跑,能把整体成本从 O(total_docs) 降到 O(window_size)。

一句话:  
**“不昂贵的算法” ≈ 只用倒排索引、不走复杂计算、不随机磁盘读、不额外占内存的查询——典型就是最简单的 BM25/TF-IDF 关键词匹配。**

具体看 Elasticsearch 里的“便宜”操作:

| 类型 | 例子 | 便宜原因 |
|---|---|---|
| **Term 级查询** | `term`, `terms`, `range`(数值/日期) | 直接查倒排列表,O(log N) 跳表 |
| **Match 查询** | `match` 默认 BM25 | 纯倒排 + 预计算 norm,无额外 CPU |
| **Filter 子句** | `bool.filter` | 只算位图交集,**不计分、可缓存** |
| **常量打分** | `constant_score` | 直接给固定 1.0 分,不走 BM25 |
| **小结果集聚合** | `terms` / `date_histogram` 结果 < 几万 | 位图遍历在内存完成 |

对照“昂贵”算法(向量、脚本、嵌套、跨字段 join…),它们要么 **逐条做复杂计算**,要么 **随机磁盘读**,要么 **内存膨胀**;而上面这些“便宜”操作几乎只靠 **倒排索引 + 位图/跳表**,CPU 和内存开销都极低。

http://www.lryc.cn/news/586012.html

相关文章:

  • 四、深度学习——CNN
  • 【SpringAI】7. 基于 milvus 的向量检索
  • Pandas-数据查看与质量检查
  • 华为 GaussDB :技术特性、应用局限与市场争议
  • TensorFlow2 study notes[2]
  • 【嵌入式硬件实例】-555定时器实现倍压电路
  • 【408考研知识点全面讲解计算机学科专业基础综合(408)】——数据结构之排序
  • 依赖注入的逻辑基于Java语言
  • 【第五节】部署http接口到ubuntu server上的docker内
  • Eplan API Scripts
  • Transforms
  • Spring Boot 整合 OAuth2 详细教程(适用于 2025 年 Spring Boot 3.x)
  • 力扣-19. 删除链表的倒数第N个节点
  • 什么是 Bootloader?怎么把它移植到 STM32 上?
  • 【6.1.3 漫画分布式锁】
  • 线程属性设置全攻略
  • 14. 请谈一下浏览器的强缓存和协商缓存
  • 9.2 埃尔米特矩阵和酉矩阵
  • Pandas 模块之数据的读取
  • arcgis投影后数据显示问题记录
  • 非程序员如何用 AI 提升日常工作效率:以产品经理为例的落地实践指南
  • error while loading shared libraries
  • 小架构step系列12:单元测试
  • [爬虫实战] 多进程/多线程/协程-异步爬取豆瓣Top250
  • Pytest 跳过测试技巧:灵活控制哪些测试该跑、哪些该跳过
  • linux系统mysql性能优化
  • H2在springboot的单元测试中的应用
  • 多 Agent 强化学习实践指南(一):CTDE PPO 在合作捕食者-猎物游戏中的应用详解
  • 引入了模块但没有使用”,会不会被打包进去
  • 【C++小白逆袭】内存管理从崩溃到精通的秘籍