Elasticsearch 嵌套查询:匹配Sku.CarSpecs列表中的所有元素
Elasticsearch 嵌套查询:匹配Sku.CarSpecs列表中的所有元素
假设Elasticsearch索引中存在如下对象结构:
Sku: {
CarSpecs: []
}
其中,Sku.CarSpecs是一个数组,包含多个CarSpec对象,每个CarSpec对象结构如下:
{Id,Value}
现在需要实现一个查询功能,传入参数q,q也是一个数组,包含多个CarSpec对象:
[ {Id, Value}, {Id, Value}, ... ]
要求Sku.CarSpecs数组中的每一个元素都必须能在参数q中找到Id和Value相同的元素。
使用Elastic.APM.NetCoreAll的QueryContainerDescriptor实现
可以使用嵌套查询(Nested Query)来实现这个需求。以下代码示例演示了如何使用Elastic.APM.NetCoreAll的QueryContainerDescriptor来构建查询语句:
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(
new TermQuery
{
Field = "carSpecs.id",
Value = item.Id
},
new TermQuery
{
Field = "carSpecs.value",
Value = item.Value
}
))) // 使用Must查询,要求所有条件都满足
)
)
)
)
);
代码解释:
- Nested查询:用于查询嵌套在Sku对象中的CarSpecs数组。Path参数指定了要查询的路径为CarSpecs。
- Bool查询:使用Bool查询来实现多个条件查询。Must查询表示所有条件都必须满足。
- Term查询:使用Term查询来匹配Id和Value相同的元素。
注意:
为了使用Nested查询,需要在Sku类中将CarSpecs属性标记为[Nested]。例如:
public class Sku
{
[Nested]
public List<CarSpec> CarSpecs { get; set; }
}
public class CarSpec
{
public string Id { get; set; }
public string Value { get; set; }
}
通过以上代码,可以实现对Sku.CarSpecs列表中所有元素的匹配,确保每个元素都能在参数q中找到相同Id和Value的元素。
原文地址: https://www.cveoy.top/t/topic/k6uw 著作权归作者所有。请勿转载和采集!