将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询

Posted

技术标签:

【中文标题】将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询【英文标题】:Serialising an object to JSON, and then using that to send a query in elastic search using NEST 【发布时间】:2017-02-25 09:45:30 【问题描述】:

在使用 NEST 进行查询时,我感到有些困惑和沮丧,因为它似乎很受欢迎。使用标准 JSON 时查询没有问题,所以我想知道是否有某种方法可以使用 JSON 对象进行查询,我有以下代码

var query = "bkala";

var q = new

    query = new
    
        text = new
        
            _all = "jane"
        
    
;

var qJson = JsonConvert.SerializeObject(q);
var hits = client.Search<Users>(qJson);

但是,我收到错误“无法从类型字符串转换为 System.Func、Nest.ISearchRequest”

如果有人知道我如何简单地使用 JSON 对象进行查询,那就太好了,提前欢呼。

【问题讨论】:

我对 ElasticSearch 没有任何经验,但我认为您以错误的方式使用 API。搜索方法显然采用Func&lt;ISearchRequest&gt;,而您传递的是string。看看这里的文档:elastic.co/guide/en/elasticsearch/client/net-api/2.x/… 【参考方案1】:

NEST 和 Elasticsearch.Net 是 NEST 在幕后使用的低级客户端,可以灵活地查询您希望的查询方式。使用 NEST,您有几种不同的方式:

NEST - 高级客户端

1.Fluent API

var query = "bkala";

var searchResult = client.Search<MyDocument>(s => s
    .Query(q => q
        .Match(m => m
            .Field("_all")
            .Query(query)
        )
    )
);

如上所示,此 API 使用 lambda 表达式来定义一个流畅的接口,该接口模仿 Elasticsearch json API 和查询 DSL 的结构。

2.对象初始化语法

var query = "bkala";

var request = new SearchRequest<MyDocument>

    Query = new MatchQuery
       
        Field = "_all",
        Query = query
    
;

var searchResult = client.Search<MyDocument>(request);

如果您不喜欢 lambda 表达式,那么您始终可以使用特定的搜索类型来定义您的搜索。

Elasticsearch.Net - 低级客户端

如果您想使用匿名类型(根据您的问题)、json 字符串或查询的字节表示进行查询,则可以使用低级客户端 Elasticsearch.Net 来实现此目的。低级客户端通过.LowLevel属性暴露在高级客户端上

1.匿名类型

var query = new

    query = new
    
        match = new
        
            _all = new
            
                query = "bkala"
            
        
    
;

var searchResult = client.LowLevel.Search<SearchResponse<MyDocument>>(query);

在高级客户端上使用低级客户端意味着您仍然可以利用使用 Json.NET 来反序列化搜索结果;在这个例子中,可以通过searchResult.Body访问搜索响应

2.Json字符串

var query = @"

  ""query"": 
    ""match"": 
      ""_all"": 
        ""query"": ""bkala""
      
    
  
";

var searchResult = client.LowLevel.Search<SearchResponse<MyDocument>>(query);

3.Byte 数组

var bytes = new byte[]  123, 13, 10, 32, 32, 34, 113, 117, 101, 114, 121, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 34, 109, 97, 116, 99, 104, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 34, 95, 97, 108, 108, 34, 58, 32, 123, 13, 10, 32, 32, 32, 32, 32, 32, 32, 32, 34, 113, 117, 101, 114, 121, 34, 58, 32, 34, 98, 107, 97, 108, 97, 34, 13, 10, 32, 32, 32, 32, 32, 32, 125, 13, 10, 32, 32, 32, 32, 125, 13, 10, 32, 32, 125, 13, 10, 125 ;

var searchResult = client.LowLevel.Search<SearchResponse<MyDocument>>(bytes);

以上所有方法都会产生以下查询


  "query": 
    "match": 
      "_all": 
        "query": "bkala"
      
    
  

查看Getting started guide on the github repo 和documentation on the Elastic website。我们一直在努力改进文档,对于您认为我们缺乏的领域,我们非常欢迎 PR :)

【讨论】:

以上是关于将对象序列化为 JSON,然后使用 NEST 在弹性搜索中发送查询的主要内容,如果未能解决你的问题,请参考以下文章

将对象序列化为 JSON

将 PHP 对象图序列化/反序列化为 JSON

Unity 将嵌套字典序列化为 JSON

Newton.JSON将数字序列化为枚举项[重复]

使用spring boot将JSON反序列化为带有通用对象列表的POJO

使用 ElasticSearch Nest 索引动态对象 - *** 异常