有一个产品清单。
每个产品(文档)都有id,name等数据。
此外,每个文档都包含每个客户的特定信息(例如可用性: 给定的产品可供一个客户使用,而不适用于另一个客户。此特定信息是嵌套数组。
'可用性' 可能包含以下值:' sold_out ',' 可用',' 死';
这是ES映射:
"mappings": {
"products": {
"properties": {
...
"clients": {
"type": "nested",
"include_in_parent": true,
"properties": {
...
"availability": {
"type": "string",
"index": "not_analyzed"
}
}
}
}
}
}
我需要为给定的客户计算 sold_out ,可用和死的产品。 (搜索参数中有客户端过滤器)
...
"query": {
"bool": {
"filter": [
{ "term": {"clients.id": 123456789}},
]
}
}
...
如何实现这一目标?
答案 0 :(得分:0)
据我所知,“clients”是一个嵌套数组,包括一个非嵌套的“可用性”过滤器。所以,你可以这样:
{
"query": {
"nested": {
"path":"clients",
"filter":{
"term":{
"clients.id": <some_client_id>
}
}
}
},
"aggs": {
"nestedClient": {
"nested":{
"path": "clients",
"aggs": {
"filterClient":{
"filter": {
"term":{
"clients.id":<same_client's_id>
}
},
"aggs": {
"availabilityTerms": {
"terms": {
"field": "clients.availability"
}
}
}
}
}
}
}
}
}
查询是缩小包含客户信息的产品集。之后,您需要过滤嵌套文档,然后对它们运行术语聚合。这里的假设是每个产品只包含任何特定客户的一个条目。 “availabilityTerms”的存储桶将为您提供所需的数据。