Hibernate Search - 在 ManyToOne 关系中搜索

Hibernate Search - search in ManyToOne relation

我有两个索引实体。 玩家:

@Indexed
@Entity
public class Player {

    @Field
    private String firstName;

    @ContainedIn
    @ManyToOne
    private Club playersClub;

}

和俱乐部:

@Indexed
@Entity
public class Club {

    @Fields({
        @Field(store=Store.COMPRESS),
        @Field(name = "sorting_name", analyze = Analyze.NO)
    })
    private String name;

    @IndexedEmbedded(depth = 1)
    @OneToMany(mappedBy = "playersClub")
    private Set<Player> players;

}

现在,当我像这样搜索 ClubSearchService 时:

luceneQuery = queryBuilder
                    ...
                    .onField("name").andField("players.firstName")
                    ...

它工作正常,但是当我想以其他方式搜索时(PlayerSearchService):

               .onField("firstName").andField("lastName").andField("number").andField("country").andField("playersClub.name")

有错误

org.hibernate.search.SearchException: Unable to find field playersClub.name in pl.domain.Player

Hibernate Search 无法搜索 ManyToOne 项目?

是的,也可以索引 ManyToOne 关系。

在大多数简单的情况下,您有一个实体,例如 Club 标记为 @Indexed,然后您想要索引它的某些 字段 以及 通过来自相关实体 Player.

@IndexedEmbedded 属性嵌入

到目前为止你做对了,这基本上是为你的 club 索引定义 "flattened" 模式。

问题是,在为 player 索引定义架构时,您将 firstname 标记为索引字段,但没有指示它嵌入与 playersClub 的关系。本质上,您在 属性.

上缺少 @IndexedEmbedded

不要与 @ContainedIn 注释混淆:这​​纯粹是为了确保 Hibernate Search 将重新索引包含它的实体;它不是让双方以对称的方式相互嵌入。

用更正式的术语来说,@IndexedEmbedded 建立的关系是一个有向图:如果你想让它遵循两个方向,你必须明确地建立它们。