嵌套NEST Term()查询中的FirstOrDefault()有什么用途?

时间:2019-04-09 06:02:48

标签: .net elasticsearch nest

我正在使用NEST使用嵌套查询来查询ElasticSearch索引,并且一切正常,但是对于查询中一行代码的目的感到困惑。在继续之前,我将提供所有对象和查询本身。

这里是映射到索引"country"的对象。

  [ElasticsearchType(Name = "country")]
  public class CountrySearchDto : ISearchIndex {
    public int Id {get; set;}
    public string Name { get; set; }
    public string IsoCode {get; set;}
    public string CountryCode{get; set;}
    [Nested]
    public List<AreaSearchDto> Areas {get; set;}

  }
}

这里是映射到索引"area"的对象。

public class AreaSearchDto : ISearchIndex{
    public int Id {get; set;}
    public string Name { get; set; }
    public string GuideUrl { get; set; }    
  }

如您所见,country索引中嵌套了areas。我进行的查询用于按嵌套区域搜索“国家/地区”。

这是查询。

    var searchResults = await _searchClient.SearchAsync<CountrySearchDto>(s => s
        .Index("country")
        .Query(q => q
            .Nested(c => c
                .Path(p => p.Areas)
                .Query(nq => nq
                    .Term(t => t.Areas.FirstOrDefault().Name, searchTerm) // Where searchTerm is a string like "Sydney" or "London"
            ))
        )
    );

我了解嵌套查询的工作方式,并且正在正确获取所有需要的信息。但是这行代码在做什么?

.Term(t => t.Areas.FirstOrDefault().Name, searchTerm) // Where searchTerm is a string like "Sydney" or "London" 

FirstOrDefault()是否将查询限制为仅匹配第一个Areas值,而不是全部匹配?显然不是这样,但是我想知道是否有人可以解释这里发生的事情。

1 个答案:

答案 0 :(得分:1)

t => t.Areas.FirstOrDefault().Name是一个lambda表达式,它将解析为要在Elasticsearch查询中使用的字段名称。本身并不是执行,而是检索第一个区域名称的值,而是遍历以为术语查询所针对的字段名称建立一个字符串。正如aHochstein在评论中指出的那样,嵌套查询中的字词查询的目标是AreaSearchDto字段,作为从CountrySearchDto类型表示的文档根目录开始的路径,即搜索查询是适用于。使用lambda表达式执行遍历可让您利用类型。

searchTerm"searchTerm"中,生成的查询为

POST http://localhost:9200/country/country/_search
{
  "query": {
    "nested": {
      "path": "areas",
      "query": {
        "term": {
          "areas.name": {
            "value": "searchTerm"
          }
        }
      }
    }
  }
}

lambda表达式已被评估为字符串"areas.name"