2017-02-22 44 views
2

我有一个供应商,至极指数成份股为产品的每一个单位,这种方式:Solr的排序款Hybris

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是单位,真或假是索引值。

这是创建它的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)索引了两个不同的信息,我该如何选择使用哪一个?

回答

0

其实你正试图在这里做的是已经启动并在款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> 
  • 接下来,您必须添加相同boolean attributeIndexedProperty dto:
  • <!-- add this to your *-beans.xml --> 
    <bean class="de.hybris.platform.solrfacetsearch.config.IndexedProperty"> 
    
        <property name="isB2bUnit" type="boolean"/>  
    
    </bean> 
    
    1. 然后,你需要重写DefaultIndexedPropertyPopulator它是负责从SolrIndexedProperty转换为IndexedProperty
    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" /> 
    
  • 的想法是挂接到这个方法DefaultFieldNameTranslator.translateFromProperty(...)并迫使其添加具体fieldQualifierb2bUnit.codefieldName如果IndexedpropertyisB2bUnitTRUE
  • 原来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); 
    
    } 
    

    因此,创建MyFieldNameTranslatorDefaultFieldNameTranslator延伸并覆盖translateFromProperty(...)

    注意: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); 
    
        } 
    
    } 
    

    注册TranslatorSpring

    <!-- 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> 
    
  • 编辑:现在你所要做的就是设置isB2bUnittruelocalStockForUnt
  • INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)[unique=true] ;name[unique=true] ;type(code) ;isB2bUnit 
    ;$solrIndexedType ;localStockForUnt ;boolean ;true 
    

    注意:有些类和beans可能h在Hybris版本之间有所变化,但概念将保持不变。