Я был в похожей ситуации, когда работал на платформе электронной коммерции.Каждый элемент имел статические поля (Price
, Name
, Category
), которые легко сопоставлялись с schema.xml
SOLR, но каждый элемент также мог иметь динамическое количество вариаций.
Например, футболка в магазине может иметь 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>
... так что мой код, который анализирует эти результаты для отображения пользователю, может просто разделиться на моем |
разделителе (при условии, что ни мои ключи, ни значения не будутв них есть |
), а затем сгруппируйте по ключам ...
Color
White (2)
Black (1)
Size
Extra Large (2)
Large (2)
Medium (2)
Small (2)
... что достаточно для работы правительства.
Один из недостатков такого способа заключается в том, что вы потеряете возможность использовать диапазоны для этих данных EAV, но в моем случае это не относится (поле Price
применяется ко всем элементам.и таким образом определяется в schema.xml
, чтобы его можно было огранить обычным способом).
Надеюсь, это кому-нибудь поможет!