【问题标题】:Run elastic search raw query with Nest使用 Nest 运行弹性搜索原始查询
【发布时间】:2018-11-09 21:08:20
【问题描述】:

我正在尝试使用 Nest.Net 库在弹性搜索上运行原始查询。 查询如下:

var json4 = @"
                    {
                      ""query"": {
                        ""bool"": {
                                    ""filter"":{
                                        ""term"":{ ""schoolId"": ""c15677ea-3e1e-4767-936a-2b3c57b00503""}
                                    },
                          ""must"": [
                            {
                              ""multi_match"": {
                                ""query"": ""001 Ali"",
                                ""fields"": [""firstName"",""lastName"", ""phoneNumber"",  ""code"", ""title""],
                                ""type"":  ""cross_fields""
                              }
                    }
                          ]
                        }
                      }
                    }
            ";

        SearchRequest searchRequest;
        using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json4)))
        {
            searchRequest = client.RequestResponseSerializer.Deserialize<SearchRequest>(stream);
        }

Deserialize 方法报错如下:

无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.IEnumerable`1[Nest.QueryContainer]' 因为该类型需要 JSON 数组(例如 [1 ,2,3]) 以正确反序列化。 要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 路径“query.bool.filter.term”,第 6 行,位置 51。

查询在 kibana 中运行良好。

谢谢

【问题讨论】:

  • 什么版本的 NEST?
  • 版本为5.6.0
  • 5.6.0 在IElasticClient 上没有RequestResponseSerializer 属性。您使用的是 6.x 版本吗?

标签: elasticsearch nest


【解决方案1】:

NEST 反序列化仅支持长形式的查询,即

  • boolquery filter 子句必须是查询数组;它不支持传递对象的键是查询的对象
  • 不支持term 查询短格式"term": { "field": "value" };格式必须为 "term": { "field" : { "value": "value" } }

以下方法可行

var json4 = @"
    {
      ""query"": {
        ""bool"": {
          ""filter"":[
            { ""term"":{ ""schoolId"": { ""value"": ""c15677ea-3e1e-4767-936a-2b3c57b00503""}} }
          ],
          ""must"": [
            {
              ""multi_match"": {
                ""query"": ""001 Ali"",
                ""fields"": [""firstName"",""lastName"", ""phoneNumber"",  ""code"", ""title""],
                ""type"":  ""cross_fields""
              }
            }
          ]
        }
      }
    }
";

SearchRequest searchRequest;
using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(json4)))
{
    searchRequest = client.Serializer.Deserialize<SearchRequest>(stream);
}

但是,NEST 能够接受 JSON 字符串形式的查询,并使用暴露为 .LowLevel 属性的低级别客户端返回强类型搜索响应。这样,就无需将 JSON 字符串反序列化为 SearchRequest,只需在提交请求时将其序列化回 JSON。此外,您可以使用您拥有的原始查询

var json4 = @"
    {
      ""query"": {
        ""bool"": {
          ""filter"": { 
            ""term"":{ ""schoolId"": ""c15677ea-3e1e-4767-936a-2b3c57b00503"" } 
          },
          ""must"": [
            {
              ""multi_match"": {
                ""query"": ""001 Ali"",
                ""fields"": [""firstName"",""lastName"", ""phoneNumber"",  ""code"", ""title""],
                ""type"":  ""cross_fields""
              }
            }
          ]
        }
      }
    }
";

client.LowLevel.Search<SearchResponse<object>>("index", "type", json4);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 2019-09-07
    相关资源
    最近更新 更多