【问题标题】:ElasticSearch NEST Executing raw Query DSLElasticSearch NEST 执行原始查询 DSL
【发布时间】:2017-05-21 17:22:54
【问题描述】:

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

使用 Nest.ElasticClient,有没有办法执行原始字符串查询? 在 vanilla 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 方法没有运气。

【问题讨论】:

    标签: elasticsearch .net-core nest elasticsearch-net


    【解决方案1】:

    NEST 不支持反序列化 Elasticsearch Query 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 也支持这种格式。
    【解决方案2】:

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

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

    希望对您有所帮助。

    【讨论】:

    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多