Solr:具有分面类别的太阳黑子

时间:2013-08-09 14:10:22

标签: ruby-on-rails ruby-on-rails-3 solr sunspot faceted-search

我是索尔的新手,我不知道这是否是最佳方式:

我有一些产品,分为几类。这些类别以分层结构(如

)进行组织
- Electronics
  - Computer
    - Apple
      - iPads
      - Macbooks
    - Samsung
    - Notebooks
  - Photo
- Fashion
  - Women
  - Men
    - Shirts

每个产品都可以有多个类别。例如,产品可能位于Electronics > Computer > Apple > MacbooksElectronics > Computer > Notebooks中。列出Electronics的产品应返回所有基础产品,包括所有子类别。在Electronics > Computer中列出产品只应返回该子类别中的产品。

我的商店在Rails中,它使用sunspot作为Solr的DSL。在太阳黑子中,我有一个名为category_names的字段,其中包含multiple: truestored: true。在这个字段中,我存储了多个类别,从根到最深的子类别,存储在Solr中,如下所示:

<arr name="category_names_sms">
  <str>Electronics</str>
  <str>Electronics#Computer</str>
  <str>Electronics#Computer#Notebooks</str>
  <str>Electronics#Computer#Apple</str>
  <str>Electronics#Computer#Apple#Macbooks</str>
</arr>

当我想要将所有类别检索为构面搜索时,我只需使用facet=true&facet.field=category_names调用Solr,它就会返回......

<lst name="facet_counts">
  <lst name="facet_queries"/>
  <lst name="facet_fields">
    <lst name="taxon_names_sms">
      <int name="Electronics">2831</int>
      <int name="Electronics#Computer">1988</int>
      <int name="Electronics#Computer#Apple">543</int>
      ...
    </lst
  </lst
</lst>

当我只想从某个类别中获取产品时,我会使用fq=category_names:Electronics调用Solr并返回该类别中的所有产品。并且因为每个产品还包含根类别的路径,所以我也从子类别中获取产品。

我已经阅读了一些关于枢轴刻面,层次分面的文章......如果我正确使用Solr功能,我会有点困惑。我的问题是:

  • 这种做法是好的吗? 或者您是否有任何可以想象的缺点?我使用#主题标签来分割和解析客户端的类别,这点我不知道#&#39; 39; t like。
  • 另一个问题是,从Solr获取类别时,我只有类别的名称。但我也需要ID或该类别的永久链接。有没有办法在Solr中存储这些信息?我不想在数据库中找到这些信息。
  • 是否有更好的,可能是Solr的内置解决方案,可以更好地处理整个分层类别的事情?
  • 我现在只使用sunspot的默认solr XML配置。我已经阅读过有关定义字段和类似内容的内容。有人可以解释一下,如何在太阳黑子中使用它?

非常感谢,我希望有人能把我推向正确的方向。

2 个答案:

答案 0 :(得分:0)

我可以看到你所拥有的结构非常复杂,我建议你不要那样使用Solr。

虽然Solr 4.0+可以做有限的连接功能,但这不是他的强项。 看看这篇文章(特别是“Hiearchy和关系使Solr悲伤”部分): http://bibwild.wordpress.com/2011/01/24/thinking-like-solr-its-not-an-rdbms/

这个是关于如何在数组中将数据库非规范化以便在Solr中最佳工作的帮助:http://mysolr.com/tips/denormalized-data-structure/

答案 1 :(得分:0)

  1. 我也不喜欢那个解决方案。

  2. 改变cattegory名称后你会怎么做?您必须重新索引该类别中的所有产品。我认为这是进行一次数据库查询的更好方法。

  3. Solr支持枢轴方面。所以你可以使用它:

    如果类别的级别不受限制,则应使用动态字段:

    <field name="categories" type="int" indexed="true" stored="true" multiValued="true"/>

    <dynamicField name="category_*" type="int" indexed="true" stored="true" multiValued="true"/>

    如果您想从 Electronics 中获取 产品(例如ID为20且级别为1):

    fq=categories:20&fq={!tag=no_subcat}NOT category_2:[* TO *]

    您可以为电子子级和子级别类别构建方面:

    facet.pivot={!ex=no_subcat}category_2,category_3

  4. 我从未使用过红宝石。