索尔排序海布里斯



>我有一个供应商,每个单位的产品指数股票,这样:

for (Map.Entry<B2BUnitModel, Integer> unit : stockByUnit.entrySet() )
{
document.addField(indexedProperty, hasStock(unit.getValue()), unitUid(unit.getKey()));
}

所以这是在 solr 索引后的结果:

"localStockForUnt_001_boolean": true,
"localStockForUnt_002_boolean": true,

其中 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_002_boolean对结果进行排序? 我确实在控制器中手动设置了排序来进行测试,我确实将其设置为"相关性",但由于相关性中使用的字段提供者 (localStockForUnt) 索引了两个不同的信息,我如何选择使用哪一个?

实际上,您在这里尝试做的事情已经被 Hybris 发起并在几种情况下使用,例如:

  • localized属性,如name,索引为name_en_string
  • 具有currency(如price)的属性将作为priceValue_eur_double编制索引,也用于排序。

对于priceValue_eur_double      |   对于localStockForUnt_001_boolean
字段名称  priceValue|  localStockForUnt是字段的名称。
eur是字段限定符    |   001是字段限定符。
double是字段类型 |   boolean是字段类型  。

因此,您在这里的情况与这两个示例没有什么不同,因此您只需要知道如何使用已经存在的内容。

实际上,这两个例子的工作原理并没有什么神奇之处!

  1. 首先,添加新的布尔attributeSolrIndexedPropertyModel我们称之为isB2bUnit
<!-- add this to your *-items.xml -->
<itemtype code="SolrIndexedProperty" autocreate="false" generate="false">
<attributes>
<attribute qualifier="isB2bUnit" type="java.lang.boolean">
<persistence type="property" />
<!-- i would prefer to add a default value here : FALSE -->
</attribute>
</attributes>
</itemtype>
  1. 接下来,您必须在IndexedPropertydto 中添加相同的boolean attribute
<!-- add this to your *-beans.xml -->
<bean class="de.hybris.platform.solrfacetsearch.config.IndexedProperty">
<property name="isB2bUnit" type="boolean"/>     
</bean>
  1. 然后你需要覆盖它负责从SolrIndexedProperty转换为IndexedPropertyDefaultIndexedPropertyPopulator
public class MyIndexedPropertyPopulator extends DefaultIndexedPropertyPopulator {
@Override
public void populate(SolrIndexedPropertyModel source, IndexedProperty target) throws ConversionException {
super.populate(source, target);
//add this line
target.setIsB2bUnit(source.getIsB2bUnit());
}
}

propulator注册到春季。

<!-- add this to your *-spring.xml -->
<alias name="myIndexedPropertyPopulator" alias="indexedPropertyPopulator" />
<bean id="myIndexedPropertyPopulator" class="com.foo.bar.MyIndexedPropertyPopulator" parent="defaultIndexedPropertyPopulator" />
  1. 这个想法是DefaultFieldNameTranslator.translateFromProperty(...)挂接到此方法,并强制它添加您的特定fieldQualifier,如果IndexedpropertyisB2bUnitTRUE,则b2bUnit.codefieldName

原始DefaultFieldNameTranslator.translateFromProperty(...)是这样的:

protected String translateFromProperty(SearchQuery searchQuery, IndexedProperty indexedProperty, FieldType fieldType) {
//...
if(qualifierProvider != null && qualifierProvider.canApply(indexedProperty)) {
Qualifier qualifier = qualifierProvider.getCurrentQualifier();
fieldQualifier = qualifier != null?qualifier.toFieldQualifier():null;
} else if(indexedProperty.isLocalized()) {
fieldQualifier = searchQuery.getLanguage();
} else if(indexedProperty.isCurrency()) {
fieldQualifier = searchQuery.getCurrency();
}
//you have to add your else if here!!!
return this.fieldNameProvider.getFieldName(indexedProperty, fieldQualifier, fieldType);
}

因此,创建从DefaultFieldNameTranslator延伸并覆盖translateFromProperty(...)MyFieldNameTranslator

注意:SomeB2bUnitService此服务不是真实的,但它应该能够返回当前的 b2bUnit。

public class MyFieldNameTranslator extends DefaultFieldNameTranslator {
//To be injected!!
private SomeB2bUnitService someB2bUnitService;
@Override
protected String translateFromProperty(SearchQuery searchQuery, IndexedProperty indexedProperty, FieldType fieldType) {
//...
//...
else if(indexedProperty.getIsB2bUnit()) {
fieldQualifier = someB2bUnitService.getCurrentB2bUnit().getCode();
}
return this.fieldNameProvider.getFieldName(indexedProperty, fieldQualifier, fieldType);
}
}

Translator注册到Spring

<!-- add this to your *-spring.xml -->
<alias name="myfieldNameTranslator" alias="fieldNameTranslator" />
<bean id="myfieldNameTranslator" class="com.foo.bar.MyFieldNameTranslator" parent="defaultfieldNameTranslator">
<property name="someB2bUnitService" ref="someB2bUnitService" />
</bean>
  1. 编辑:现在您所要做的就是将isB2bUnit设置为localStockForUnttrue
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)[unique=true] ;name[unique=true] ;type(code) ;isB2bUnit
;$solrIndexedType ;localStockForUnt  ;boolean  ;true

注意:某些类和 bean 可能在 Hybris 版本之间发生了变化,但概念将保持不变。

最新更新