繁体   English   中英

Solr:具有多方面类别的黑子

[英]Solr: Sunspot with facet categories

我是Solr的新手,我不知道这是否是最好的方法:

我有一些产品,分为几类。 类别按层次结构组织,例如

- Electronics
  - Computer
    - Apple
      - iPads
      - Macbooks
    - Samsung
    - Notebooks
  - Photo
- Fashion
  - Women
  - Men
    - Shirts

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

我的商店在Rails中,它使用黑子作为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,并且返回sth

<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功能,我会有些困惑。 我的问题是:

  • 这是一个好方法吗? 还是您可以想象到任何缺点? 我正在使用#标签在客户端上拆分和解析类别,这是我不喜欢的观点。
  • 另一个问题是,从Solr获取类别时,我只有类别的名称。 但我还需要ID或类别的永久链接。 有没有办法在Solr中存储此类信息? 我不想访问此信息的数据库。
  • 是否有更好的,也许是Solr的内置解决方案,可以更好地处理整个层次结构类别的问题?
  • 我现在仅使用来自sunspot的默认solr XML配置。 我读过有关定义字段和类似内容的信息。 有人可以解释一下,如何与黑子一起使用吗?

非常感谢,我希望有人可以将我推向正确的方向。

我可以看到您的结构非常复杂,我建议您不要对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. 我也不喜欢这种解决方案。

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

  3. Solr支持枢轴构面。 因此,您可以使用它:

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

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

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

    如果你想获取产品 电子 (例如,它的ID是20,级别为1):

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

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

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

  4. 我从没用过红宝石。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM