elasticsearch - 嵌套文档排序/得分与典型的电子商务数据

时间:2014-04-17 23:48:44

标签: elasticsearch

我正在尝试将我们的电子商务搜索系统转移到弹性搜索。我们有一堆产品,每个产品可以有多个优惠(由商家出售)。大致是文档的格式是

{
    "productId": 1234,
    "title": "Apple Macbook Pro",
    "description": "Macbook Pro ModelNo:ABC 2.4GHz 8GB RAM",
    "offers": [
        {
            "offer_id": "123",
            "offer_seller": "ebay"
            "offer_price": 900
            "condition": "refurb"
            "times_bought": 25,
        },        
        {
            "offer_id": "124",
            "offer_seller": "amazon"            
            "offer_price": 1200,
            "condition": "new",
            "times_bought": 35,
        },
        {
            "offer_id": "125",
            "offer_seller": "bestbuy"                        
            "offer_price": 1400
            "condition": "new",
            "times_bought": 10,
        }
    ]
}

{
    "productId": 1235,
    "title": "Apple Macbook Air",
    "description": "Macbook Air ModelNo:ABC 1.2GHz 4GB RAM",
    "offers": [

        {
            "offer_id": "123",
            "offer_seller": "ebay"
            "offer_price": 600
            "condition": "refurb"
            "times_bought": 50,
        },        
        {
            "offer_id": "124",
            "offer_seller": "amazon"            
            "offer_price": 999,
            "condition": "new",
            "times_bought": 55,
        },
        {
            "offer_id": "125",
            "offer_seller": "bestbuy"                        
            "offer_price": 1100
            "condition": "new",
            "times_bought": 20,
        }
    ]
}  

更多事实

  1. 优惠的更新速度高于产品。
  2. 每种产品平均有50个优惠。
  3. 这是我的查询

    {
    "query" : {
    "function_score": {
        "boost_mode": "replace",
        "multi_match": {
             "query": "macbook",
             "fields": [
                "title^10",
                "description^5"
             ]
          },
        "script_score": {
            "params": {
                "param1": 2,
                "param2": 3.1
            },
            "script": "_score * doc['offers.times_bought'].value / pow(param1, param2)"
        }
    }
    }
    }
    

    我的问题
    1.我使用嵌套类型提供商品,因为我想使用offer_price对商品进行分类。我read父母/孩子不支持排序,但每次更新优惠的事实都会重新索引整个产品,这让我想知道父/子是否是更好的选择。
    2.我想为每件退回的产品展示最好的(1或2)优惠。有没有办法为每个返回的结果对嵌套文档进行排序,还是应该由我自己来做? 3.如果我想将'times_bought'存储在索引之外,因为它比索引中的任何其他内容更频繁地更新。如何将其插入排名?我可以扩展弹性搜索评分类并使用此外部数据结构进行修改吗?

    任何建议/建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

怎么样:

  • 在索引代码中执行“最佳优惠”聚合。这意味着您将其存储在KV商店(redis,couchbase,无论如何)中,并在每次特定产品的报价发生变化时重新填充。无论如何,你可能都有数据可用。
  • 这样您只需索引_price即可参考最优惠价格。
  • 以正确的顺序正确退回产品。
  • 最后(在ES按顺序退回产品后),您可以通过产品ID拨打kv-store,以获取每个退回产品的全部(1或2)优惠。

ES和KV商店的这种组合可能看起来比它的价值更麻烦,但请相信我最终会降低复杂性的奇迹。

答案1和2.

至于3: 您可以将其模型化为父/子,这将允许使用单独的间隔进行索引,性能权衡,但我不确定是否诚实。

有点