ElasticSearch NEST 执行原始查询 DSL

标签 elasticsearch .net-core nest elasticsearch-net

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

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

{
    "query": {
        "fuzzy": { "title": "potato" }
    }
}

在我的 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'.

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

最佳答案

NEST 不支持反序列化 Elasticsearch 查询 DSL 的短格式 "field_name": "your_value",但它支持长格式 "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);
}

作为Rob has answered , NEST 也支持 supplying a raw json string as a query

关于ElasticSearch NEST 执行原始查询 DSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44079076/

相关文章:

elasticsearch - NEST API GeoShapes字段的默认值

elasticsearch - Elasticsearch:请求[/some index/_refresh]包含无法识别的参数:[refresh]

elasticsearch - 在具有多个节点的Elasticsearch中创建快照时出现“Read-only file system”错误

elasticsearch - 使用ElasticSearch存储数据而无需编制索引或进行分析(NEST客户端)

c# - dotnet core 2.0 中的库获取 FileNotFoundexception

amazon-web-services - 使用 AmazonLambdaClient 时,Localstack 无法在 us-east-1 以外的任何区域内找到 lambda 函数

c# - 从QueryContainer删除重复的UserID(字段)

c# - NEST是否会在Elasticsearch或客户端中进行投影?

mysql - 如何连接Mysql和logstash?

c# - 使用 ASP.NET Core DI 注入(inject)工厂 Func