我希望为电子商务产品过滤制作过滤器。每个请求toES将至少具有类别匹配的必须过滤器,然后对属性进行可选过滤。让我们说颜色和大小。但是,颜色和大小必须与所选值之一匹配。如果所选颜色为蓝色和红色,则为OR,但如果选择了尺寸M和L,则结果应返回(蓝色或红色)和尺寸(M OR L)的产品。我的过滤器原样是:
"query":{
"filtered":{
"filter":{
"bool":{
"must":[
{
"term":{
"categories":4838
}
},
{
"bool":{
"should":[
{
"bool":{
"must":[
{
"bool":{
"should":[
{
"term":{
"Colour":"White"
}
},
{
"term":{
"Colour":"Black"
}
},
{
"term":{
"Colour":"Blue"
}
}
]
}
}
]
}
},
{
"bool":{
"must":[
{
"bool":{
"should":[
{
"term":{
"Size":"M"
}
},
{
"term":{
"Size":"L"
}
}
]
}
}
]
}
}
]
}
}
]
}
}
}
}
此过滤器返回所有这些过滤器的值。我得到的所有产品颜色为白色,黑色或蓝色,或者尺寸为M或L。
总结它应该如何:
在单个属性中它是所有的OR并且它会扩展搜索,但是当选择另一个属性时,它会成为这些属性之间的AND,但仍然是其中的OR。
答案 0 :(得分:1)
除了@ Mave的回答,您还可以使用Terms
过滤器代替Term
过滤器来简化搜索请求。它使请求更具可读性。
{
"query": {
"filtered": {
"filter": {
"bool": {
"must": [
{
"term": {
"categories": 4838
}
},
{
"terms": {
"Colour": [
"White",
"Black",
"Pink"
]
}
},
{
"terms": {
"Size": [
"M",
"L"
]
}
}
]
}
}
}
}
}
答案 1 :(得分:0)
当然属性必须在他们的必须条款中,导致:
"query":{
"filtered":{
"filter":{
"bool":{
"must":[
{
"term":{
"categories":4838
}
},
{
"bool":{
"should":[
{
"term":{
"Colour":"White"
}
},
{
"term":{
"Colour":"Black"
}
},
{
"term":{
"Colour":"Pink"
}
}
]
}
},
{
"bool":{
"should":[
{
"term":{
"Size":"M"
}
},
{
"term":{
"Size":"L"
}
}
]
}
}
]
}
}
}
}