Solr 排序 Hybris
Solr Sort 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 是单位,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中的'sort'中添加了它叫'relevance',这个'sort'在hmc中只有这个字段。
我的疑问是,我如何设置它来对我的结果进行排序,例如使用 localStockForUnt_002_boolean?
我确实在控制器中手动设置了排序来测试,我确实将它设置为 "relevance",但是由于相关字段的提供者 (localStockForUnt) 索引了两个不同的信息,我如何 select 使用哪一个?
实际上,您在此处尝试执行的操作已由 Hybris 启动并在多个案例中使用,例如:
localized
属性,如 name
,索引为 name_en_string
。
- 具有
currency
的属性,如 price
被索引为 priceValue_eur_double
,也用于排序。
对于 :priceValue_eur_double
| 对于 : localStockForUnt_001_boolean
.
priceValue
是字段的名称 | localStockForUnt
是字段的名称。
eur
是字段限定符 | 001
是字段限定符。
double
是字段类型 | boolean
是字段类型。
所以你这里的情况与这两个例子没有什么不同,因此你只需要知道如何使用已经存在的东西。
实际上这两个示例的工作原理并没有什么神奇之处!
- 首先,将新的布尔值
attribute
添加到 SolrIndexedPropertyModel
让我们称之为 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>
- 接下来你必须在
IndexedProperty
dto 中添加相同的 boolean attribute
:
<!-- add this to your *-beans.xml -->
<bean class="de.hybris.platform.solrfacetsearch.config.IndexedProperty">
<property name="isB2bUnit" type="boolean"/>
</bean>
- 然后你需要覆盖
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
注册到spring。
<!-- add this to your *-spring.xml -->
<alias name="myIndexedPropertyPopulator" alias="indexedPropertyPopulator" />
<bean id="myIndexedPropertyPopulator" class="com.foo.bar.MyIndexedPropertyPopulator" parent="defaultIndexedPropertyPopulator" />
- 想法是挂接到此方法
DefaultFieldNameTranslator.translateFromProperty(...)
并强制它添加您的特定 fieldQualifier
即 b2bUnit.code
到 fieldName
如果 [=34= Indexedproperty
的 ] 是 TRUE
.
原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
延伸的 MyFieldNameTranslator
并覆盖 translateFromProperty(...)
.
注意:SomeB2bUnitService
此服务不是真实的,但它应该能够return当前的 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>
- 编辑:现在您所要做的就是将
isB2bUnit
设置为 true
for localStockForUnt
:
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)[unique=true] ;name[unique=true] ;type(code) ;isB2bUnit
;$solrIndexedType ;localStockForUnt ;boolean ;true
注意:某些 类 和 bean 可能在 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 是单位,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中的'sort'中添加了它叫'relevance',这个'sort'在hmc中只有这个字段。
我的疑问是,我如何设置它来对我的结果进行排序,例如使用 localStockForUnt_002_boolean? 我确实在控制器中手动设置了排序来测试,我确实将它设置为 "relevance",但是由于相关字段的提供者 (localStockForUnt) 索引了两个不同的信息,我如何 select 使用哪一个?
实际上,您在此处尝试执行的操作已由 Hybris 启动并在多个案例中使用,例如:
localized
属性,如name
,索引为name_en_string
。- 具有
currency
的属性,如price
被索引为priceValue_eur_double
,也用于排序。
对于 :priceValue_eur_double
| 对于 : localStockForUnt_001_boolean
.
priceValue
是字段的名称 | localStockForUnt
是字段的名称。
eur
是字段限定符 | 001
是字段限定符。
double
是字段类型 | boolean
是字段类型。
所以你这里的情况与这两个例子没有什么不同,因此你只需要知道如何使用已经存在的东西。
实际上这两个示例的工作原理并没有什么神奇之处!
- 首先,将新的布尔值
attribute
添加到SolrIndexedPropertyModel
让我们称之为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>
- 接下来你必须在
IndexedProperty
dto 中添加相同的boolean attribute
:
<!-- add this to your *-beans.xml -->
<bean class="de.hybris.platform.solrfacetsearch.config.IndexedProperty">
<property name="isB2bUnit" type="boolean"/>
</bean>
- 然后你需要覆盖
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
注册到spring。
<!-- add this to your *-spring.xml -->
<alias name="myIndexedPropertyPopulator" alias="indexedPropertyPopulator" />
<bean id="myIndexedPropertyPopulator" class="com.foo.bar.MyIndexedPropertyPopulator" parent="defaultIndexedPropertyPopulator" />
- 想法是挂接到此方法
DefaultFieldNameTranslator.translateFromProperty(...)
并强制它添加您的特定fieldQualifier
即b2bUnit.code
到fieldName
如果 [=34=Indexedproperty
的 ] 是TRUE
.
原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
延伸的 MyFieldNameTranslator
并覆盖 translateFromProperty(...)
.
注意:SomeB2bUnitService
此服务不是真实的,但它应该能够return当前的 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>
- 编辑:现在您所要做的就是将
isB2bUnit
设置为true
forlocalStockForUnt
:
INSERT_UPDATE SolrIndexedProperty;solrIndexedType(identifier)[unique=true] ;name[unique=true] ;type(code) ;isB2bUnit
;$solrIndexedType ;localStockForUnt ;boolean ;true
注意:某些 类 和 bean 可能在 Hybris 版本之间发生了变化,但概念将保持不变。