2015-06-03 33 views
1

對於電子商務平臺,我們希望爲產品編制索引。默認字段很簡單:name_enname_dename_fr,description。但是,價格和庫存都依賴於另一個值:ElasticSearch中的'關聯'數據

  • Product A,爲webshop 1,有price = 1.99stock = 10,並在第1類,適合10和50
  • Product A,爲webshop 2,有price = 5.99stock = 5 ,以及類別9,90和500.

我在想嵌套對象,但是即使是一個選項?

- name_en: Product A 
- description_en: Product A description 
- webshops: [{ 
    - key: webshop_id 
     value: 1 
    - key: price 
     value: 1.99 
    - key: stock 
     value: 10 
    - key: categories 
     value: [1, 10, 50] 
    },{ 
    - key: webshop_id 
     value: 2 
    - key: price 
     value: 5.99 
    - key: stock 
     value: 5 
    - key: categories 
     value: [9, 90, 500] 
    } 
] 

這樣很容易查詢嗎?我們可以輕鬆獲取整個文檔,其值爲webshop.key.webshop_id.value = 1webshop.key.categories.value = 500

我的思維是否錯誤,指向正確的方向?

回答

1

您可以像您一樣嵌套,但在單個網店中更新產品的價格或庫存會很困難,因爲您必須對整個webshops數組進行重新索引。有辦法繞過它,但這很複雜。

除了具有嵌套結構之外,您還可以對網上商店部分進行非規範化處理,只需在這樣的文檔中包含price,stockcategories字段即可。

Document 1: 
- name_en: Product A 
- description_en: Product A description 
- webshop_id: 1 
- price: 1.99 
- stock: 10 
- categories: [1, 10, 50] 

Document 2: 
- name_en: Product A 
- description_en: Product A description 
- webshop_id: 2 
- price: 5.99 
- stock: 5 
- categories: [9, 90, 500] 

然後在你的查詢,你可以簡單地取決於其網上商店要查詢針對添加約束爲webshop = 1webshop = 2(或兩者)。更新特定商店中產品的價格,庫存和類別也更容易,您只需更新相應的文檔即可。

這意味着您的產品數據(名稱,描述等)將在每個網店中複製一次,但通常並不是什麼大問題(在NoSQL世界中很常見),您只需更新2個文檔而不是一個,但_bulk將在那裏幫助。至少,當您添加新的網上商店時,您不需要重新索引所有數據(!!!),並且可以在一個網上商店中更改價格和庫存,而不會干擾其他網上商店。

+0

Right-o,更非規範化。乾杯! – Mave

1

您還可以使用父/子關係功能。

你必須定義兩個文檔類型:產品和網店

在映射,必須定義這樣的關係:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-parent-field.html

{ 
    "webshop" : { 
    "_parent" : { 
     "type" : "product" 
    } 
    } 
} 

就像你可以索引所有的產品在產品類型。然後,您可以索引與該產品相關的所有網上商店詳細信息。

您可以使用查詢/過濾器檢索與產品相關的網上商店詳細信息。

就像你有真正的不同的文件,可以單獨查詢。