使用nest进行elasticsearch如何根据子对象属性搜索父对象

qoefvg9y  于 2021-06-15  发布在  ElasticSearch
关注(0)|答案(1)|浏览(376)

我正在尝试做一个简单的搜索,使用nest搜索给定特定客户位置的客户。POCO包括:

class Customer
{
    public int CustomerId { get; set; }
    public string CustomerName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Identifiers { get; set; }
    public string isIndividual { get; set; }
    public double Balance { get; set; }
    public List<CustomerLocation> Locations { get; set; }

class CustomerLocation
{
    public int CustomerLocationId { get; set; }
    public string StreetLine1 { get; set; }
    public string Streetline2 { get; set; }
    public string City { get; set; }

}

目前我正在使用此搜索例程-但它失败了:

var searchResponse = _client.Search<Customer>(s => s
                   .Query(q => q
                        .HasChild<CustomerLocation >(hp => hp
                            .Query(qq => qq
                                .Match(m => m
                                    .Field(f => f.City )
                                    .Query(queryText)
                                )

                            )
                         )
                     )
                   .Size(500)
                    );

提供的错误消息是:
system.exception hresult=0x80131500 message=搜索无效。错误是:从失败的(400)低级调用生成的无效嵌套响应:/customers/\u search?typed\u keys=true

此api调用的审核跟踪:

[1] 嗅探启动:时间:00:00:00.2448689
[2] 成功:节点:http://localhost:9200/拍摄时间:00:00:00.2288784
[3] pingsuccess:节点:http://127.0.0.1:9200/拍摄时间:00:00:00.0029899
[4] 错误响应:节点:http://127.0.0.1:9200/拍摄时间:00:00:00.1639172

originalexception:elasticsearch.net.elasticsearchclientexception:远程服务器返回错误:(400)错误请求。。呼叫:状态码400来自:post/customers/\u search?typed\u keys=true。servererror:type:search\u phase\u execution\u exception原因:“all shard failed”-->system.net.webexception:远程服务器返回错误:(400)错误请求。

在c:\users\russc\source\elasticsearch net\src\elasticsearch.net\connection\httpwebrequestconnection.cs中的system.net.httpwebrequest.getresponse()处,请求[treresponse](requestdata requestdata):第63行
任何想法-非常感谢。

bq3bfh9z

bq3bfh9z1#

客户和地点之间的关系在elasticsearch术语中不是父/子关系,这是使用 has_child 查询。
除非显式Map,否则 Locations 上的属性 Customer 将是一个 object 类型Map,它允许您

var queryText = "Sydney";

var searchResponse = client.Search<Customer>(s => s
    .Query(q => q
       .Match(m => m
           .Field(f => f.Locations.First().City)
           .Query(queryText)
       )
    )
    .Size(500)
);

注: f => f.Locations.First().City 它只是一个表达式,通过导航对象图,以强类型方式构建到json字段的路径。它不是指“第一个地点的城市”,而是指“任何地点的城市”。
这将生成以下查询

{
  "query": {
    "match": {
      "locations.city": {
        "query": "Sydney"
      }
    }
  },
  "size": 500
}

但是,对于给定的poco结构,您可能希望跨多个位置属性进行搜索。那样的话, Locations 应显式Map为 nested 数据类型。
当Map为嵌套数据类型时,查询将

var queryText = "Sydney";

var searchResponse = client.Search<Customer>(s => s
    .Query(q => q
        .Nested(n => n
            .Path(p => p.Locations)
            .Query(nq => nq
                .Match(m => m
                    .Field(f => f.Locations.First().City)
                    .Query(queryText)
                )
            )
        )
    )
    .Size(500)
);

相关问题