2015-05-07 27 views
0

對於電子商務過濾系統,必須在整個過濾後的集合上計算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" 
      } 
     } 
    } 
} 

到底哪裏出問題了?你如何設置聚合只在篩選的子集匹配所有文件?

回答

2

結果是一致的與查詢

{ 
    "bool": { 
    "must": [{ 
     "term": { 
     "categories": 4838 
     } 
    }, { 
     "bool": { 
     "should": [{ 
      "term": { 
      "colour": "blue" 
      } 
     }, { 
      "term": { 
      "colour": "red" 
      } 
     }] 
     } 
    }] 
    } 
} 

你問4838類別的項目中哪些是藍色紅色。在大小上執行聚合時,會爲數據集中的每個大小創建存儲區,其中同時包含類別4838的藍色和紅色項目。這就是爲什麼您會在結果中獲得紅色項目的大小。

你如何設置聚合只過濾子集匹配所有文件?

我不確定要了解您的問題,因爲您的過濾子集包含紅色和藍色的項目。你可以使用子聚合(https://www.elastic.co/blog/intro-to-aggregations-pt-2-sub-aggregations)有顏色的大小在結果

更新1:

如果藍色和紅色選擇,M是隻藍色的產品,但L是兩個紅色和藍色的,我只想RETURN L

所以,你想要的大小依賴於色彩

"aggs": { 
    "price": { 
    "stats": { 
     "field": "price" 
    } 
    }, 
    "discounted": { 
    "terms": { 
     "field": "discounted" 
    } 
    }, 
    "stock": { 
    "filter": { 
     "range": { 
     "stock": { 
      "gt": 0 
     } 
     } 
    } 
    }, 
    "colour": { 
    "terms": { 
     "field": "colour" 
    }, 
    "aggs": { 
     "size": { 
     "terms": { 
      "field": "size" 
     } 
     } 
    } 
    } 
} 

您可以使用一個子aggregatio N到這樣做(https://www.elastic.co/blog/intro-to-aggregations-pt-2-sub-aggregations

更新2:

討論後

最終的答案,保持或查詢結果,但保留的唯一的結果和查詢聚集

{ 
    "aggs": { 
    "colorsizes": { 
     "filters": { 
     "filters": [{ 
      "bool": { 
      "must": [{ 
       "term": { 
       "size": "red" 
       } 
      }, { 
       "term": { 
       "size": "blue" 
       } 
      }] 
      } 
     }] 
     }, 
     "aggs": { 
     "size": { 
      "terms": { 
      "field": "size" 
      } 
     } 
     } 
    } 
    } 
} 
+0

OK,我明白爲什麼它正在發生 - 我只是不希望它發生這樣的事情。如果選擇藍色和紅色,並且M僅適用於藍色產品,但L適用於紅色和藍色,我只想返回L.這是可能的嗎? – Mave

+0

它取決於您的映射。顏色是一個多值域?或者您是否已經對數據進行了非規範化處理? –

+0

顏色是一個多值字段,是的。單個產品可以同時具有紅色和藍色兩種版本。 – Mave

相關問題