elastic search 里存在对象如下:Sku CarSpecs SkuCarSpecs里的对象结构是IdValue现在传入参数qq是个Arrayq里面的对象结构是IdValue如下:要求SkuCarSpecs里的每一个元素必须都能在参数q里找到Id和Value相同的元素怎么写查询?使用ElasticAPMNetCoreAll的QueryContainer用代码怎么实现?
可以使用nested查询来实现这个需求。具体的查询代码如下:
var searchResponse = client.Search<Sku>(s => s
.Query(q => q
.Nested(n => n
.Path(p => p.CarSpecs)
.Query(nq => nq
.Bool(b => b
.Must(q.Select(item => new QueryContainer(
qn => qn
.Term(t => t
.Field(f => f.CarSpecs.First().Id)
.Value(item.Id)
),
qn => qn
.Term(t => t
.Field(f => f.CarSpecs.First().Value)
.Value(item.Value)
)
)))
)
)
)
)
);
上面的代码中,首先使用Nested查询来指定查询路径为CarSpecs。然后,使用Bool查询来组合多个Term查询,每个Term查询对应参数q中的一个元素,分别匹配Id和Value字段。最后,将所有的Term查询组合成一个Bool查询,作为Nested查询的查询条件。
需要注意的是,由于CarSpecs是一个数组,我们需要使用First()方法来获取数组中的第一个元素,然后再指定要查询的字段。如果不指定First()方法,Elasticsearch会认为我们要查询CarSpecs数组中的所有元素,而不是其中的一个
原文地址: https://www.cveoy.top/t/topic/dJuh 著作权归作者所有。请勿转载和采集!