динамические поля фасетов с помощью Apache Solr - PullRequest
7 голосов
/ 22 сентября 2011

Я определил динамическое поле в ApacheSolr:

Я использую его для хранения таких продуктов, как: color_feature, Diameter_feature, material_feature и так далее. Количество этих полей не является постоянным, потому что продукты меняются.

Возможно ли получить побочный результат для всех этих динамических полей с одним и тем же запросом или мне нужно всегда писать все поля в запросе, например ... facet.field=color_feature&facet.field=diameter_feature&facet.field=material_feature&facet.field= ...

Ответы [ 2 ]

5 голосов
/ 26 января 2013

Я был в похожей ситуации, когда работал на платформе электронной коммерции.Каждый элемент имел статические поля (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, чтобы его можно было огранить обычным способом).

Надеюсь, это кому-нибудь поможет!

4 голосов
/ 22 сентября 2011

В настоящее время Solr не поддерживает подстановочные знаки в параметре facet.field.
Так что *_feature не будет работать для вас.

Может захотеть проверить это - https://issues.apache.org/jira/browse/SOLR-247

Если вы не хотите передавать параметры, вы можете легко добавить их к значениям по умолчанию вашего обработчика запросов.

qt=requesthandler в запросе всегда будет включать эти аспекты.

...