elasticsearch 在Elasticsearch嵌套查询中加载特定字段
文档似乎表明我可以返回字段的子集,而不是整个文档。这是我的密码:
elasticsearch 在Elasticsearch嵌套查询中加载特定字段,
elasticsearch,nest,
elasticsearch,Nest,文档似乎表明我可以返回字段的子集,而不是整个文档。这是我的密码: var result=client.Search(s=>s .Fields(f=>f.Title) .Query(q=>q .QueryString(qs=>qs .OnField(“头衔”) .Query(“the”)); 我正在“title”字段中搜索单词“the”,只想返回“title”。my result.Documents对象包含10个对象,每个对象都为空 我确实看到了我想要的值,但它在搜索响应中很深: result.
var result=client.Search(s=>s
.Fields(f=>f.Title)
.Query(q=>q
.QueryString(qs=>qs
.OnField(“头衔”)
.Query(“the”));
我正在“title”字段中搜索单词“the”,只想返回“title”。my result.Documents对象包含10个对象,每个对象都为空
我确实看到了我想要的值,但它在搜索响应中很深:
result.Hits[0]。Fields.FieldValues[0]
是否有更好的方法获取返回的“标题”字段列表?
我的数据映射(截断)如下所示
{
"myidex": {
"mappings": {
"myobject": {
"properties": {
"title": {
"type": "string"
},
"artists": {
"properties": {
"id": {
"type": "string",
"index": "not_analyzed",
"analyzer": "fullTerm"
},
"name": {
"type": "string",
"index": "not_analyzed",
"analyzer": "fullTerm"
}
}
}
}
}
}
}
}
我的类对象如下所示:
[表格(“MyTable”)]
[可序列化]
[ElasticType(Name=“myobject”)]
公共类MyObject
{
[弹性特性]
公共字符串标题{get;set;}
[JsonIgnore]
公共字符串ArtistList{get;set;}
[ElasticProperty(Analyzer=“不区分大小写”)]
公开列表艺术家{get;set;}
}
[可序列化]
公共阶层人士
{
[ElasticProperty(Analyzer=“fullTerm”,Index=FieldIndexOption.未分析)]
公共字符串名称{get;set;}
[ElasticProperty(Analyzer=“fullTerm”,Index=FieldIndexOption.未分析)]
公共字符串Id{get;set;}
}
Artistslist来自我的数据源(sql),然后在为数据编制索引之前,我将其解析为一个新的列表对象。我认为这个深度嵌套的值改变了Elasticsearch 1.0以及部分字段现在作为数组返回的方式(有关详细信息,请参阅)。文件中对此进行了说明;在Fields()vs SourceIncludes()部分中。它显示了一个使用
FieldValue
helper方法访问这些值的示例。基于此,请尝试以下操作:
所有项目:
foreach(结果中的var hit.Hits)
{
var title=hit.Fields.FieldValue(f=>f.title);
}
对于特定项目:
var title=result.Hits.ElementAt(0)
.Fields.FieldValue(f=>f.Title);
我知道它仍然有点冗长,但它应该适合您,并将处理Elasticsearch 1.0的新数组返回格式。我在Nest的Github repo中找到了解决方案。他们制造了一个关于这个问题的问题。您应该使用FielddataFields而不是Fields
var result=client.Search(s=>s
.FielddataFields(f=>f.Title)
.Query(q=>q
.QueryString(qs=>qs
.OnField(“头衔”)
.Query(“the”));
作为回应,您可以看到FieldSelections。您可以获得所需的字段。您使用的是哪一版本的NEST?NEST和elasticsearch.net的预发布版本(通过nuget)。我相信这是1.0.0 Beta1如果你的
结果。文档对象为空,这可能是一个映射问题。你能把你的MyObject类定义添加到这个问题中吗。FieldValue
的语法将在下一个beta版本中更新,以减少冗余:看起来它可以工作,但代码无法编译。。。result.Hits[0].Fields.FieldValue(f=>f.Title)…无法对“System.Collections.Generic.IEnumerable”类型的表达式应用带[]的索引。如果您是正确的,我忘记了Hits
是一个IEnumerable,您需要对每个项进行foreach。我已经更新了答案。这是否意味着给出此示例的文档已过时。字段(p=>p.Id,p=>p.Name,p=>p.Followers.First().Name,…)是的,我认为文档已经过时了。
var result = client.Search<MyObject>(s => s
.FielddataFields(f => f.Title)
.Query(q => q
.QueryString(qs => qs
.OnField("title")
.Query("the"))));