gpt4 book ai didi

java - Hibernate-search:通过在 hibernate-search 中以编程方式注册字段,基类字段未在 elastic-search 中注册

转载 作者:行者123 更新时间:2023-12-02 09:00:58 29 4
gpt4 key购买 nike

我在基类中声明了某些字段,并且我想仅为某些子类(实体)注册这些字段。

因此,我不想通过 @Field 注释基类中的这些字段,尽管只需以编程方式注册某些实体就足够了。

但是在基本实体中声明的字段未注册/映射到 Elasticsearch ,如果尝试搜索,则会抛出以下异常。

我还尝试过将这些字段移动到实体本身,而不是在基类中声明它并以编程方式注册这些字段对我有用,因此只有当这些字段位于基类中时才不起作用。

这是我的示例代码

public class BaseEntity{

@Column(name = "created_timestamp")
private String createdTimeStamp;

@Column(name = "created_by")
private ZonedDateTime createdBy;

//getter and setter

}
@Entity
@Indexed
public class BookEntity extends BaseEntity{

//other fields
}
@Entity
@Indexed
public class PaperBookEntity extends BaseEntity{

//other fields
}
public class HibernateSearchFieldMappingService{

@Autowired
private SearchMapping searchMapping;

@Override
public <T extends BaseEntity> void registerAuditFields(Class<T> entityClass) {
LOG.info("Registering audit fields (createdTimeStamp and createdBy) of entity {}", entityClass);
IndexedMapping indexedMapping = searchMapping.entity(entityClass).indexed();
FieldMapping fieldMapping = indexedMapping.property("createdTimeStamp", ElementType.FIELD).field();
fieldMapping.dateBridge(Resolution.SECOND);
fieldMapping.sortableField();
indexedMapping.entity(entityClass).indexed().property("createdBy", ElementType.FIELD).field().normalizer("lowercase");
}

}

这是我的堆栈跟踪

org.hibernate.search.exception.SearchException: Unable to find field createdBy in com.*.*.*.BookEntity
at org.hibernate.search.engine.spi.DocumentBuilderIndexedEntity.objectToString(DocumentBuilderIndexedEntity.java:1052)
at org.hibernate.search.query.dsl.impl.FieldContext.objectToString(FieldContext.java:75)
at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.buildSearchTerm(ConnectedMultiFieldsTermQueryBuilder.java:149)
at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:113)
at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:72)

我使用的 Hibernate 版本是,

hibernate-search-elasticsearch, hibernate-search-orm = 5.11.4.Final

最佳答案

Hibernate Search 5 中的编程 API 无法识别“继承”属性,只能识别直接在您要映射的类型上声明的属性。请参阅HSEARCH-1108 .

该问题已在 Hibernate Search 6 中得到解决,因此您可以通过升级来解决。请注意,Hibernate Search 6 仍处于 Beta 阶段,API 也有很大不同。请参阅here获取入门指南。

要在 Hibernate Search 5 中实现此功能而不升级到 6,通常的解决方案不是使用编程 API,而是重写您希望字段出现的类中的 getter,并对重写的 getter 进行注释。

例如:

@MappedSuperclass
public class BaseEntity{

@Column(name = "created_by")
private String createdBy;

@Column(name = "created_timestamp")
private ZonedDateTime createdTimeStamp;

public String getCreatedBy() {
return createdBy;
}

public String getCreatedTimeStamp() {
return createdTimeStamp;
}
}
@Entity
@Indexed
public class BookEntity extends BaseEntity{

@Override
@Field(normalizer = @Normalizer(definition = "lowercase"))
public String getCreatedBy() {
return super.getCreatedBy();
}

@Override
@Field
@SortableField
public String getCreatedTimeStamp() {
return createdTimeStamp;
}
}

关于java - Hibernate-search:通过在 hibernate-search 中以编程方式注册字段,基类字段未在 elastic-search 中注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60162311/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com