我正在尝试为产品和供应商之间存在多对多关系的方案设计模式.搜索可以从以产品为中心的方式或以供应商为中心的方式完成.产品可由许多供应商提供,供应商将拥有许多产品.以下是我正在考虑的解决方案,但似乎在字段定义中存在大量冗余,我是否需要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">
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
Solr搜索引擎的优点在于您可以选择一种模式定义,无论是产品还是以供应商为中心,然后利用Solr的强大功能来实现您期望的结果.假设您使用以产品为中心的产品,使用以下方法:
<field name="product" type="string" indexed="true" stored="true" >
<field name="supplier" type="string" indexed="true" stored="true" multiValue="true">
Run Code Online (Sandbox Code Playgroud)
您现在可以通过对产品字段运行查询product:my product来搜索产品,然后如果要搜索特定供应商,您可以使用supplier:my supplier,因为供应商字段是与每个产品相关联的多值字段,您将获得所有产品产品返回供应商所关联的地方.
提高灵活性的另一个选择是利用text示例schema.xml文件中定义的字段,并使用该'copyfield函数将供应商和产品值复制到一个字段,然后您可以搜索它,并将获得返回的所有文档匹配供应商或产品字段上的查询字词.
这是一个示例,仍然使用上面定义的字段.
<field name="text" type="text" indexed="true" stored="false" multiValued="true"/>
<copyField source="product" dest="text" />
<copyField source="supplier" dest="text" />
Run Code Online (Sandbox Code Playgroud)
然后,如果您搜索text:my term它可以是产品或供应商,则将返回索引中与该字段匹配的所有文档.请注意,文本字段具有应用于其的特定索引和查询时间分析器,因此您应该知道正在应用的内容.
此外,如果您需要生成唯一供应商列表,则可以利用Solr Faceting从索引中的所有文档中获取该列表,或仅与当前搜索条件相关.
有关这些主题的更多详细信息,请参阅以下一些参考资料: