【问题标题】:Significant Terms Aggregation of "flat" structures“扁平”结构的重要术语聚合
【发布时间】: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 万份此类文档。 lineItemsale 的一部分(由 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
}

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

【问题讨论】:

  • 您的saleobject 还是nested?无论如何,您是否已经尝试过显而易见的:{ "query": { "filtered": { "filter": { "term": { "sale.productId": 1235 } } } }, "aggs": { "most_sig": { "significant_terms": { "field": "sale.productId", "size": 6 } } } }
  • 如果 saleobject (因此是一个平面数组)它应该按原样工作。如果是nested,我认为您需要"include_in_parent": true 并使用相同的查询。
  • @AndreiStefan 非常感谢您的 cmets。不幸的是,lineItems 既不嵌套也不在父子对象结构中。如上所述,这些文档位于一个索引中。我知道我需要根据itemId 进行汇总,因为我希望将不常见的产品一起购买在一个sale (itemId) 中。
  • 还有一点不太清楚:同样的itemId 是指一捆一起买的产品,对吧?捆绑产品意味着相同的itemId 的不同productId。给定一个productId,您想找到与最初一起购买的productId 不同的不常见productIds。我理解对了吗?
  • @AndreiStefan 这非常正确 :-) 是的!

标签: elasticsearch recommendation-engine significant-terms


【解决方案1】:

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

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

(注意:此插件使用在 Elasticsearch 1.5 中已弃用的 Rivers,因此在采用此建议之前,我会与作者确认支持更新版本 Elasticsearch 的计划。)

【讨论】:

    【解决方案2】:

    由于我没有你做的数据量,试试这个:

    1. 获取 itemIds 的列表,以获取包含特定 productId 且您想为其查找“资料”的捆绑包:
    {
      "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
          }
        }
      }
    }
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2015-01-21
        • 1970-01-01
        • 2017-10-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-17
        • 2014-07-09
        • 2018-08-23
        相关资源
        最近更新 更多