重要术语“扁平”结构的汇总

时间:2015-06-04 20:39:37

标签: elasticsearch recommendation-engine significant-terms

我目前正尝试使用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万个这样的文档。 lineItemsale的一部分(由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
}

所以很遗憾对我来说并不是真的有用。对于使用我的“扁平”结构的示例或建议,我感到非常高兴。非常感谢。

3 个答案:

答案 0 :(得分:1)

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

我认为还有一个Taste plugin for Elasticsearch 1.5.x可以处理与您类似的数据,以生成基于项目的推荐。

(注意:此插件使用在Elasticsearch 1.5中弃用的 Rivers ,因此在采用此建议之前,我应与作者核实有关支持更新版Elasticsearch的计划。)< / p>

答案 1 :(得分:0)

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

  1. 获取包含您要查找的某个itemId的捆绑包的productId列表&#34; stuff&#34;为:
  2. {
      "query": {
        "filtered": {
          "filter": {
            "term": {
              "productId": 1234
            }
          }
        }
      },
      "fields": [
        "itemId"
      ]
    }
    

    然后

    1. 使用此列表创建此查询:
    2. 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在这些订单中非常常见。