ElasticSearch NEST 执行原始查询 DSL

Mic*_*icG 4 elasticsearch nest elasticsearch-net .net-core

我正在尝试在 API 中创建最简单的代理,以在 ElasticSearch 节点上执行搜索。代理存在的唯一原因是从 API 端点“隐藏”凭证和抽象 ES。

使用 Nest.ElasticClient,有没有办法执行原始字符串查询?在 vanilla ES 中有效的示例查询:

{
    "query": {
        "fuzzy": { "title": "potato" }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的 API 中,我尝试将原始字符串反序列化为 SearchRequest,但失败了。我假设它不能反序列化该字段:

var req = m_ElasticClient.Serializer.Deserialize<SearchRequest>(p_RequestBody);
var res = m_ElasticClient.Search<T>(req);
return m_ElasticClient.Serializer.SerializeToString(res);

System.InvalidCastException: Invalid cast from 'System.String' to 'Newtonsoft.Json.Linq.JObject'.
Run Code Online (Sandbox Code Playgroud)

有没有办法将原始字符串查询转发给 ES 并返回字符串响应?我尝试使用 LowLevel.Search 方法但没有运气。

Rob*_*Rob 5

是的,您可以使用 NEST 执行此操作,请查看以下内容

var searchResponse = client.Search<object>(s => s
        .Type("type").Query(q => q.Raw(@"{""match_all"":{}}")));
Run Code Online (Sandbox Code Playgroud)

希望有帮助。


Rus*_*Cam 5

NEST 不支持反序列化"field_name" : "your_value"Elasticsearch Query DSL的短格式,但它支持长格式"field_name" : { "value" : "your_value" },因此以下工作

var client = new ElasticClient();

var json = @"{
    ""query"": {
        ""fuzzy"": { 
            ""title"": {
                ""value"": ""potato""
            }
        }
    }
}";

SearchRequest searchRequest;
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json)))
{
    searchRequest = client.Serializer.Deserialize<SearchRequest>(stream);
}
Run Code Online (Sandbox Code Playgroud)

正如Rob 回答的那样,NEST 还支持提供原始 json 字符串作为查询