使用NEST ElasticSearch多索引搜索时如何按索引筛选返回指定字段
问题解答
完全可以直接在C#的NEST ElasticSearch查询语句中实现该功能,所有字段过滤逻辑会在Elasticsearch服务端执行,不需要在本地对全量返回结果做二次处理。
实现方案
场景1:已为不同索引定义对应POCO实体类
直接使用NEST提供的When<T>条件源过滤语法,针对不同索引对应的实体类分别指定返回字段即可,示例代码如下:
// 假设你已经为三个索引分别定义了IndexADoc、IndexBDoc、IndexCDoc三个POCO类 var searchResponse = elasticClient.Search<object>(s => s .Index("index_a,index_b,index_c") // 替换为你要查询的多个索引名 .Query(q => /* 此处填写你原有多索引搜索的查询逻辑 */) .Source(src => src // 索引A仅返回FieldA、FieldB两个字段 .When<IndexADoc>(w => w.Fields(f => f.Field(d => d.FieldA).Field(d => d.FieldB))) // 索引B仅返回FieldC、CreateTime两个字段 .When<IndexBDoc>(w => w.Fields(f => f.Field(d => d.FieldC).Field(d => d.CreateTime))) // 索引C不需要过滤字段,返回全部 .When<IndexCDoc>(w => w.IncludeAll()) ) );
场景2:未定义POCO,需要按索引名匹配
如果没有为不同索引定义专属POCO,也可以通过索引名称作为判断条件配置字段过滤:
var searchResponse = elasticClient.Search<dynamic>(s => s .Index("index_a,index_b,index_c") .Query(q => /* 原有查询逻辑 */) .Source(src => src .Fields(f => f.Field("field_a").Field("field_b").When(cond => cond.Index == "index_a")) .Fields(f => f.Field("field_c").Field("create_time").When(cond => cond.Index == "index_b")) ) );
结果处理
查询返回后,你可以通过每条命中记录的hit.Index属性判断所属索引,直接读取对应字段即可,不需要额外做内存层面的字段裁剪。
内容的提问来源于stack exchange,提问作者marcus
相关产品推荐
相关产品推荐

