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
建立的关系是一个有向图:如果你想让它遵循两个方向,你必须明确地建立它们。
我有两个索引实体。 玩家:
@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
建立的关系是一个有向图:如果你想让它遵循两个方向,你必须明确地建立它们。