如何用单个Elasticsearch查询关联两个索引获取目标字段?
实现单个查询获取跨索引关联值的方案
Elasticsearch本身不支持跨索引的直接关联查询(类似SQL的JOIN),但可以通过以下两种方式实现需求:
方式一:使用多搜索API(_msearch)
通过单次HTTP请求包含两次查询逻辑,虽然本质还是两次查询,但只需要一次API调用。示例请求如下:
POST /_msearch {"index": "index_a"} {"query": {"match": {"name": "pepsi"}}, "_source": ["id_b"]} {"index": "index_b"} {"query": {"terms": {"id": []}}, "_source": ["mapping"]}
操作逻辑:
- 第一个查询从
index_a中匹配name为"pepsi"的文档,提取id_b的值 - 将提取到的
id_b填入第二个查询的terms条件中,再从index_b中匹配对应id的文档,获取mapping字段值
方式二:使用Enrich Policy预处理数据
通过预先建立索引间的关联关系,之后就可以用单个查询直接获取结果:
步骤1:创建Enrich Policy
定义关联规则,将index_a的name和id_b关联起来:
PUT /_enrich/policy/index_a_enrich_policy { "match": { "indices": "index_a", "match_field": "name", "enrich_fields": ["id_b"] } }
步骤2:执行Policy
生成关联数据:
POST /_enrich/policy/index_a_enrich_policy/_execute
步骤3:给index_b添加关联字段
创建一个处理管道,将index_a的关联数据同步到index_b:
PUT /_ingest/pipeline/enrich_index_b { "processors": [ { "enrich": { "policy_name": "index_a_enrich_policy", "field": "id", "target_field": "enrich_data", "match_field": "id_b", "max_matches": 1 } } ] }
更新index_b所有文档,同步关联数据:
POST /index_b/_update_by_query?pipeline=enrich_index_b
步骤4:单个查询获取结果
之后直接查询index_b,通过关联字段匹配name即可获取mapping:
GET /index_b/_search { "_source": ["mapping"], "query": { "match": {"enrich_data.name": "pepsi"} } }
内容的提问来源于stack exchange,提问作者Whereismywall
相关产品推荐
相关产品推荐

