首页
看点啥
插画图片
首页 科技看点 Elasticsearch 多索引关联何时能用 LOOKUP JOIN?

Elasticsearch 多索引关联何时能用 LOOKUP JOIN?

2026-11-06 0

事件和负责人分别存储时,能否按主机名关联取决于查询入口。用单节点测试对照 SQL 解析结果和 ES|QL 返回行。

1. Elasticsearch SQL 的通用 JOIN 会被拒绝

准备普通索引 demo-events 与 lookup 索引 demo-owners。两边的 host_key 都声明为 keyword。事件写入 api 和 cache 各一条,负责人写入两条 api 记录。请在独立测试节点操作。

PUT demo-events
{"mappings":{"properties":{"event_id":{"type":"integer"},"host_key":{"type":"keyword"}}}}

PUT demo-owners
{"settings":{"index.mode":"lookup"},"mappings":{"properties":{"host_key":{"type":"keyword"},"team":{"type":"keyword"}}}}

PUT demo-events/_doc/1?refresh=true
{"event_id":1,"host_key":"api"}

PUT demo-events/_doc/2?refresh=true
{"event_id":2,"host_key":"cache"}

PUT demo-owners/_doc/1?refresh=true
{"host_key":"api","team":"platform"}

PUT demo-owners/_doc/2?refresh=true
{"host_key":"api","team":"runtime"}
POST /_sql
{"query":"SELECT e.event_id, o.team FROM \"demo-events\" e JOIN \"demo-owners\" o ON e.host_key = o.host_key"}
SQL 的 JOIN 请求返回解析错误
本机 Elasticsearch 9.2.0 HTTP 实测响应

常规搜索会在相关分片各自执行查询,再汇总命中。两个索引独立分片时,同一关联键的数据可能落在不同节点。任意关联还需要移动或缓存参与匹配的数据,并处理结果扩张。Elasticsearch SQL 在这里拒绝语句。父子关联走另一条路径,父子文档要在同一索引,并通过路由落到同一分片。

2. 用 ES|QL 查询 lookup 索引

保持两边数据不变,改走 ES|QL。右侧已在创建时设为 lookup 模式。

POST /_query
{"query":"FROM demo-events | LOOKUP JOIN demo-owners ON host_key | KEEP event_id, host_key, team | SORT event_id, team"}
ES|QL 返回两条匹配记录和一条空值记录
本机 Elasticsearch 9.2.0 HTTP 实测响应

api 对上两个负责人,事件 1 展开成两行。cache 没有匹配,事件 2 保留且 team 为 null。这是左关联行为。需要输出一行时,先让右侧每个关联键唯一,或按业务规则聚合匹配结果。

只想检索多个索引时用多索引搜索。经常给事件补充少量可更新字段时,用 ES|QL 查询 lookup 索引。若查询经常依赖固定的关联字段,可考虑写入时冗余,并明确后续如何同步更新。

喜欢(0)

上一篇

这项技术多久能落地到日常开发?可用产物和工程成熟度

这项技术多久能落地到日常开发?可用产物和工程成熟度

下一篇

微信支付仿真订单怎样确认支付和退款都成功?

微信支付仿真订单怎样确认支付和退款都成功?
猜你喜欢