如何序列化Elasticsearch.Net客户端GET文档请求的对象类型的字段响应

llmtgqce  于 2023-04-11  发布在  ElasticSearch
关注(0)|答案(1)|浏览(139)

当我使用Elasticsearch.Net客户端进行Get文档请求时,我将_source设置为false并指定我想要返回的存储字段。我不想要_source,因为有大量内容,即使我排除它们,服务器仍然会将源加载到内存中以解析它,这非常慢,我不想要。
当我包含source时,我可以只指定对象类型,它会自动从_source反序列化。我如何使用Fields属性来实现这一点?它的类型是FieldValues:IsADictionaryBase〈string,LazyDocument〉

var response = await client.GetAsync<MyObject>(docId,
    s => s.Index(myIndex)
         .SourceEnabled(false)
         .StoredFields(new string[] { 
              "MyStringArray1", 
              "MyStringArray2", 
              "MyLongValue" }
          ));

我发现的唯一方法是手动迭代对象中的所有属性。

MyObject mine = new MyObject()
{
    MyStringArray1 = response.Fields["MyStringArray1"].As<string[]>(),
    MyStringArray2 = response.Fields["MyStringArray2"].As<string[]>(),
    MyLongValue = response.Fields.Value<long>("MyLongValue")
};

是否有更简单的方法来反序列化为MyObject类型?

okxuctiv

okxuctiv1#

要防止获取大数据,可以使用源筛选

var searchResponse = _client.Search<Project>(s => s
    .Source(sf => sf
        .Includes(i => i 
            .Fields(
                f => f.Name,
                f => f.StartedOn,
                f => f.Branches
            )
        )
        .Excludes(e => e 
            .Fields("num*") 
        )
    )
    .Query(q => q
        .MatchAll()
    )
);

使用这种方式,对象将自动序列化,并且所有排除的字段都将为空

相关问题