我是Solr的新手,我不知道这是否是最好的方法:
我有一些产品,分为几类 . 这些类别按照层次结构进行组织
- Electronics
- Computer
- Apple
- iPads
- Macbooks
- Samsung
- Notebooks
- Photo
- Fashion
- Women
- Men
- Shirts
每个产品都可以有多个类别 . 例如,产品可能位于 Electronics > Computer > Apple > Macbooks
和 Electronics > Computer > Notebooks
中 . Electronics
的上市产品应返回所有基础产品,包括所有子类别 . 在 Electronics > Computer
中列出产品只应返回该子类别中的产品 .
我的商店在Rails中,它使用sunspot作为Solr的DSL . 在太阳黑子中,我有一个名为 category_names
的字段,其中包含 multiple: true
和 stored: 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功能,我会有点困惑 . 我的问题是:
-
这种做法是好的吗? Or are there any drawbacks you can imagine? 我正在使用
#
hashtag来分割和解析客户端上的类别,并且's a point I don't喜欢 . -
另一个问题是,从Solr获取类别时,我只有类别的名称 . 但我也需要ID或该类别的永久链接 . 有没有办法在Solr中存储这些信息?我不想在数据库中找到这些信息 .
-
是否有一个更好的,可能是Solr的解决方案,可以更好地处理整个分层类别的事情?
-
我现在只使用sunspot的默认solr XML配置 . 我读过有关定义字段和类似内容的内容 . 有人可以解释我,如何使用太阳黑子?
非常感谢,我希望有人能把我推向正确的方向 .
2 回答
我可以看到你所拥有的结构非常复杂,我建议你不要去Solr .
虽然Solr 4.0可以做有限的连接功能,但这不是他的强项 . 看一下这篇文章(特别是"Hiearchy and Relations makes Solr sad"部分):http://bibwild.wordpress.com/2011/01/24/thinking-like-solr-its-not-an-rdbms/
这一个是关于如何反规范化数据库以在Solr中最佳工作的帮助:http://mysolr.com/tips/denormalized-data-structure/
我也不喜欢那个解决方案 .
更改cattegory名称后你会怎么做?您必须重新索引该类别中的所有产品 . 我认为这是做一个数据库查询的更好方法 .
Solr支持枢轴方面 . 所以你可以使用它:
如果类别的级别不受限制,则应使用动态字段:
<field name="categories" type="int" indexed="true" stored="true" multiValued="true"/>
<dynamicField name="category_*" type="int" indexed="true" stored="true" multiValued="true"/>
如果你想从Electronics获取产品 only (例如它的id是20,level是1):
fq=categories:20&fq={!tag=no_subcat}NOT category_2:[* TO *]
您可以为电子子类和子类别构建方面:
facet.pivot={!ex=no_subcat}category_2,category_3