假设在 Elasticsearch 中存在以下结构的对象:

Sku: {
    CarSpecs: []
}

其中,Sku.CarSpecs 是一个数组,每个元素的结构为 {Id, Value}

现在,传入参数 qq 也是一个数组,每个元素的结构也为 {Id, Value},例如:

[ { Id: 1, Value: 'A' }, { Id: 2, Value: 'B' } ]

要求 Sku.CarSpecs 中的每一个元素都必须能在 q 中找到 IdValue 相同的元素。

可以使用 nested 查询来实现这个需求。具体的查询语句如下:

{
  "query": {
    "nested": {
      "path": "Sku.CarSpecs",
      "query": {
        "bool": {
          "must": [
            {"match": {"Sku.CarSpecs.Id": q[0].Id}},
            {"match": {"Sku.CarSpecs.Value": q[0].Value}}
          ]
        }
      }
    }
  }
}

其中,q[0] 表示参数 q 中的第一个元素。

如果需要查询所有 q 中的元素,可以使用 bool 查询和 should 子句来实现:

{
  "query": {
    "nested": {
      "path": "Sku.CarSpecs",
      "query": {
        "bool": {
          "should": [
            {"bool": {"must": [{"match": {"Sku.CarSpecs.Id": q[0].Id}}, {"match": {"Sku.CarSpecs.Value": q[0].Value}}]}},
            {"bool": {"must": [{"match": {"Sku.CarSpecs.Id": q[1].Id}}, {"match": {"Sku.CarSpecs.Value": q[1].Value}}]}}
            ...
          ]
        }
      }
    }
  }
}

其中,q[1] 表示参数 q 中的第二个元素,以此类推。

如果参数 q 中有很多元素,可以使用循环来构建查询语句。具体的实现可以参考以下代码:

var boolQuery = new BoolQuery();
foreach(var item in q)
{
    var nestedQuery = new NestedQuery
    {
        Path = "Sku.CarSpecs",
        Query = new BoolQuery
        {
            Must = new List<QueryContainer>
            {
                new MatchQuery {Field = "Sku.CarSpecs.Id", Query = item.Id},
                new MatchQuery {Field = "Sku.CarSpecs.Value", Query = item.Value}
            }
        }
    };
    boolQuery.Should.Add(nestedQuery);
}
var searchRequest = new SearchRequest
{
    Query = boolQuery
};
var response = await _elasticClient.SearchAsync(searchRequest);

该代码使用 Elastic.APM.NetCoreAll 库,通过循环遍历参数 q 中的每个元素,构建了一个 nested 查询,并将其添加到 bool 查询的 should 子句中。最终,使用 _elasticClient.SearchAsync 方法执行查询。

Elasticsearch 查询:匹配嵌套数组中的所有元素

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

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