在电子商务平台工作时,我也遇到了类似的情况。每个项目都有可以轻松映射到 SOLR 的静态字段 ( Price
, Name
, ) ,但每个项目也可以有动态数量的变化。Category
schema.xml
例如,商店中的 T 恤可能具有Color
( Black
、White
、Red
等) 和Size
( Small
、Medium
等) 属性,而同一商店中的蜡烛可能具有Scent
( Pumpkin
、Vanilla
等) 变体。本质上,这是一种实体-属性-值 (EAV) 关系数据库设计,用于描述产品的某些功能。
由于schema.xml
SOLR 中的文件从分面的角度来看是平坦的,因此我通过将变体转换为单个多值字段来解决它...
<field
name="variation"
type="string"
indexed="true"
stored="true"
required="false"
multiValued="true" />
...将数据库中的数据推送到这些字段中,如Color|Black
,Size|Small
和Scent|Pumpkin
...
<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>
...所以当我告诉 SOLR 刻面时,我得到的结果看起来像...
<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>
...这样我的解析这些结果以显示给用户的代码就可以在我的|
分隔符上拆分(假设我的键和值都没有 a|
在其中),然后按键分组...
Color
White (2)
Black (1)
Size
Extra Large (2)
Large (2)
Medium (2)
Small (2)
...这对于政府工作来说已经足够了。
这样做的一个缺点是您将失去在此 EAV 数据上执行范围方面的能力,但在我的情况下,这并不适用(Price
适用于所有项目的字段,因此被定义为schema.xml
它可以以通常的方式刻面)。
希望这对某人有帮助!