elastic search 里存在对象如下:Sku CarSpecs SkuCarSpecs里的对象结构是IdValue现在传入参数qq是个Arrayq里面的对象结构是IdValue如下:要求SkuCarSpecs里的每一个元素必须都能在参数q里找到Id和Value相同的元素怎么写查询?使用ElasticAPMNetCoreAll用代码怎么实现?
可以使用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中的第一个元素。如果需要查询所有的元素,可以使用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);
``
原文地址: https://www.cveoy.top/t/topic/dJue 著作权归作者所有。请勿转载和采集!