elasticsearch,nest,.net,elasticsearch,Nest" /> elasticsearch,nest,.net,elasticsearch,Nest" />

.net 有没有一种方法可以在没有额外循环的情况下反序列化搜索结果上的脚本字段值?

.net 有没有一种方法可以在没有额外循环的情况下反序列化搜索结果上的脚本字段值?,.net,elasticsearch,nest,.net,elasticsearch,Nest,我需要在.net代码中使用,以便在Elasticsearch上运行一些查询逻辑。他说: 可以使用类似的方法在响应上访问脚本字段 到存储的字段 为了检索脚本字段结果,我似乎需要在结果上循环(如建议或所示)。我希望避免这种循环,并以某种方式在调用NEST的client.search()时获取数据,该调用已经填充了一个结果列表。可能吗 这是我的电话: public async Task<List<SomeObj>> GetSomeDocsFromEs() {

我需要在.net代码中使用,以便在Elasticsearch上运行一些查询逻辑。他说:

可以使用类似的方法在响应上访问脚本字段 到存储的字段

为了检索脚本字段结果,我似乎需要在结果上循环(如建议或所示)。我希望避免这种循环,并以某种方式在调用NEST的client.search()时获取数据,该调用已经填充了一个结果列表。可能吗

这是我的电话:

    public async Task<List<SomeObj>> GetSomeDocsFromEs()
    {
        var result = await client.SearchAsync<SomeObj>(s => s
            .Index(...)
            .Query(...)
            .Size(...)
            .From(...)
            .Sort(...)
            .ScriptFields(sf => sf
                     .ScriptField("StoredField1", sc => sc
                        .Source(some Painless script)
                     )
                     .ScriptField("StoredField2", sc => sc
                        .Source(some Painless script)
                     )
                     .ScriptField("StoredField3", sc => sc
                        .Source(some Painless script)
                      )
                )
            .StoredFields(sf => sf
                    .Fields(
                            f => f.StoredField1,
                            f => f.StoredField2,
                            f => f.StoredField3
                    )
                )
            .Source(so => so
                .Includes(i => i
                    .Fields(f => f.SkuEntry.Field1,
                            f => f.SkuEntry.Field2,
                            f => f.SkuEntry.Field3
                    )
                )
            )
        );

        return result.Documents.ToList();
    }
公共异步任务GetSomeDocsFromEs() { var result=await client.SearchAsync(s=>s .索引(…) .Query(…) .尺寸(…) .来自(…) .Sort(…) .ScriptFields(sf=>sf .ScriptField(“StoredField1”,sc=>sc .Source(一些无痛脚本) ) .ScriptField(“StoredField2”,sc=>sc .Source(一些无痛脚本) ) .ScriptField(“StoredField3”,sc=>sc .Source(一些无痛脚本) ) ) .StoredFields(sf=>sf .菲尔德( f=>f.StoredField1, f=>f.StoredField2, f=>f.StoredField3 ) ) .Source(so=>so .包括(i=>i .Fields(f=>f.SkuEntry.Field1, f=>f.SkuEntry.Field2, f=>f.SkuEntry.Field3 ) ) ) ); 返回result.Documents.ToList(); } 我希望避免这种循环,并以某种方式在调用NEST的client.search()时获取数据,该调用已经填充了一个结果列表。可能吗

对于命中数组中的每个命中,脚本字段都会返回,因此无法避免循环命中

示例中的
result.Documents
映射到每个文档的
\u source
字段,该字段是发送到Elasticsearch并编制索引的原始JSON对象。它是
result.Hits.Select(h=>h.Source.ToList()
的一种方便快捷的缩写

脚本字段不是
\u源文件的一部分,它们在每个命中的单独字段中返回
result.Fields
result.Hits.Select(h=>h.Fields.ToList()
的简写形式

作为示例,给出以下查询

var searchResponse=client.Search(s=>s
.ScriptFields(sf=>sf
.ScriptField(“test1”,sc=>sc
.Source(“doc['numberOfCommits'].value*2”)
)
.ScriptField(“test2”,sc=>sc
.Source(“doc['numberOfCommits'].value*参数因子”)
.Params(p=>p
.添加(“系数”,2.0)
)
)
)
);
哪个发送以下请求

{
“脚本_字段”:{
“测试1”:{
“脚本”:{
“来源”:“doc['numberOfCommits'].值*2”
}
},
“测试2”:{
“脚本”:{
“来源”:“doc['numberofcommissions'].value*参数因子”,
“参数”:{
“系数”:2.0
}
}
}
}
}
JSON响应是

{
“take”:26,
“超时”:false,
“_碎片”:{
“总数”:2,
"成功":二,,
“跳过”:0,
“失败”:0
},
“点击次数”:{
“总数”:{
“价值”:1100,
“关系”:“情商”
},
“最高分数”:1.0,
“点击次数”:[
{
“_索引”:“项目”,
“\u类型”:“\u单据”,
“_id”:“Konopelski Inc2032”,
“_分数”:1.0,
“_路由”:“科诺佩尔斯基Inc2032”,
“字段”:{
“测试2”:[
308
],
“测试1”:[
308
]
}
},
{
“_索引”:“项目”,
“\u类型”:“\u单据”,
“_id”:“Feest Group2047”,
“_分数”:1.0,
“_路由”:“Feest Group2047”,
“字段”:{
“测试2”:[
1986
],
“测试1”:[
1986
]
}
}
]
}
}
迭代响应中每个命中的脚本字段

foreach(response.fields中的变量字段)
{
//使用test1和test2值执行一些操作
var test1=fields.Value(“test1”);
var test2=fields.Value(“test2”);
}