java - Hibernate 搜索与循环关系

标签 java lucene hibernate-search

美好的一天。

我遇到了一种情况,类似于下面介绍的情况。

@Entity
@Table(name="EntityDO")
public class EntityDO {
    @Id
    private Long id;

    @Column(nullable = false)
    private String name;

    @OneToMany(mappedBy = "parentEntity")
    private Set<EntityDO> ownedEntities;

    @ManyToOne
    @JoinColumn(name="PARENT_ID", nullable=true)
    private EntityDO parentEntity;

    ...
}

我需要通过 Hibernate 搜索来索引该实体,以便能够搜索不仅通过实体名称匹配的实体,还可以通过匹配层次结构中的某些父级名称来搜索实体。

我的想法如下:

  1. 我需要递归索引索引实体的“name”成员+实体父级的“name”+进一步等,这样它们就到达同一个lucene文档的字段。

  2. 然后我将能够在一个字段上创建一个简单的查询来检索所有需要的实体。

事实上,我对第 1 点有疑问。由于循环关系以及禁止空前缀的事实,@IndexedEmbedded 不适合这里(我不希望实体名称及其父实体位于不同的字段中)。

是否可以以自定义方式进行实体索引?或者也许我最初的想法是错误的,并且完全有另一种方法可以解决此类问题?

最佳答案

如果您想将父名称也索引到字段 name 中,您可以编写自己的自定义桥 - http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#d0e4426 。您必须小心的一件事是检测任何循环依赖项。

如果您有给定的最大深度,您也可以只使用@IndexedEmbedded,并在查询构建时为配置的最大深度的字段添加查询术语。该解决方案是否可行将取决于您想要索引的深度。对于只是几个级别,我更喜欢这个选项而不是自定义桥。

关于java - Hibernate 搜索与循环关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23109952/

相关文章:

java - 为什么我的 @Scheduled Spring Boot 任务在 Azure 中运行不一致?

java - Eclipse 的 Swing 设计器插件

c# - lucene.net IndexWriter 和 Azure WebJob

mysql - 高效过滤/搜索

java - 在 pom.xml 中添加 hibernate-search-orm 后出错

java - 为什么我的计数器没有计数,并且我的 ArrayList 没有将新的整数值添加到数组中?

java - 在登录方法上同步代码

elasticsearch - 当具有两个数字的数组定义最大范围时,有没有一种查询范围的方法

java - hibernate 搜索: single search term with space

java - 具有自动完成和模糊功能的 Hibernate 搜索