使用apache solr进行facet动态字段

时间:2011-09-22 09:16:23

标签: search solr field facet

我在ApacheSolr中定义了动态字段:

我用它来存储产品功能,例如:color_feature,diameter_feature,material_feature等。由于产品正在发生变化,这些领域的数量并不稳定。

是否可以为具有相同查询的所有动态字段获取构面结果,或者我是否需要始终在查询中编写所有字段,例如...... facet.field=color_feature&facet.field=diameter_feature&facet.field=material_feature&facet.field= ...

2 个答案:

答案 0 :(得分:5)

在电子商务平台上工作时,情况类似。每个项目都有静态字段(PriceNameCategory),可以轻松映射到SOLR的schema.xml,但每个项目也可能具有动态数量的变化。

例如,商店中的T恤可能有ColorBlackWhiteRed等)和Size({ {1}},Small等)属性,而同一商店中的蜡烛可能有MediumScentPumpkin等)变体。本质上,这是一个实体 - 属性 - 值(EAV)关系数据库设计,用于描述产品的某些功能。

由于SOLR中的Vanilla文件从分面的角度来看是平的,我通过将变体整合到一个多值字段中来解决它...

schema.xml

...将数据从数据库推送到这些字段<field name="variation" type="string" indexed="true" stored="true" required="false" multiValued="true" /> Color|BlackSize|Small ......

Scent|Pumpkin

...所以当我告诉SOLR时,我得到的结果看起来像......

  <doc>
    <field name="id">ITEM-J-WHITE-M</field>
    <field name="itemgroup.identity">2</field>
    <field name="name">Original Jock</field>
    <field name="type">ITEM</field>
    <field name="variation">Color|White</field>
    <field name="variation">Size|Medium</field>
  </doc>
  <doc>
    <field name="id">ITEM-J-WHITE-L</field>
    <field name="itemgroup.identity">2</field>
    <field name="name">Original Jock</field>
    <field name="type">ITEM</field>
    <field name="variation">Color|White</field>
    <field name="variation">Size|Large</field>
  </doc>
  <doc>
    <field name="id">ITEM-J-WHITE-XL</field>
    <field name="itemgroup.identity">2</field>
    <field name="name">Original Jock</field>
    <field name="type">ITEM</field>
    <field name="variation">Color|White</field>
    <field name="variation">Size|Extra Large</field>
  </doc>

...以便我解析这些结果以显示给用户的代码可以在我的<lst name="facet_counts"> <lst name="facet_queries"/> <lst name="facet_fields"> <lst name="variation"> <int name="Color|White">2</int> <int name="Size|Extra Large">2</int> <int name="Size|Large">2</int> <int name="Size|Medium">2</int> <int name="Size|Small">2</int> <int name="Color|Black">1</int> </lst> </lst> <lst name="facet_dates"/> <lst name="facet_ranges"/> </lst> 分隔符上拆分(假设我的密钥和值都没有|)和然后按键分组......

|

......这对政府工作来说已经足够了。

这样做的一个缺点是你将失去在这个EAV数据上做范围方面的能力,但在我的情况下,这不适用(Color White (2) Black (1) Size Extra Large (2) Large (2) Medium (2) Small (2) 字段适用于所有项目和因此在Price中定义,以便可以通常的方式进行分割。

希望这有助于某人!

答案 1 :(得分:4)

Solr目前不支持facet.field参数中的通配符 因此*_feature对您不起作用。

可能想要检查一下 - https://issues.apache.org/jira/browse/SOLR-247

如果您不想传递参数,可以轻松地将这些参数添加到请求处理程序默认值中。

请求中的qt=requesthandler将始终包含这些方面。