一尘不染

将对象序列化为JSON,然后使用该对象通过NEST在elasticsearch中发送查询

elasticsearch

在使用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对象进行查询,那就太好了,先加油打气。


阅读 372

收藏
2020-06-22

共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.杰森弦

var query = @"
{
  ""query"": {
    ""match"": {
      ""_all"": {
        ""query"": ""bkala""
      }
    }
  }
}";

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

3.字节数组

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"
      }
    }
  }
}

请查看github存储库上入门指南以及Elastic网站上的文档。我们一直在努力改善文档,在您认为我们缺乏的领域,PR受到了欢迎:)

2020-06-22