我目前正尝试使用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
我希望收到的是,例如,5最常见的常见产品,与特定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
}
所以很遗憾对我来说并不是真的有用。对于使用我的“扁平”结构的示例或建议,我感到非常高兴。非常感谢。
答案 0 :(得分:1)
听起来您正在尝试构建基于项目的推荐器。 Apache Mahout提供了帮助协作过滤的工具(以前称为Taste项目)。
我认为还有一个Taste plugin for Elasticsearch 1.5.x可以处理与您类似的数据,以生成基于项目的推荐。
(注意:此插件使用在Elasticsearch 1.5中弃用的 Rivers ,因此在采用此建议之前,我应与作者核实有关支持更新版Elasticsearch的计划。)< / p>
答案 1 :(得分:0)
由于我没有您拥有的数据量,请尝试以下操作:
itemId
的捆绑包的productId
列表&#34; stuff&#34;为:{
"query": {
"filtered": {
"filter": {
"term": {
"productId": 1234
}
}
}
},
"fields": [
"itemId"
]
}
然后
GET /sales/sales/_search?search_type=count
{
"query": {
"filtered": {
"filter": {
"terms": {
"itemId": [1,2,3,4,5,6,7,11]
}
}
}
},
"aggs": {
"most_sig": {
"significant_terms": {
"field": "productId",
"size": 0
}
}
}
}
答案 2 :(得分:0)
如果我理解正确,您的每个订单项都有一个doc。你想要的是每个订单的单个文档。 Order doc应该有一个productIds数组(或一个包含productId字段的行项目对象数组)。
这样,当您查询包含产品X的订单时,sig_terms聚合应该会发现产品Y在这些订单中非常常见。