You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust调用Elasticsearch Msearch API如何传入JSON获取200响应

Rust 版 Elasticsearch 客户端 Multi Search 请求构造方案

核心认知纠正

MsearchParts 枚举不承担请求体内容传递的职责,它仅用于指定 Multi Search 请求路径上绑定的默认索引范围,你提前拼接好的符合 Msearch 格式要求的 NDJSON 字符串,不需要转换为 MsearchParts 实例,直接作为请求体传入即可。

具体实现步骤

  • 构造 MsearchParts 实例
    • 如果所有搜索项都已经在请求体里单独指定了index字段,不需要全局默认索引,直接使用MsearchParts::None即可
    • 如果需要给未单独指定索引的搜索项设置全局默认索引,可根据场景选择对应变体:单索引用MsearchParts::Index(&["你的索引名"]),多索引传入索引名数组即可
  • 传入请求体发起调用
    客户端的msearch()方法支持两种请求体传参方式:
    1. 结构化构造:使用JsonBody传入按顺序排列的头、查询段数组,客户端会自动序列化为符合要求的 NDJSON 格式,自动处理末尾空行要求,不需要手动拼接字符串
    2. 直接传预拼接内容:如果你已经有可以通过 reqwest 正常发送的合法 NDJSON 字符串,直接转成字节数组传入即可

可运行参考代码

use elasticsearch::{Elasticsearch, MsearchParts, http::request::JsonBody};
use serde_json::{json, Value};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 按实际环境初始化ES客户端
    let client = Elasticsearch::default();

    // 构造MsearchParts,这里不需要全局默认索引,传None
    let msearch_parts = MsearchParts::None;

    // 构造搜索段,不需要手动拼字符串、加空行
    let search_keywords = vec!["Whiskers", "Chicken", "Turkey"];
    let mut body_segments = Vec::new();
    for keyword in search_keywords {
        // 单条搜索的头:指定索引
        body_segments.push(json!({"index": "cat_food"}));
        // 单条搜索的查询体
        body_segments.push(json!({
            "query": {
                "term": {
                    "name": {"term": keyword}
                }
            }
        }));
    }

    // 发起请求
    let resp = client
        .msearch(msearch_parts)
        .body(JsonBody::new(body_segments))
        // 若使用预拼接的NDJSON字符串,替换为下面这行即可
        // .body("你的合法NDJSON字符串".as_bytes())
        .send()
        .await?;

    // 校验响应
    assert!(resp.status_code().is_success());
    let result: Value = resp.json().await?;
    println!("查询结果: {:#?}", result);

    Ok(())
}

注意事项

Msearch 接口要求的NDJSON末尾空行不需要手动添加,不管是用JsonBody结构化传参还是直接传预拼接字符串,客户端会自动处理格式合规性,手动额外添加空行反而可能触发ES端的格式解析错误。

内容的提问来源于stack exchange,提问作者Xavi Font

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:39:29