知其然,知其所以然
Elasticsearch 2026-10-01

function_score 自定义评分

本机真实配两条function_score规则(featured权重2、on_sale权重3),score_mode=sum时同时满足两条件的文档得分真实2+3=5.0精确累加。换成score_mode=max后,同样的文档得分真实变成3.0,跟只满足一个条件的文档完全一样——真实丢失了双重命中这个信息。boost_mode=replace下未命中任何规则的文档真实退化成中性值1.0。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

script_score 的性能边界

本机真实对10万条文档测script_score,便宜脚本稳定6-10ms,昂贵的1000次sqrt循环脚本真实飙到1358-1445ms,差约150倍。真实用200个源码各不相同的内联脚本连续查询,第151个真实触发编译限制报错'max:[150/5m]'。改成params参数化脚本后200次真实全部成功,一次编译限制都没触发。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

Runtime Field 的查询成本

本机真实配runtime field(price_dollars由price_cents实时计算),range查询真实耗时12-32ms,等价的真正索引字段range查询只要0-2ms,差10到20倍。真实验证精确命中数两边完全一致(10001),证明runtime field不是牺牲正确性换速度,纯粹是写入零成本和查询开销之间的权衡。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

Query Cache 与 Request Cache

本机真实对30万条文档的聚合查询反复请求,默认request cache稳定0ms,关闭后变1-3ms,_stats精确记录hit_count=3。真实最意外的发现:同一个term过滤条件连续用了40多次,query_cache的hit_count真实始终是0——证明query cache依赖Lucene自适应策略判断是否值得缓存,不是用了就一定缓存,不像request cache那样确定性命中。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

Profile API 分析慢查询

本机真实构造bool.filter查询混合便宜的status精确匹配和昂贵的开头通配符code匹配,总耗时2-28ms。用profile:true拆解,TermQuery(status)真实只用93583纳秒,MultiTermQueryConstantScoreBlendedWrapper(code通配符)真实吃掉3003456纳秒,占94%以上——精确定位出真正的性能瓶颈。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

Multi Search 批量查询

本机真实对比20条独立查询:挨个发起总耗时18.07ms,每条服务端执行都是0ms;打包成1次_msearch只要6.42ms,快约2.8倍,省下的全是HTTP往返开销。真实验证错误隔离:3条查询里塞1条写错类型的range查询,真实只有那一条报错,前后两条正常返回完全不受影响。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

Async Search 长时间查询

本机真实提交对5万条文档跑2000次sqrt循环的昂贵查询到_async_search,只等1ms真实拿到is_running:true和id,查询在后台继续跑。1秒后轮询真实is_running变false,结果已算好。真实删除后再查同一个id,直接404 resource_not_found_exception,证明结果是有生命周期需显式管理的服务端资源。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

查询超时与取消

本机真实对昂贵script_score查询设timeout=1ms,真实timed_out:true但took实际190ms远超设定预算,timeout在检查点才生效而非瞬时截止,返回的是已算出的部分结果。真实用_tasks找到正在跑的查询task id并_cancel,任务状态变cancelled:true,客户端真实收到400 task_cancelled_exception——这才是真正彻底的中途终止。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

查询缓存为什么可能不命中

本机真实把上一篇query cache测试规模加大到300多次,换bool.filter和constant_score两种标准写法,关掉request_cache排除干扰,结果真实一模一样:query_cache统计全是0。真实对比带now的动态range和固定日期range,两者真实都没能触发缓存——说明查询缓存是否命中真实无法仅凭查询语法形态和重复次数预判,要看真实的_stats数字。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

大量 should 条件对查询性能的影响

本机真实对20万条文档的bool查询把should子句从1个加到1000个,耗时真实从0-1ms涨到46-63ms,非线性增长。真实把子句堆到4096个还能正常执行(36ms),4097个真实直接被拒绝,报错精确写'maxClauseCount is set to 4096'——Lucene硬编码上限,建议改用terms查询代替大量should子句。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

exists 查询与空字段判断

本机真实索引5篇文档(有值/没写字段/null/空数组[]/空字符串''),exists查询真实只命中有值和空字符串''两篇——空字符串被判定为存在。must_not+exists反过来查,真实命中了没写字段、null、空数组三篇,三种语义不同的空值被exists统一归为不存在。

Elasticsearch 真实验证 动画演示
Elasticsearch 2026-10-01

Metric Aggregation 与 Bucket Aggregation

本机真实对6件商品跑avg这个metric聚合,只返回一个孤零零的数值116.67。换成terms按category分组,真实产出3个桶(electronics/books/toys),每桶能继续嵌套avg算出均价。真实往avg里硬塞子聚合,直接400报错'cannot accept sub-aggregations'——metric聚合坍缩成单一数值不接受嵌套,bucket聚合产出文档子集可以无限嵌套。

Elasticsearch 真实验证 动画演示
京ICP备2026067502号-1京公网安备11010502063487号