当前位置: 首页 > 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.xdnf.cn/news/1108153.html

相关文章:

  • 史上最全 MySQL 锁详解:从理论到实战,一篇搞定所有锁机制
  • 网络编程员工管理系统
  • 【数据分析】03 - Matplotlib
  • 【Elasticsearch 】search_throttled
  • 力扣-19. 删除链表的倒数第N个节点
  • Windows环境下解决Matplotlib中文字体显示问题的详细指南
  • Git入门教程
  • JVM与系统性能监控工具实战指南:从JVM到系统的全链路分析
  • 虚拟现实的镜廊:当技术成为存在之茧
  • Unity VR手术模拟系统架构分析与数据流设计
  • 深度学习图像分类数据集—害虫识别分类
  • [论文阅读] 人工智能 + 软件工程 | AI助力软件可解释性:从用户评论到自动生成需求与解释
  • JVM 类加载过程
  • Django母婴商城项目实践(四)
  • OpenEuler操作系统中检测插入的USB设备并自动挂载
  • perftest测试连接是否稳定shell脚本
  • Typecho博客系统与WebSocket实时通信整合指南
  • Ubuntu快速搭建QT开发环境指南,5000字解析!!
  • 前端note
  • 【Lucene/Elasticsearch】**Query Rewrite** 机制
  • RabbitMQ面试精讲 Day 1:RabbitMQ核心概念与架构设计
  • PostgreSQL HOT (Heap Only Tuple) 更新机制详解
  • [es自动化更新] Updatecli编排配置.yaml | dockerfilePath值文件.yml
  • AI之DL之VisualizationTool:ai-by-hand-excel的简介、安装和使用方法、案例应用之详细攻略
  • Redis过期策略与内存淘汰机制面试笔记
  • [es自动化更新] 策略体系 | 策略源(容器镜像)
  • Java中的方法传参机制
  • 【B题成品论文】2025APMCM亚太杯中文赛B题成品论文(无偿分享)
  • Java 大视界:基于 Java 的大数据可视化在智慧城市能源消耗动态监测与优化决策中的应用(2025 实战全景)
  • 舒尔特方格训练小游戏流量主微信小程序开源