【问题标题】:Solr: Sunspot with facet categoriesSolr:具有刻面类别的太阳黑子
【发布时间】:2013-08-09 14:10:22
【问题描述】:

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

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

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

  • 这种方法好用吗? 或者你能想象到有什么缺点吗?我在客户端使用#标签来拆分和解析类别,这是我不喜欢的一点。
  • 另一个问题是,从 Solr 获取类别时,我只有类别的名称。但我还需要该类别的 ID 或永久链接。有没有办法在 Solr 中存储这些信息?我不想访问数据库以获取此信息。
  • 是否有更好的(可能是来自 Solr 的内置解决方案)可以更好地处理整个分层类别的事情?
  • 我现在只使用来自 sunspot 的默认 solr XML 配置。我读过关于定义字段和类似的东西。谁能解释一下,如何将它与黑子一起使用?

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

【问题讨论】:

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


    【解决方案1】:

    我可以看到你的结构很复杂,我建议你不要使用 Solr。

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

    还有一个关于如何对数据库进行非规范化以在 Solr 中发挥最佳作用的帮助:http://mysolr.com/tips/denormalized-data-structure/

    【讨论】:

      【解决方案2】:
      1. 我也不喜欢那个解决方案。

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

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

        如果类别的级别是无限的,你应该使用动态字段:

        &lt;field name="categories" type="int" indexed="true" stored="true" multiValued="true"/&gt;

        &lt;dynamicField name="category_*" type="int" indexed="true" stored="true" multiValued="true"/&gt;

        如果您想Electronics获取产品(例如,它的 id 为 20,level 为 1):

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

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

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

      4. 我从未使用过 ruby​​。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-12
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-22
        相关资源
        最近更新 更多