如何在Hibernate Search中索引可选实体关联关系?
解决方案
首先明确:你遇到的关联为null时对应字段不索引是Hibernate Search的默认行为,但这不影响各自实体自身字段的搜索。要实现“无论关联状态如何,都能通过keyword和model搜索到对应实体”,可以从两个方向调整:
1. 让实体索引包含关联字段(如果存在)
修改Product实体,给mappedBy字段添加@IndexedEmbedded注解,这样当关联的Alias存在时,Product的索引会包含Alias的keyword字段;当关联为null时,Product自身的model字段依然会被正常索引,不影响搜索。
修改后的Product代码:
@Entity @Indexed class Product( @field:FullTextField var model: String, @OneToOne(mappedBy = "mappedTo", optional = true, cascade = [CascadeType.ALL]) @IndexedEmbedded // 嵌入关联Alias的可索引字段到Product索引 var mappedBy: Alias? ) { @Id var id: Long = 0 }
Alias实体的现有代码已经正确配置了@IndexedEmbedded在mappedTo字段上,当关联的Product存在时,Alias的索引会包含Product的model字段;关联为null时,Alias自身的keyword字段正常索引。
2. 构建跨实体、跨字段的搜索查询
如果希望在同一个搜索框输入内容,同时匹配model和keyword(不管是在Product还是Alias实体中),可以构建跨实体的查询,同时对两个字段进行匹配:
val searchSession = Search.session(entityManager) val searchResult = searchSession.search(listOf(Product::class.java, Alias::class.java)) .where { f -> f.bool() .should(f.match().field("model").matching(搜索关键词)) .should(f.match().field("keyword").matching(搜索关键词)) } .fetch(20) // 按需调整返回数量
关于RoutingBinder的说明
你尝试用RoutingBinder是方向错了——RoutingBinder的作用是将文档路由到不同的索引分片,用来做分片策略,和字段是否被索引完全无关,所以用它解决这个问题行不通。
内容的提问来源于stack exchange,提问作者Roque Sosa
相关产品推荐
相关产品推荐

