elasticsearch,nest,dto,C#,Performance,elasticsearch,Nest,Dto" /> elasticsearch,nest,dto,C#,Performance,elasticsearch,Nest,Dto" />

C# 嵌套项目是在elasticsearch中还是在客户端中?

C# 嵌套项目是在elasticsearch中还是在客户端中?,c#,performance,elasticsearch,nest,dto,C#,Performance,elasticsearch,Nest,Dto,如果我在elasticsearch中索引了一个复杂的文档,并使用DTO对其进行查询,那么在将数据发送到C#客户端之前,是否会在elasticsearch中应用DTO所需字段的投影,或者是否会发送完整的源代码,C#将使用该数据来补充DTO var response=wait elasticClient.SearchAsync(searchRequest) 基本上,我需要知道我是否可以简单地请求一个TDto,而不必担心被索引的更大的ComplexDocument的数据量,或者我是否必须在search

如果我在elasticsearch中索引了一个复杂的文档,并使用DTO对其进行查询,那么在将数据发送到C#客户端之前,是否会在elasticsearch中应用DTO所需字段的投影,或者是否会发送完整的源代码,C#将使用该数据来补充DTO

var response=wait elasticClient.SearchAsync(searchRequest)


基本上,我需要知道我是否可以简单地请求一个
TDto
,而不必担心被索引的更大的
ComplexDocument
的数据量,或者我是否必须在
searchRequest
中指定
Source
包含/排除以获得最佳性能,Elasticsearch将为每次搜索命中发回完整的
\u源文件。您可以指定要包含/排除的
\u source
的哪些字段

var client=new ElasticClient();
var searchResponse=client.Search(s=>s
.Source(sf=>sf
.包括(i=>i
.Field(f=>f.Path)
.Field(f=>f.Content)
)
.ExcludeAll()
)
);
foreach(searchResponse.Documents中的var源)
{
var path=source.path;
}
哪个发送

{
    "_source": {
        "excludes": ["*"],
        "includes": ["path", "content"]
    }
}
或者您可以要求根本不返回
\u source

var searchResponse=client.Search(s=>s
.来源(假)
);
通过源代码过滤,Elasticsearch侧的
\u source
存储字段将被完全读取,并应用过滤。这通常很好,但是如果
\u source
是一个巨大的文档,并且您只想返回字段子集以响应搜索,那么您可能会决定使用它

顾名思义,存储字段是单独存储到
\u source
的字段(通过在映射中指定
store:true
),可以在搜索响应中返回

var searchResponse = client.Search<ComplexDocument>(s => s
    .StoredFields(f => f
        .Field(ff => ff.Path)
    )
);

foreach(var fields in searchResponse.Fields)
{
    var path = fields.ValueOf<ComplexDocument, string>(f => f.Path);
}
发送

{
“_来源”:{
“包括”:[“路径”]
}
}

您试过了吗?NEST是一个非常简单的库,所以我希望他们会按照您提供的方式发送您的请求,并且不会进行任何类型的自动字段选择。@StephenCleary不,我没有尝试过。使用检查等设置测试场景需要时间。我通常会问一些没有回应的问题,因为这些问题很难回答。所以我想我应该问一个“简单”的问题,看看这样是否有帮助。肯定有人知道这个问题的答案,我想..我很确定答案是NEST将检索整个文档,然后在客户机上进行投影。但不确定是否能将此评论变成答案。:)回答得很好。谢谢!:)我不能使用存储字段,因为我必须搜索其中的一些数据,即使我不需要在所有情况下都返回这些数据。扩展方法似乎很有前途。如果我只想包含嵌套类型的一部分,我假设我必须扩展它。但这是一个很好的起点。