2014-04-17 60 views
0

我試圖將我們的電子商務搜索系統遷移到彈性搜索。我們有一大堆產品,每個產品可以有多個優惠(由商家出售)。大致文件的格式是elasticsearch - 嵌套的文檔排序/得分與典型的電子商務數據

{ 
    "productId": 1234, 
    "title": "Apple Macbook Pro", 
    "description": "Macbook Pro ModelNo:ABC 2.4GHz 8GB RAM", 
    "offers": [ 
     { 
      "offer_id": "123", 
      "offer_seller": "ebay" 
      "offer_price": 900 
      "condition": "refurb" 
      "times_bought": 25, 
     },   
     { 
      "offer_id": "124", 
      "offer_seller": "amazon"    
      "offer_price": 1200, 
      "condition": "new", 
      "times_bought": 35, 
     }, 
     { 
      "offer_id": "125", 
      "offer_seller": "bestbuy"       
      "offer_price": 1400 
      "condition": "new", 
      "times_bought": 10, 
     } 
    ] 
} 

{ 
    "productId": 1235, 
    "title": "Apple Macbook Air", 
    "description": "Macbook Air ModelNo:ABC 1.2GHz 4GB RAM", 
    "offers": [ 

     { 
      "offer_id": "123", 
      "offer_seller": "ebay" 
      "offer_price": 600 
      "condition": "refurb" 
      "times_bought": 50, 
     },   
     { 
      "offer_id": "124", 
      "offer_seller": "amazon"    
      "offer_price": 999, 
      "condition": "new", 
      "times_bought": 55, 
     }, 
     { 
      "offer_id": "125", 
      "offer_seller": "bestbuy"       
      "offer_price": 1100 
      "condition": "new", 
      "times_bought": 20, 
     } 
    ] 
} 

一些更多的事實

  1. 優惠須以更高的速度比產品的更新。
  2. 有50個產品每件平均產品數量。

下面是該查詢我

{ 
"query" : { 
"function_score": { 
    "boost_mode": "replace", 
    "multi_match": { 
     "query": "macbook", 
     "fields": [ 
      "title^10", 
      "description^5" 
     ] 
     }, 
    "script_score": { 
     "params": { 
      "param1": 2, 
      "param2": 3.1 
     }, 
     "script": "_score * doc['offers.times_bought'].value/pow(param1, param2)" 
    } 
} 
} 
} 

我的問題
1.我用嵌套式的報價去,因爲我想用OFFER_PRICE對產品進行排序。我read父母/孩子不支持排序,但事實上,每次更新報價將重新索引整個產品,讓我懷疑父母/孩子是否是更好的選擇。
2.我想爲每個返回的產品展示最佳(1或2)報價。有沒有辦法對每個返回結果的嵌套文檔進行排序,或者我應該自己做這件事?
3.如果我想在索引外存儲'times_bought',因爲它比索引中的其他任何內容更新得更頻繁。我如何將它插入排名?我可以擴展彈性搜索評分類並修改它使用這種外部數據結構嗎?

任何意見/建議,將不勝感激。

回答

0

如何:

  • 做你的索引代碼的 '最好的報價' 聚集。這意味着您將其存儲在KV商店(redis,couchbase等)中,並在每次針對特定產品的優惠更改時重新填充。無論如何你都可以獲得數據來做到這一點。
  • 通過這種方式,您只需索引_price即可參考最佳報價。
  • 這是正確的順序返回產品。
  • 最後(在ES按順序退回產品後),您可以打電話給您的kv-store,以獲取每個退貨產品的全部頂部(1或2)報價。

ES和KV店的這種結合可能看起來比它的價值更麻煩,但相信我,它將複雜性保持在最終狀態是有效的。

,回答1和2

至於3: 你也許可以模擬,作爲一個父/子,這將允許有獨立的間隔,性能折中的索引,但我真的不知道老實說。

hth有點

+0

我上面描述的排名(按時間排序)是最簡單的。我想使用更復雜的版本,根據用戶或關鍵字提高某些優惠(基於賣家或優惠價格)。因此,我無法在索引時間內選擇一個報價。另一個用例是我想讓用戶通過seller_name或價格進行過濾,所以如果我在索引時間內刪除提議,我將丟失所有數據。 – srini

+0

它是ES目前所面臨的更困難的用例之一(這就是爲什麼我提出了粗略的解決方法:)。實現你想要的功能並不重要,如果你能夠負擔得起使用SOLR代替,它提供了一個名爲FieldCollapsing(即:'分組')的功能。請參閱:https://wiki.apache.org/solr/FieldCollapsing。這是ES期待已久的功能:https://github.com/elasticsearch/elasticsearch/issues/256 –