2017-02-22 3 views
2

ich einen Anbieter haben, für jede Einheit für das Produkt Wich Index Lager, auf diese Weise:Solr Sortieren Hybris

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

so ist dies nach dem Index in solr führen:

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

wo localStockForUnt ist SolrIndexedProperty 001 und 002 sind die Einheiten und wahr oder falsch sind die indizierten Werte.

dies der Impex ist es zu schaffen:

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; 

so habe ich es in der ‚Art‘ ‚Relevanz‘ in HMC genannt, diese ‚Art‘ hat gerade dieses Feld in HMC.

Mein Zweifel ist, wie kann ich darauf setzen, sortieren mein Ergebnis zum Beispiel localStockForUnt_002_boolean? Ich habe Sortierung in Controller manuell zu testen, habe ich es auf "Relevanz", aber da der Anbieter von Feld in Relevanz (localStockForUnt) Index zwei verschiedene Informationen, wie kann ich wählen, welche zu verwenden?

Antwort

0

Eigentlich, was Sie versuchen, hier zu tun war bereits in mehreren Fällen von Hybris initiiert und verwendet worden, zum Beispiel:

  • localized Eigenschaften wie die name, wie name_en_string indiziert.
  • Eigenschaften mit currency wie price wird als priceValue_eur_double indiziert und auch für Sort verwendet.

Für: priceValue_eur_double           |     Für: localStockForUnt_001_boolean.
priceValue ist der Name des Feldes     |     localStockForUnt ist der Name des Feldes.
eur ist der Feldqualifikator     |     001 ist der Feldkennzeichner.
double ist der Feldtyp     |     boolean ist der Feldtyp.

Also Ihr Fall hier ist nicht anders als diese beiden Beispiele, daher müssen Sie nur wissen, wie man verwendet, was bereits existiert.

Eigentlich nichts Magisches daran, wie diese beiden Beispiele funktionieren!

  1. Zu allererst, fügen Sie neue boolean attribute-SolrIndexedPropertyModel ist es isB2bUnit lassen nennen:
<!-- 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. Weiter Sie haben die gleiche boolean attribute in der IndexedProperty hinzufügen dto:
<!-- add this to your *-beans.xml --> 
<bean class="de.hybris.platform.solrfacetsearch.config.IndexedProperty"> 

    <property name="isB2bUnit" type="boolean"/>  

</bean> 
  1. Dann brauchen Sie DefaultIndexedPropertyPopulator es ist die Verantwortung von SolrIndexedProperty zu IndexedProperty zur Umwandlung außer Kraft zu setzen: die propulator in den Frühling
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()); 

    } 

} 

registrieren.

<!-- add this to your *-spring.xml --> 

<alias name="myIndexedPropertyPopulator" alias="indexedPropertyPopulator" /> 

<bean id="myIndexedPropertyPopulator" class="com.foo.bar.MyIndexedPropertyPopulator" parent="defaultIndexedPropertyPopulator" /> 
  1. Die Idee ist in diesem Verfahren einzuhaken DefaultFieldNameTranslator.translateFromProperty(...) und zwingen es, spezifische fieldQualifier hinzuzufügen, die b2bUnit.code zum fieldName ist, wenn die isB2bUnit des IndexedpropertyTRUE ist.

Die ursprüngliche DefaultFieldNameTranslator.translateFromProperty(...) ist wie folgt:

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); 

} 

So MyFieldNameTranslator erstellen, die translateFromProperty(...) von DefaultFieldNameTranslator und außer Kraft setzen erstreckt.

Hinweis: SomeB2bUnitService Dieser Dienst ist nicht real, aber es sollte in der Lage sein, die aktuelle b2bUnit zurückzugeben.

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); 

    } 

} 

Registrieren Sie den Translator in 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. Edit: jetzt alles, was Sie tun müssen, ist isB2bUnit zu true setzen für localStockForUnt:
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)[unique=true] ;name[unique=true] ;type(code) ;isB2bUnit 
;$solrIndexedType ;localStockForUnt ;boolean ;true 

Hinweis: dass einige Klassen und Bohnen h wurden zwischen Hybris-Versionen geändert, aber das Konzept bleibt gleich.

Verwandte Themen