我正在尝试为产品和供应商之间存在多对多关系的方案设计架构。搜索可以从以产品为中心的方式或以供应商为中心的方式完成。产品可由许多供应商提供,供应商将拥有许多产品。以下是我正在考虑的解决方案,但似乎在字段定义中存在大量冗余,我是否需要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>
答案 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从索引中的所有文档中获取该列表,或仅与当前搜索条件相关。
有关这些主题的更多详细信息,请参阅以下一些参考资料: