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查询,要求所有条件都满足
                )
            )
        )
    )
);

代码解释:

  1. Nested查询:用于查询嵌套在Sku对象中的CarSpecs数组。Path参数指定了要查询的路径为CarSpecs。
  2. Bool查询:使用Bool查询来实现多个条件查询。Must查询表示所有条件都必须满足。
  3. 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的元素。

Elasticsearch 嵌套查询:匹配Sku.CarSpecs列表中的所有元素

原文地址: https://www.cveoy.top/t/topic/k6uw 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录