ElasticSearch 8 Java客户端如何在_msearch查询中设置_source字段?
Elasticsearch Java客户端8.x实现_msearch时设置_source字段
在Elasticsearch Java客户端8.x中,_msearch(多查询)的每个子查询对应独立的SearchRequest实例,_source字段的配置需要在单个SearchRequest中设置,而非直接在MultisearchBody上操作,和你给出的原生JSON查询逻辑完全对应。
具体实现步骤与代码示例
- 创建带_source配置的单个查询请求
针对每个子查询,通过SearchRequest的.source()方法指定需要返回的字段(或排除的字段):
// 初始化Elasticsearch客户端(假设已完成客户端配置) ElasticsearchClient client = new ElasticsearchClient(new RestClientTransport( RestClient.builder(new HttpHost("localhost", 9200, "http")), new JacksonJsonpMapper() )); // 构建第一个子查询,设置_source仅返回personName字段 SearchRequest searchRequest1 = SearchRequest.of(s -> s .index("your_target_index") // 指定查询索引 .query(q -> q .bool(b -> b .must(m -> m.matchAll(mall -> mall)) // 你的查询条件 ) ) .size(10000) // 设置返回条数 .source(src -> src .includes("personName") // 指定需要返回的字段 // 若需要排除字段,可使用.excludes("unwanted_field") ) ); // 可按需创建多个类似的子查询请求 SearchRequest searchRequest2 = SearchRequest.of(s -> s .index("another_index") .query(q -> q.match(m -> m.field("age").query(30))) .source(src -> src.includes("personName", "age")) );
- 组装并执行多查询请求
将多个SearchRequest添加到MultisearchRequest中,执行后处理结果:
// 构建Multisearch请求 MultisearchRequest multiSearchRequest = MultisearchRequest.of(m -> m .operations(op -> op.search(searchRequest1)) .operations(op -> op.search(searchRequest2)) ); // 执行多查询 try { MultisearchResponse multiSearchResponse = client.msearch(multiSearchRequest); // 遍历处理每个子查询的结果 for (MultisearchResponse.Item item : multiSearchResponse.responses()) { if (item.isFailure()) { // 处理查询失败场景 System.err.println("子查询失败: " + item.failure().reason()); continue; } // 获取子查询的结果 SearchResponse<Object> result = item.result(); for (Hit<Object> hit : result.hits().hits()) { // 从_source中提取所需字段 Map<String, Object> sourceData = hit.source(); String personName = (String) sourceData.get("personName"); // 后续业务逻辑处理 System.out.println("查询到用户: " + personName); } } } catch (IOException e) { e.printStackTrace(); }
关键说明
- 每个子查询的
SearchRequest完全独立,可以单独配置_source、size、查询条件等参数,和原生JSON中每个查询块的结构一一对应。 - 如果需要全局统一配置
_source,可以封装一个工具方法来生成带默认_source配置的SearchRequest,避免重复代码。
内容的提问来源于stack exchange,提问作者maulik trapasiya
相关产品推荐
相关产品推荐

