elasticsearch 在Elasticsearch嵌套查询中加载特定字段,elasticsearch,nest,elasticsearch,Nest" /> elasticsearch 在Elasticsearch嵌套查询中加载特定字段,elasticsearch,nest,elasticsearch,Nest" />

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"))));