Hibernate Search [5.11.5.Final] 动态数字属性:无法自动确定字段“...”的字段类型
Hibernate Search [5.11.5.Final] dynamic numeric properties: Cannot automatically determine the field type for field '...'
我在正确索引动态数字字段时遇到了一些问题,它们似乎总是被索引为字符串。
据我所知,在索引动态数字字段时我必须使用动态模板:
PUT /com.product.product
{
"mappings": {
"com.product.Product": {
"dynamic_templates": [
{
"numeric_sort": {
"match_mapping_type": "*",
"match_pattern": "regex",
"match": "^sort_num_.*",
"mapping": {
"type": "double"
}
}
}
]
}
}
}
我正在事件监听器中上传:
@Configuration
@Transactional
public abstract class DynamicTemplateConfig {
@EventListener
public void addDynamicTemplates(ContextRefreshedEvent event) {
if (this.searchIndexingIsActive) {
this.addDynamicTemplates();
}
}
...
}
我正在为字段桥中的属性编制索引:
public class PropertyValueFieldBridge implements FieldBridge {
...
private void indexBigDecimalProperties(Document document, LuceneOptions luceneOptions, PropertyBigDecimal property) {
String fieldName = PREFIX_SORT + NUMERIC + DELIMITER + property.getProperty().getCode();
Double indexedValue = property.getValue().doubleValue();
luceneOptions.addNumericFieldToDocument(
fieldName,
indexedValue,
document);
}
}
在对这些 BigDecimal 属性进行索引后,我总是以 属性 索引的字符串结尾:
"_source": {
"id": "1",
"sort_id": 1,
"filter_id": 1,
"sort_num_quantity": "115.0"
}
当我尝试对此 属性 进行排序时,出现以下异常:
org.hibernate.search.exception.SearchException: Cannot automatically determine the field type for field 'sort_num_quantity'. Use byField(String, Sort.Type) to provide the sort type explicitly.
at org.hibernate.search.query.dsl.sort.impl.SortFieldStates.getCurrentSortFieldTypeFromMetamodel(SortFieldStates.java:177) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
at org.hibernate.search.query.dsl.sort.impl.SortFieldStates.determineCurrentSortFieldTypeAutomaticaly(SortFieldStates.java:150) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
at org.hibernate.search.query.dsl.sort.impl.ConnectedSortContext.byField(ConnectedSortContext.java:42) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
我试图避免使用 byField(String, Sort.Type)
,因为它需要对每个 属性 进行显式验证,我可能不知道名称和类型。
我在索引过程中做错了什么吗?
提前致谢
我不认为你做错了什么。 Hibernate Search 5 中的实验性 Elasticsearch 集成并不真正支持动态字段。不能预先指定字段的类型,显然动态字段默认是String类型
升级到 Hibernate Search 6(目前处于候选发布阶段)将是一个解决方案,因为 it supports dynamic fields through field templates
但是,Hibernate Search 6 API 不同,因此迁移可能需要大量工作。
我在正确索引动态数字字段时遇到了一些问题,它们似乎总是被索引为字符串。
据我所知,在索引动态数字字段时我必须使用动态模板:
PUT /com.product.product
{
"mappings": {
"com.product.Product": {
"dynamic_templates": [
{
"numeric_sort": {
"match_mapping_type": "*",
"match_pattern": "regex",
"match": "^sort_num_.*",
"mapping": {
"type": "double"
}
}
}
]
}
}
}
我正在事件监听器中上传:
@Configuration
@Transactional
public abstract class DynamicTemplateConfig {
@EventListener
public void addDynamicTemplates(ContextRefreshedEvent event) {
if (this.searchIndexingIsActive) {
this.addDynamicTemplates();
}
}
...
}
我正在为字段桥中的属性编制索引:
public class PropertyValueFieldBridge implements FieldBridge {
...
private void indexBigDecimalProperties(Document document, LuceneOptions luceneOptions, PropertyBigDecimal property) {
String fieldName = PREFIX_SORT + NUMERIC + DELIMITER + property.getProperty().getCode();
Double indexedValue = property.getValue().doubleValue();
luceneOptions.addNumericFieldToDocument(
fieldName,
indexedValue,
document);
}
}
在对这些 BigDecimal 属性进行索引后,我总是以 属性 索引的字符串结尾:
"_source": {
"id": "1",
"sort_id": 1,
"filter_id": 1,
"sort_num_quantity": "115.0"
}
当我尝试对此 属性 进行排序时,出现以下异常:
org.hibernate.search.exception.SearchException: Cannot automatically determine the field type for field 'sort_num_quantity'. Use byField(String, Sort.Type) to provide the sort type explicitly.
at org.hibernate.search.query.dsl.sort.impl.SortFieldStates.getCurrentSortFieldTypeFromMetamodel(SortFieldStates.java:177) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
at org.hibernate.search.query.dsl.sort.impl.SortFieldStates.determineCurrentSortFieldTypeAutomaticaly(SortFieldStates.java:150) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
at org.hibernate.search.query.dsl.sort.impl.ConnectedSortContext.byField(ConnectedSortContext.java:42) ~[hibernate-search-engine-5.11.5.Final.jar:5.11.5.Final]
我试图避免使用 byField(String, Sort.Type)
,因为它需要对每个 属性 进行显式验证,我可能不知道名称和类型。
我在索引过程中做错了什么吗?
提前致谢
我不认为你做错了什么。 Hibernate Search 5 中的实验性 Elasticsearch 集成并不真正支持动态字段。不能预先指定字段的类型,显然动态字段默认是String类型
升级到 Hibernate Search 6(目前处于候选发布阶段)将是一个解决方案,因为 it supports dynamic fields through field templates 但是,Hibernate Search 6 API 不同,因此迁移可能需要大量工作。