2016-02-20 47 views
0

我試圖寫一個紅寶石算法,將工作分類如下:紅寶石算法的產品

  • 用戶創建的「搜索查詢」,基於一定的標準指定產品類別(即,如果產品有「紅色「,腳本將產品分配給類別ID#20,如果產品在標題中具有」玻璃「,腳本將產品分配給類別ID#40等)。產品可以屬於多個類別
  • 幾乎每隔一段時間,將運行該腳本並指定產品,以各自的類別,並通過API

我奮力推更新類別的電子商務平臺,是因爲我想不通最有效的方法來做到這一點。我想限制向電子商務平臺發出的API請求數量,並且只在實際更改時才「推送」更新後的類別。

最初我以爲我會逐個瀏覽每個產品,查看它匹配的規則/類別,然後僅在發生實際更改時纔將新產品類別推送到電子商務平臺。這種方法的問題是每次創建新規則時都必須運行3000個產品。

另一種方法是在每次創建新規則時再次運行所有規則並更新本地數據庫中的類別,但是如何才能檢查類別是否實際更改?

任何指針將不勝感激......我將每個產品的類別作爲數組存儲在數據庫中(即29,20,38,27)。

+0

這是有點模糊的問題,但如果是我我會首先學習這[算法](https://en.wikipedia.org/wiki/String_searching_algorithm) – bjhaid

回答

1

也許是這樣的。

key_to_category = { "red"=>1, "blue"=>2, "green"=>3, "pink"=>2 } 
keys = key_to_category.keys 
    #=> ["red", "blue", "green", "pink"] 
cats = key_to_category.values.uniq 
    #=> [1, 2, 3] 

products = [ 
    "Red and Green Gummies", 
    "Sky-Blue Thingamajigs", 
    "Dead Fred", 
    "Green Glue", 
    "Blue and Green Whatchamacallits" 
] 

r =/
    \b     # match word break 
    #{Regexp.union(keys)} # match any key 
    \b     # match word break 
    /x     # extended/free-spacing regex definition mode 
    #=>/
     \b 
     (?-mix:red|blue|green|pink) 
     \b 
     /x 

products.each_with_object(Hash.new { |h,k| h[k] = [] }) do |prod, h| 
    prod.downcase.scan(r).each { |key| h[key_to_category[key]] << prod } 
end 
    #=> {1=>["Red and Green Gummies"], 
    # 3=>["Red and Green Gummies", "Green Glue", 
    #  "Blue and Green Whatchamacallits"], 
    # 2=>["Sky-Blue Thingamajigs", "Blue and Green Whatchamacallits"]} 

然後逐步完成更新。

可替代地,步驟通過產品表,獲得product_name,計算

product_name = "Red and Green Gummies" 
key_to_category.values_at(*product_name.downcase.scan(r)) 
    #=> [1, 3] 

,然後更新類別1和3

+0

我擁有其中一個產品,我發現它非常有用,因爲我一直在尋找一支鋼筆或鉛筆。 –

+0

感謝您的建議。產品在數據庫中作爲記錄(rails&postgres)..這會在方法上有什麼不同嗎?特別是考慮到我有3k +產品... –

+0

此外,這給了我的每個類別與其產品..不幸的是,我不能更新類別的API中的產品類別。我必須通過更新單個產品進行更新...... –