在ElasticSearch

时间:2015-05-01 07:21:55

标签: filter elasticsearch

我希望为电子商务产品过滤制作过滤器。每个请求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。

2 个答案:

答案 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"
                          }
                       }
                    ]
                 }
              }
           ]
        }
     }
  }
}