solr模式设计,用于多对多的实体定义

时间:2011-09-14 10:34:06

标签: solr

我正在尝试为产品和供应商之间存在多对多关系的方案设计架构。搜索可以从以产品为中心的方式或以供应商为中心的方式完成。产品可由许多供应商提供,供应商将拥有许多产品。以下是我正在考虑的解决方案,但似乎在字段定义中存在大量冗余,我是否需要2个实体定义来支持以产品或供应商为中心的搜索。看起来不是最佳。

在搜索供应商时,"产品"可以定义" multiValue = true"在搜索产品时,"供应商"可以定义" multiValue = true"

<!-- Field definitions to support supplier search -->
<field name="s_supplier" type="string" indexed="true" stored="true" >
<field name="s_product"  type="string" indexed="true" stored="true" multiValue="true">

<!-- Field definition to support product search -->
<field name="p_product"  type="string" indexed="true" stored="true" >
<field name="p_supplier"  type="string" indexed="true" stored="true" multiValue="true">

datahandler中的实体定义是

<entity name="products" ....>
   <field name="p_product" column="">
   <entity name="suppliers">
      <field name="p_supplier">
    </entity>
</entity>

<entity name="suppliers" ....>
   <field name="s_supplier" column="">
   <entity name="products">
      <field name="s_product" column="">
    </entity>
</entity>

1 个答案:

答案 0 :(得分:9)

Solr搜索引擎的优点在于您可以选择一种架构定义,无论是产品还是以供应商为中心,然后利用Solr的强大功能来实现您期望的结果。假设您使用以产品为中心的产品,使用以下内容:

<field name="product" type="string" indexed="true" stored="true" > 
<field name="supplier" type="string" indexed="true" stored="true" multiValue="true">

现在,您只需针对产品字段product:my product运行查询即可搜索产品,然后如果要搜索特定供应商,则只需使用supplier:my supplier,因为供应商字段为与每个产品相关联的多值字段,您将获得与该供应商关联的所有产品。

提高灵活性的另一个选择是利用示例schema.xml文件中定义的text字段,并使用'copyfield函数将供应商和产品值复制到一个字段中然后可以搜索它,并且将在供应商或产品字段中获得与查询字词匹配的所有文档。

这是一个例子,仍然使用上面定义的字段。

<field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
<copyField source="product" dest="text" />
<copyField source="supplier" dest="text" />

然后,如果您搜索text:my term,它可以是产品或供应商,并且将返回索引中与该字段匹配的所有文档。请注意,文本字段应用了特定的索引和查询时间分析器,因此您应该知道正在应用的内容。

此外,如果您需要生成唯一供应商列表,您可以利用Solr Faceting从索引中的所有文档中获取该列表,或仅与当前搜索条件相关。

有关这些主题的更多详细信息,请参阅以下一些参考资料: