C# 嵌套项目是在elasticsearch中还是在客户端中?
如果我在elasticsearch中索引了一个复杂的文档,并使用DTO对其进行查询,那么在将数据发送到C#客户端之前,是否会在elasticsearch中应用DTO所需字段的投影,或者是否会发送完整的源代码,C#将使用该数据来补充DTOC# 嵌套项目是在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
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将检索整个文档,然后在客户机上进行投影。但不确定是否能将此评论变成答案。:)回答得很好。谢谢!:)我不能使用存储字段,因为我必须搜索其中的一些数据,即使我不需要在所有情况下都返回这些数据。扩展方法似乎很有前途。如果我只想包含嵌套类型的一部分,我假设我必须扩展它。但这是一个很好的起点。