【问题标题】:Solr sort on a dynamic columnSolr对动态列进行排序
【发布时间】:2016-02-29 11:28:05
【问题描述】:

我想解决一个与基于类别中的产品进行排序有关的问题:

我有 3 张桌子

产品

|-------id----------|-----name-------|
|       p1          |      Prod 1    |
|       p2          |      Prod 2    |
|       p3          |      Prod 3    |
|       p4          |      Prod 4    |
|       p5          |      Prod 5    | 
|-------------------|----------------|

类别

|-------id----------|-----name-------|
|       c1          |      Cat 1     |
|       c2          |      Cat 2     |
|       c3          |      Cat 3     |
|       c4          |      Cat 4     |
|-------------------|----------------|

产品_类别

|-----prod id-------|-----cat id-----|----score----|
|       p1          |      c1        |     120     |
|       p1          |      c2        |     130     |
|       p2          |      c1        |     150     |
|       p2          |      c3        |     120     |
|       p2          |      c2        |     140     |
|       p3          |      c2        |     180     |
|       p3          |      c3        |     160     |
|-------------------|----------------|-------------|

这意味着我在多个类别中列出了产品。 我有一个通过 solr 查询为每个类别动态生成的列表页面。

目前我的 solr 文档看起来像

{
    product_id:p1,
    category_id:[c1, c2]
}

我现在面临的挑战是我需要支持基于产品类别权重的排序,即c1的listing页面将按顺序包含产品p2、p1,c3的listing将是p3、p2、p1(分数的降序)

如果我将架构更改为 doc 看起来像

{
    product_id:p1,
    category_id:[c1, c2],
    c1_weight: 120,
    c2_weight: 130
}

这样我每次添加新类别时都需要在模式中添加一个字段 cx_weight ,以便我可以按 cx_weight 字段排序。

让我知道一个解决方案,我可以使用 solr 排序机制按类别权重进行排序,并且每次添加类别时都无需更改架构。

谢谢 迪伦德拉

【问题讨论】:

    标签: solr


    【解决方案1】:

    为什么不尝试将您的 solr 文档建模为 Product_Category 行?

    {
        product_id:p1,
        category_id:c1,
        weight:120
    },
    {
        product_id:p1,
        category_id:c2,
        weight:130
    }
    

    这将支持您的类别页面要求。

    如果您搜索某些产品属性并需要跨类别进行重复数据删除,则会出现唯一的复杂因素(请参阅field-collapsing doc 了解此内容)

    【讨论】:

    • 原因是产品有许多其他字段,我需要查询价格、重量、免运费等,然后这些字段也会在每个文档中重复。我一般来说,上述技术会使系统变得沉重,如果我的系统中有 1M 产品,并且平均而言,如果一个产品可以与 5 个类别相关联,那么我将有 5M 文档只是为了改变 2 个字段,即 category_id 和 weight。
    • Lucene 使用符号表对字段值进行编码,类似于列存储。一般来说,数据重复不像关系数据库那样有问题。
    • 你也可以看看 Solr 的 join 功能,看看你是否可以做一个简单的 Product 与 product/category 连接,但这需要更多的工作。
    • 你能告诉我在这种情况下如何使用 join。
    • 对不起。很确定 Join 在您的场景中不起作用。最佳做法是反规范化,如上所述。
    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2014-09-07
    • 2015-02-16
    • 1970-01-01
    相关资源
    最近更新 更多