如何在NEST多索引查询中识别结果源索引并设置TrustedSource字段?
问题描述
我在ElasticSearch中有两个索引,分别命名为trusted和untrusted,二者的模板、字段及设置完全一致。我会根据某个标志位,使用NEST对其中一个或两个索引执行查询,代码示例如下:
var indices = request.IncludeUntrustedSources ? new[] {"trusted", "untrusted"} : new[] {"trusted"}; var searchResponse = await _client.SearchAsync<SearchResultItem>(c => c .Query(q => q.Bool(_ => query)) .Index(indices) .Sort(ss => ss .Descending(SortSpecialField.Score)) .From(skip) .Size(perPage)
SearchResultItem是一个简单的POCO类,我希望根据结果的源索引,将其TrustedSource字段的值设置为true或false,请问如何识别每个结果来自哪个索引?
解决方法
方式1:读取搜索结果元数据中的索引名
NEST返回的每个Hit<SearchResultItem>对象自带Index属性,这个属性就是文档所属的索引名称。遍历结果时直接用该属性赋值即可:
var processedResults = searchResponse.Hits.Select(hit => { var resultItem = hit.Source; resultItem.TrustedSource = hit.Index == "trusted"; return resultItem; }).ToList();
方式2:在POCO中映射_index元字段
如果希望索引名直接绑定到SearchResultItem的属性上,可以给POCO添加Elasticsearch元字段的映射:
public class SearchResultItem { // 原有业务字段... [PropertyName("_index")] public string SourceIndex { get; set; } // 通过计算属性直接得到TrustedSource值 public bool TrustedSource => SourceIndex == "trusted"; }
执行查询后,SourceIndex会自动填充为文档所在的索引名,TrustedSource通过计算属性直接返回判断结果,无需额外遍历赋值。
内容的提问来源于stack exchange,提问作者okolobaxa
相关产品推荐
相关产品推荐

