我正在使用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值,而不是全部匹配?显然不是这样,但是我想知道是否有人可以解释这里发生的事情。
答案 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"