Elasticsearch NEST 6.x:子文档Term查询实现咨询
在NEST 6.x中对子文档执行Term查询的解决方案
嘿,我来帮你搞定NEST 6.x里子文档的term查询问题!首先先把你的索引映射补全(你之前的代码没写完),确保子文档字段配置正确,再写对应的查询代码。
第一步:补全索引映射
推荐把SubDocument字段设置为Nested类型(这是处理嵌套文档的最佳实践,能避免object类型扁平化导致的匹配错误)。完整的映射代码如下:
.Mappings(mp => mp .Map<BaseTest>(m => m .Properties(p => p // 配置子文档为Nested类型 .Nested<SubBase>(n => n .Name(b => b.SubDocument) .Properties(s => s .Number(sb => sb.Name(sbb => sbb.Id)) // 整数类型字段映射 .Keyword(sb => sb.Name(sbb => sbb.IdGuid)) // Guid映射为Keyword类型用于精确匹配 .Text(sb => sb.Name(sbb => sbb.Titel)) // 文本类型,如需精确匹配可改为Keyword ) ) // 父文档其他字段的映射 .Keyword(b => b.Name(bt => bt.Id)) .Keyword(b => b.Name(bt => bt.TypeId)) .Text(b => b.Name(bt => bt.BaseTitel)) ) ) )
第二步:编写Term查询代码
针对子文档的不同字段,写法略有差异,下面给你几个常用场景的示例:
场景1:匹配子文档的Id字段(整数类型)
如果要查询SubDocument.Id等于1的所有BaseTest文档,代码如下:
var searchResponse = client.Search<BaseTest>(s => s .Query(q => q // 使用Nested查询指定子文档路径 .Nested(n => n .Path(p => p.SubDocument) .Query(nq => nq // Term查询精确匹配子文档的Id .Term(t => t.SubDocument.Id, 1) ) ) ) );
场景2:匹配子文档的IdGuid字段(Guid类型)
如果要精确匹配SubDocument.IdGuid的某个Guid值,直接传入Guid对象即可:
// 替换成你要匹配的目标Guid var targetGuid = Guid.Parse("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"); var searchResponse = client.Search<BaseTest>(s => s .Query(q => q .Nested(n => n .Path(p => p.SubDocument) .Query(nq => nq .Term(t => t.SubDocument.IdGuid, targetGuid) ) ) ) );
如果你用的是默认Object类型(不推荐)
如果你的SubDocument没有设置为Nested类型,而是默认的Object类型,那么可以省略Nested查询,直接写Term查询:
var searchResponse = client.Search<BaseTest>(s => s .Query(q => q .Term(t => t.SubDocument.Id, 1) ) );
不过要注意:Object类型会把子文档的字段扁平化到父文档中,如果未来你的SubDocument变成列表(比如List<SubBase>),这种写法会导致跨子文档的错误匹配,所以还是推荐用Nested类型。
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

