5个不稳定版本

0.3.2 2024年4月1日
0.3.1 2023年11月7日
0.3.0 2023年9月14日
0.2.0 2023年9月6日
0.1.0 2023年8月31日

#146 in HTTP客户端

每月21次下载

MIT 许可证

58KB
1K SLoC

RSolr

Rust的Solr客户端。

Rsolr 提供了操作和向Solr服务器发送请求的能力,包含一些快捷操作,并支持一些分面功能和查询构建器。它使用reqwest http客户端的阻塞版本。

选择

您可以以实现了 CloneDeserialize 的类型检索文档。

use serde_json::Value;
use rsolr::Client;
use rsolr::error::RSolrError;
use rsolr::solr_result::SolrResponse;

fn query_all() -> Result<SolrResponse<Value>, RSolrError> {
    let result = Client::new("http://solr:8983", "collection")
        .select("*:*")
        .run::<Value>();
    match result {
        Ok(solr_result) => Ok(solr_result.expect("Request is OK, but no response; in select it's a failure on Solr side.")),
        Err(e) => Err(e)
    }
}

上传JSON文档

您应该使用实现了 CloneSerialize 的类型。


use serde::Serialize;
use serde_json::Value;
use rsolr::Client;

#[derive(Serialize, Clone)]
struct SimpleDocument {
    field: Vec<String>
}

fn upload() {
    let document = SimpleDocument { field: vec!("nice".to_string(), "document".to_string()) };
    Client::new("http://solr:8983", "collection")
        .upload_json(document)
        .run().expect("request failed.");
}

删除

use serde_json::Value;
use rsolr::Client;
fn delete() {
    Client::new("http://solr:8983", "collection")
        .delete("delete:query")
        .run::<Value>().expect("panic, request failed.");
}

带有参数的自定义处理程序

您也可以定义任何处理程序。


use serde_json::Value;
use rsolr::Client;
use rsolr::error::RSolrError;
use rsolr::solr_result::SolrResponse;
fn more_like_this()  -> Result<SolrResponse<Value>, RSolrError> {
    let result = Client::new("http://solr:8983", "collection")
        .request_handler("mlt")
        .add_query_param("mlt.fl", "similarity_field")
        .add_query_param("mlt.mintf", "4")
        .add_query_param("mlt.minwl", "3")
        .run::<Value>();
    match result {
        Ok(solr_result) => Ok(solr_result.expect("Request is OK, but no response; in select it's a failure on Solr side.")),
        Err(e) => Err(e)
    }
}

基于游标的分页

可以使用 solr游标 逐个获取分页结果。

use serde_json::Value;
use rsolr::Client;
use rsolr::solr_response::SolrResponse;
fn cursor_fetch_all_pages() -> Vec<SolrResponse<Value>> {
    let mut responses = Vec::new();
    let mut client = Client::new("http://solr:8983", "collection");
    let result = client
        .select("*:*")
        .sort("id asc")
        .cursor()
        .run();
    let mut cursor = result.expect("request failed").expect("no cursor");
    while cursor.next::<Value>().expect("request failed").is_some() {
        responses.push(cursor.get_response::<Value>().expect("parsing failed"));
    }
    responses
}

开发

我使用 Cargo Run Script 来设置和管理本地Solr,指定使用最新版本的Solr以保持更新。支持Solr 8+。您还需要一个 Docker。检出后,应运行

cargo run-script solr-start
cargo run-script solr-provision

现在您可以在 https://127.0.0.1:8983 上访问本地Solr。为了测试,我创建了一个没有任何schema定义的默认集合。实际上,这意味着所有值默认都是 多值

依赖项

~6–21MB
~286K SLoC