【发布时间】:2015-06-04 20:39:36
【问题描述】:
我目前尝试使用 Elasticsearch 重要术语聚合来构建产品推荐系统的原型。到目前为止,我还没有找到一个很好的例子来处理来自关系数据库的sales(这里:itemId)的“平面”JSON结构,比如我的:
文档 1
{
"lineItemId": 1,
"lineNo": 1,
"itemId": 1,
"productId": 1234,
"userId": 4711,
"salesQuantity": 2,
"productPrice": 0.99,
"salesGross": 1.98,
"salesTimestamp": 1234567890
}
文档 2
{
"lineItemId": 1,
"lineNo": 2,
"itemId": 1,
"productId": 1235,
"userId": 4711,
"salesQuantity": 1,
"productPrice": 5.99,
"salesGross": 5.99,
"salesTimestamp": 1234567890
}
我的 Elasticsearch 索引中有大约 150 万份此类文档。 lineItem 是 sale 的一部分(由 itemId 标识),它可以由 1 个或多个 lineItems 组成结合销售一个特定的productId。
MovieLens 示例 (https://www.elastic.co/guide/en/elasticsearch/guide/current/_significant_terms_demo.html) 以
的结构处理数据{
"movie": [122,185,231,292,
316,329,355,356,362,364,370,377,420,
466,480,520,539,586,588,589,594,616
],
"user": 1
}
所以不幸的是,它对我来说并不是真的有用。对于使用我的“扁平”结构的示例或建议,我将非常高兴。提前非常感谢。
【问题讨论】:
-
您的
sale是object还是nested?无论如何,您是否已经尝试过显而易见的:{ "query": { "filtered": { "filter": { "term": { "sale.productId": 1235 } } } }, "aggs": { "most_sig": { "significant_terms": { "field": "sale.productId", "size": 6 } } } }? -
如果
sale是object(因此是一个平面数组)它应该按原样工作。如果是nested,我认为您需要"include_in_parent": true并使用相同的查询。 -
@AndreiStefan 非常感谢您的 cmets。不幸的是,
lineItems既不嵌套也不在父子对象结构中。如上所述,这些文档位于一个索引中。我知道我需要根据itemId进行汇总,因为我希望将不常见的产品一起购买在一个sale(itemId) 中。 -
还有一点不太清楚:同样的
itemId是指一捆一起买的产品,对吧?捆绑产品意味着相同的itemId的不同productId。给定一个productId,您想找到与最初一起购买的productId不同的不常见productIds。我理解对了吗? -
@AndreiStefan 这非常正确 :-) 是的!
标签: elasticsearch recommendation-engine significant-terms