4

我目前尝试使用 Elasticsearch 重要术语聚合来构建产品推荐系统的原型。到目前为止,我还没有找到一个很好的例子来处理来自关系数据库的“平面”JSON结构sales(这里:The itemId),比如我的:

文件 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 万份此类文档。AlineItem是 a 的一部分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
}

所以不幸的是,它对我来说并不是很有用。对于使用我的“扁平”结构的示例或建议,我将非常高兴。提前非常感谢。

4

3 回答 3

1

听起来您正在尝试构建基于项目的推荐器Apache Mahout具有帮助协作过滤(以前称为 Taste 项目)的工具。

还有一个适用于 Elasticsearch 1.5.x 的 Taste 插件,我相信它可以使用像您这样的数据来生成基于项目的推荐。

(注意:这个插件使用了在 Elasticsearch 1.5 中被弃用的Rivers,所以在采纳这个建议之前,我会与作者确认支持更新版本的 Elasticsearch 的计划。)

于 2015-08-12T17:51:05.377 回答
0

由于我没有您所做的大量数据,请尝试以下操作:

  1. 获取itemId包含productId您要为其查找“东西”的特定内容的捆绑包的 s 列表:
{
  "query": {
    "filtered": {
      "filter": {
        "term": {
          "productId": 1234
        }
      }
    }
  },
  "fields": [
    "itemId"
  ]
}

然后

  1. 使用此列表创建此查询:
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
      }
    }
  }
}
于 2015-06-12T15:52:19.657 回答
0

如果我理解正确,您每个订单行项目都有一个文档。您想要的是每个订单的单个文档。Order 文档应该有一个 productId 数组(或一个包含 productId 字段的行项目对象数组)。

这样,当您查询包含产品 X 的订单时,sig_terms 聚合应该会发现产品 Y 在这些订单中非常常见。

于 2016-06-10T10:44:12.337 回答