elasticsearch NEST QueryContainer从JSON查询反序列化

wsewodh2  于 2023-06-21  发布在  ElasticSearch
关注(0)|答案(1)|浏览(157)

我有一个使用Elastic NEST SDK的C# API。我的Elastic版本是v8.4,它将Elastic搜索查询作为JSON请求。
我尝试使用这个JSON请求和索引名称创建NEST请求对象SearchRequest<T>
这是我的助手方法,它试图将JSON请求反序列化为QueryContainer,但它总是返回空QueryContainer,导致搜索没有查询。

public static SearchRequest<T> GetSearchRequestFromJson<T>(string json, string indexName) where T : class
{
    var request = new SearchRequest<T>(indexName);
    request.Query = JsonConvert.DeserializeObject<QueryContainer>(json);
    return request;
}

查看其他示例,他们手动MapJSON请求,但请求是动态的,因此我希望尽可能避免基于JSON请求的任何手动对象示例化
最好的做法是什么?我需要重构并使用低级客户端来支持JSON请求吗?

ycl3bljg

ycl3bljg1#

您可以使用NEST的低级功能来处理动态JSON请求,而不是直接将JSON请求反序列化为QueryContainer对象。这种方法允许您使用原始JSON,而不需要手动对象示例化。
下面是一个示例,说明如何修改helper方法以使用低级客户端:

{
var request = new SearchRequest<T>(indexName);
request.RawQuery = new RawJson(json);
return request;

}
在这个修改后的方法中,我们没有将JSON反序列化到QueryContainer中,而是使用NEST中的RawJson类将原始JSON请求分配给SearchRequest对象的RawQuery属性。这样,JSON查询将按原样发送到ElasticSearch,而无需任何额外的Map或反序列化。
通过使用RawQuery属性,您可以处理动态JSON请求,而无需手动对象示例化或Map。这种方法利用了NEST的低级客户端功能,并允许您直接使用原始JSON查询。
请记住使用适当的ElasticSearch版本正确配置和初始化您的NEST客户端,以确保兼容性。

相关问题