對於電子商務過濾系統,必須在整個過濾後的集合上計算ElasticSearch中的聚合。過濾器中的聚合只會返回所有過濾文檔中存在的值嗎?
沒有過濾器,我們得到:紅色
"filters":{
"colour":{
"red":{
"count":5
},
"blue":{
"count":4
}
},
"size":{
"L":{
"count":16
},
"M":{
"count":15
}
}
}
過濾器而已,我們得到:
"filters":{
"colour":{
"red":{
"count":5
},
"blue":{
"count":3
}
},
"size":{
"L":{
"count":1
},
"M":{
"count":1
}
}
}
只藍色濾鏡,可以得到:
"filters":{
"colour":{
"blue":{
"count":4
},
"red":{
"count":3
}
}
}
沒有大小爲藍色,這沒關係。但是,如果我們將二者結合起來:
"filters":{
"colour":{
"red":{
"count":5
},
"blue":{
"count":4
}
},
"size":{
"L":{
"count":1
},
"M":{
"count":1
}
尺寸不應該在所有返回的,因爲它不匹配兩種顏色。
這就是被髮送到ES:
{
"size":1000,
"fields":[
"id",
"name",
"price",
"colour",
"size"
],
"query":{
"filtered":{
"query":{
"match_all":{}
},
"filter":{
"bool":{
"must":[
{
"term":{
"categories":4838
}
},
{
"bool":{
"should":[
{
"term":{
"colour":"blue"
}
},
{
"term":{
"colour":"red"
}
}
]
}
}
]
}
}
}
},
"aggs":{
"price":{
"stats":{
"field":"price"
}
},
"discounted":{
"terms":{
"field":"discounted"
}
},
"stock":{
"filter":{
"range":{
"stock":{
"gt":0
}
}
}
},
"colour":{
"terms":{
"field":"colour"
}
},
"size":{
"terms":{
"field":"size"
}
}
}
}
到底哪裏出問題了?你如何設置聚合只在篩選的子集匹配所有文件?
OK,我明白爲什麼它正在發生 - 我只是不希望它發生這樣的事情。如果選擇藍色和紅色,並且M僅適用於藍色產品,但L適用於紅色和藍色,我只想返回L.這是可能的嗎? – Mave
它取決於您的映射。顏色是一個多值域?或者您是否已經對數據進行了非規範化處理? –
顏色是一個多值字段,是的。單個產品可以同時具有紅色和藍色兩種版本。 – Mave