如何根据类别对多个用户定义的排序编制索引?

时间:2018-09-05 14:21:46

标签: solr solr4

让我们说:

  • 3个产品, prod1 prod2 prod3
  • 3个类别, cat1 cat2 cat3

该产品可以在每个类别中具有自定义定义的排序/排序。

因此,唯一组是产品与类别的组合以及类别组合的订单/类别,例如:

--------------------------
|product  |category|order|
|------------------------|
|prod1    |cat1    |3    |
|prod2    |cat1    |1    |
|prod3    |cat1    |2    |
--------------------------
|prod1    |cat2    |1    |
|prod2    |cat2    |2    |
|prod3    |cat2    |3    |
--------------------------
|prod1    |cat3    |2    |
|prod2    |cat3    |3    |
|prod3    |cat3    |1    |
--------------------------

目前,我已将每个产品的所有可用类别编入索引,例如:

array (
  'id' => 'prod1',
  'type_s' => 'product',
  'categories_ss' => 
  array (
    0 => 'cat1',
    1 => 'cat2',
    2 => 'cat3',
  ),
  ...
  ...
  ...
  'price_i' => 50
)

我希望能够搜索按自定义订单排序的类别x 中的所有产品。我应该使用哪个solr字段来存储每个类别中产品的订单?

我的Solr版本:4.10.4

1 个答案:

答案 0 :(得分:1)

由于您已经用Solr4标记了此问题,因此我强烈建议您进行升级-DocValues的性能得到了很多增强(它们是在4.2中添加的,但是我认为您至少是在此之后的更高版本中)。其中一些可能会使该策略更加可行。

创建一个类型为int(或long)并启用docValues的动态字段(这将有助于减少用于排序的稀疏字段的内存消耗)。

<dynamicField name="sort_cat_*" type="int" docValues="true" indexed="true"  stored="true" />

然后,如果可能的话,向文档中添加一个以类别或类别ID命名的字段-避免在字段名称中使用特殊字符会使一切变得简单。使用简单的替换策略(即将“ foo&bar”更改为“ foo_bar”):

sort_cat_cat1: 2

然后可以使用此字段进行排序。您可能已经有一个字段可以过滤以获取此类别中的项目。