我一直在使用“scroll”从 Python 中的 ES 索引(v 8.6.2)获取数据序列。
由于各种原因,我想更改为reqwest
使用 Rust (PyO3) 执行请求,而不是requests
使用 Python 执行请求。我的第一个要求是:
let es_url = "https://localhost:9500"; // ES server is using this port
let data = json!({
"size": 100,
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [
{
"term": {
"ldoc_type": "docx_doc"
}
}
]
}
},
});
let data_string = serde_json::to_string(&data).unwrap();
let url = format!("{es_url}/{}/_search?scroll=1m", INDEX_NAME.read().unwrap());
let send_result = reqwest_client
.post(url)
.header("Content-type", "application/json")
.body(data_string)
.basic_auth("mike12", Some("mike12"))
.send();
let response = match send_result {
Ok(response) => response,
Err(e) => {
error!("SEND error was {}", e);
return false
},
};
let text = match response.text() {
Ok(text) => text,
Err(e) => {
error!("TEXT error was {}", e);
return false
},
};
let json_hashmap: HashMap<String, Value> = serde_json::from_str(&text).unwrap();
let scroll_id = &json_hashmap["_scroll_id"];
let scroll_id_str = scroll_id.to_string();
let scroll_id_str = rem_first_and_last(&scroll_id_str); // strip "\"" either side
info!("|{:#?}| type {}", scroll_id_str, utilities::str_type_of(&scroll_id_str));
...这显示返回的&str
“滚动 ID”。一个典型的例子是:
“==”
...这很奇怪,因为这个id字符串大约是我使用Python时得到的ID字符串的4倍长。但上面的字符串虽然看起来有一定的重复字符,但实际上并不是较小字符串的重复。
之后,为了重复请求以获得更多批次的 100 个点击,我这样做:
let mut n_loops = 0;
loop {
n_loops += 1;
let data = json!({
"scroll": "1m",
"scroll_id": scroll_id_str,
});
let data_string = serde_json::to_string(&data).unwrap();
let url = format!("{es_url}/_search?scroll");
let send_result = reqwest_client
.post(url)
.header("Content-type", "application/json")
.body(data_string)
.basic_auth("mike12", Some("mike12"))
.send();
let response = match send_result {
Ok(response) => response,
Err(e) => {
error!("SEND error was {}", e);
return false
},
};
info!("response {:?} type {}", response, utilities::str_type_of(&response));
let response_status = response.status();
...这是我收到 400“错误请求”的地方。我最初怀疑是滚动 ID 错误。在Python中,等效的“后续”“滚动”请求工作正常。
在您的第二次调用中,URL 错误。而不是这个
应该是这个