【发布时间】:2018-02-28 18:52:46
【问题描述】:
假设我有一个要求,我不想在 Hybris 前端搜索具有特定属性值的产品。即使 Hybris SOLR index 中存在以下产品。
如何解决这个问题?
【问题讨论】:
假设我有一个要求,我不想在 Hybris 前端搜索具有特定属性值的产品。即使 Hybris SOLR index 中存在以下产品。
如何解决这个问题?
【问题讨论】:
应将哪些产品编入索引由灵活的搜索查询定义。
您可以通过导航到System/Facet Search/Indexed Types 在hmc/backoffice 中找到它们。选择您的索引类型。在那里您可以找到完整和更新的查询。
完整的查询由Full SolR Indexer CronJob 使用,它每晚在默认情况下运行并完全重新创建 SolR 索引。更新查询同样被 Update SolR Indexer CronJob 使用,默认情况下每小时运行一次,并且只更新其间已更改的产品。因此,您会在更新查询中找到类似 WHERE {sl:modifiedtime} >= ?lastIndexTime 的内容,而完整查询中缺少该内容。
您可以根据需要以各种方式更改查询。例如。假设您的查询是:
SELECT {pk} FROM {Product}
改成
SELECT {pk} FROM {Product} WHERE {myAttribute} LIKE 'index this product'
PS:在您关联的 Facet Search Config (System/Facet Search/Facet Search Config) 上找到 Solr Indexer Cronjobs。
PPS:还有一个删除查询,您可以在其中定义应从SolR 索引中删除的产品。
【讨论】:
我可以想到两种使用 Solr 在前端实现产品可见性的方法。
1.仅索引您需要的那些产品。正如@Johannes Nolte 所说,调整完整和更新索引查询
这里的问题是这种方式完全从搜索中删除产品。如果有需要根据其他属性显示/隐藏产品的要求,则不能这样做。
其他方式
2。在向 Solr 服务器点击实际 Solr 查询之前添加搜索过滤器
假设您要根据 productType(Type A & Type B)显示/隐藏产品
用户 1 有资格查看 A 类产品,用户 2 有资格查看 B 类产品。
您需要首先索引您的 productType 属性并使其 facet=true。确保您选择了 visible=false,以便此属性在店面的构面中不可见。
查看 OOTB SearchFiltersPopulator 类,您将了解我们如何在发送到 Solr 服务器进行搜索之前在 Solr 查询中添加动态过滤器。
类似地,您可以创建自己的 filterPopulator,例如MySearchFiltersPopulator,其中包含您的自定义可见性逻辑。
if Current_User is User 1
target.getSearchQuery().addFacetValue("productType", "Type A");
else Current_User is User 2
target.getSearchQuery().addFacetValue("productType", "Type B");
最后在commerceSearchQueryPageableConverter链中添加自定义填充器。
<bean parent="modifyPopulatorList">
<property name="list" ref="commerceSearchQueryPageableConverter" />
<property name="add" ref="mySearchFiltersPopulator" />
</bean>
【讨论】: