使用Nest

时间:2018-05-30 22:54:43

标签: elasticsearch nest

我正在尝试使用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对象反序列化的数组或List。 JsonObjectAttribute也可以添加到类型中以强制它从JSON对象反序列化。 路径'query.bool.filter.term',第6行,第51位。

查询在kibana中正常运行。

由于

1 个答案:

答案 0 :(得分:1)

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

  • bool query 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);