8

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

我用它来存储产品特征,例如:color_feature、diameter_feature、material_feature 等。这些字段的数量不是恒定的,因为产品在变化。

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

4

2 回答 2

6

Solr 目前不支持 facet.field 参数中的通配符。
所以*_feature不会为你工作。

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

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

qt=requesthandlerin 请求将始终包含这些方面。

于 2011-09-22T10:02:47.680 回答
5

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

例如,商店中的 T 恤可能具有Color( BlackWhiteRed等) 和Size( SmallMedium等) 属性,而同一商店中的蜡烛可能具有Scent( PumpkinVanilla等) 变体。本质上,这是一种实体-属性-值 (EAV) 关系数据库设计,用于描述产品的某些功能。

由于schema.xmlSOLR 中的文件从分面的角度来看是平坦的,因此我通过将变体转换为单个多值字段来解决它...

<field
  name="variation"
  type="string"
  indexed="true"
  stored="true"
  required="false"
  multiValued="true" />

...将数据库中的数据推送到这些字段中,如Color|Black,Size|SmallScent|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它可以以通常的方式刻面)。

希望这对某人有帮助!

于 2013-01-25T20:07:48.833 回答