Sorting 索尔索特海布里斯酒店
我有一个供应商,为每个单位的产品提供指数股票,方法如下:Sorting 索尔索特海布里斯酒店,sorting,solr,hybris,Sorting,Solr,Hybris,我有一个供应商,为每个单位的产品提供指数股票,方法如下: for (Map.Entry<B2BUnitModel, Integer> unit : stockByUnit.entrySet() ) { document.addField(indexedProperty, hasStock(unit.getValue()), unitUid(unit.getKey())); } 其中localStockForUnt是SolrIndexedPropert
for (Map.Entry<B2BUnitModel, Integer> unit : stockByUnit.entrySet() )
{
document.addField(indexedProperty, hasStock(unit.getValue()), unitUid(unit.getKey()));
}
其中localStockForUnt是SolrIndexedProperty,001和002是单位,true或false是索引值
这是创建它的impex:
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)`[unique=true];name[unique=true];type(code);sortableType(code);currency[default=false];localized[default=false];multiValue[default=false];useForSpellchecking[default=false];useForAutocomplete[default=false];fieldValueProvider;valueProviderParameter`
;$solrIndexedType; localStockForUnt ;boolean ; ; ; ; ; ; ;myResolver;
所以我在hmc中称为“相关性”的“排序”中添加了它,这个“排序”在hmc中只有这个字段
我的疑问是,如何使用localStockForUnt\u 002\u布尔值对结果进行排序?
我确实手动将控制器中的排序设置为测试,我确实将其设置为“相关性”,但由于相关性中使用的字段提供程序(localStockForUnt)索引了两个不同的信息,我如何选择要使用的信息?实际上,您在这里尝试的操作已经由Hybris启动并在多个情况下使用,例如:
属性,如本地化的
,索引为名称
名称字符串
- 与
类似的price
属性被索引为currency
,也用于排序priceValue\u eur\u double
priceValue\u eur\u double
对于:localStockForUnt\u 001\u boolean
priceValue
是字段名称|localStockForUnt
是字段名称。eur
是字段限定符|001
是字段限定符。double
是字段类型|boolean
是字段类型
因此,您的案例与这两个示例没有什么不同,因此您只需要知道如何使用已经存在的内容
实际上,这两个例子的工作原理并没有什么神奇之处
属性添加到SolrIndexedPropertyModel
中,我们称之为isB2bUnit
:
索引属性
dto中添加相同的布尔属性
:
DefaultIndexedPropertyOperator
它负责将SolrIndexedProperty
转换为IndexedProperty
:公共类MyIndexedPerpertOperator扩展了DefaultIndexedPertOperator{
@凌驾
public void populate(SolrIndexedPropertyModel源、IndexedProperty目标)引发ConversionException{
超级。填充(源、目标);
//添加这一行
target.setIsB2bUnit(source.getIsB2bUnit());
}
}
将propulator
注册到弹簧中
DefaultFieldNameTranslator.translateFromProperty(…)
,如果Indexedproperty
的isB2bUnit
为TRUE
,则强制它将您的特定fieldQualifier
添加到fieldName
DefaultFieldNameTranslator.translateFromProperty(…)
如下所示:
受保护的字符串translateFromProperty(SearchQuery SearchQuery,IndexedProperty IndexedProperty,FieldType FieldType){
//...
if(qualifierProvider!=null&&qualifierProvider.canApply(indexedProperty)){
Qualifier=qualifierProvider.getCurrentQualifier();
fieldQualifier=限定符!=null?限定符。toFieldQualifier():null;
}else if(indexedProperty.isLocalized()){
fieldQualifier=searchQuery.getLanguage();
}else if(indexedProperty.isCurrency()){
fieldQualifier=searchQuery.getCurrency();
}
//如果在这里,你必须添加你的else!!!
返回此.fieldNameProvider.getFieldName(indexedProperty、fieldQualifier、fieldType);
}
因此,创建从DefaultFieldNameTranslator
扩展的MyFieldNameTranslator
,并覆盖translateFromProperty(…)
注意:SomeB2bUnitService
此服务不是真实的,但它应该能够返回当前的b2bUnit
公共类MyFieldNameTranslator扩展了DefaultFieldNameTranslator{
//注射!!
私有SomeB2bUnitService SomeB2bUnitService;
@凌驾
受保护的字符串translateFromProperty(SearchQuery SearchQuery,IndexedProperty IndexedProperty,FieldType FieldType){
//...
//...
else if(indexedProperty.getIsB2bUnit()){
fieldQualifier=someB2bUnitService.getCurrentB2bUnit().getCode();
}
返回此.fieldNameProvider.getFieldName(indexedProperty、fieldQualifier、fieldType);
}
}
将转换器
注册到弹簧中
:
localStockForUnt
设置isB2bUnit
为true
:插入\u更新SolrIndexedProperty;solrIndexedType(标识符)[unique=true];名称[unique=true];类型(代码);伊斯布尼特
;$solrIndexedType;本地股票基金;布尔型;真的
注意:一些类和bean可能在Hybris版本之间发生了更改,但概念将保持不变
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)`[unique=true];name[unique=true];type(code);sortableType(code);currency[default=false];localized[default=false];multiValue[default=false];useForSpellchecking[default=false];useForAutocomplete[default=false];fieldValueProvider;valueProviderParameter`
;$solrIndexedType; localStockForUnt ;boolean ; ; ; ; ; ; ;myResolver;