2017-02-22 60 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版本之間有所變化,但概念將保持不變。