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,
}
]
}
一些更多的事實:
- 優惠須以更高的速度比產品的更新。
- 有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',因爲它比索引中的其他任何內容更新得更頻繁。我如何將它插入排名?我可以擴展彈性搜索評分類並修改它使用這種外部數據結構嗎?
任何意見/建議,將不勝感激。
我上面描述的排名(按時間排序)是最簡單的。我想使用更復雜的版本,根據用戶或關鍵字提高某些優惠(基於賣家或優惠價格)。因此,我無法在索引時間內選擇一個報價。另一個用例是我想讓用戶通過seller_name或價格進行過濾,所以如果我在索引時間內刪除提議,我將丟失所有數據。 – srini
它是ES目前所面臨的更困難的用例之一(這就是爲什麼我提出了粗略的解決方法:)。實現你想要的功能並不重要,如果你能夠負擔得起使用SOLR代替,它提供了一個名爲FieldCollapsing(即:'分組')的功能。請參閱:https://wiki.apache.org/solr/FieldCollapsing。這是ES期待已久的功能:https://github.com/elasticsearch/elasticsearch/issues/256 –