在 TextFullSearch 上休眠搜索 "join"
Hibernate search "join" on TextFullSearch
我有 2 个实体:广告和类别;
我在广告实体上有一个 FullTextSearch (lucene),我想在广告和类别之间创建一个 "join",或者以某种方式在 Ad.category.id 上添加一个 where 子句。
我的添加 class :
@Entity
@Indexed
@Table(name = "adds")
public class Ad implements Serializable {
@Id
@SequenceGenerator(name="AdSQ", sequenceName="AdSQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AdSQ")
@Column(name = "id")
@JsonProperty("Id")
private Long __Id;
@OneToOne(fetch = FetchType.LAZY)
@IndexedEmbedded
@JoinColumn(name="idCategory", foreignKey = @ForeignKey(name = "FK_AD_CATEGORY"))
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Category category;
@Column(name = "price")
@JsonProperty("Price")
@Field
private Double _Price;
....
}
和类别:
@Entity
@Table(name = "categories"/*, indexes = {@Index(columnList="id",name = "index_category")}*/)
public class Category implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CategorySQ")
@SequenceGenerator(name="CategorySQ", sequenceName="CategorySQ", allocationSize = 1)
@JsonProperty("Id")
@Column(name="id")
private Long __Id;
我在 Ad 上使用了 IndexedEmbedded,我认为我应该将 @field 放在 if 类别字段上。
我应该如何制作 link?我需要使用一种特殊类型的查询,分析器?
首先,请注意您选择使用非标准 属性 名称(至少在 JavaBeans 约定方面)可能会导致 Hibernate ORM 和 Hibernate Search 出现一些问题,它们可能无法检测属性正确。我不确定它是否会,但我只是警告你:如果它不起作用,请尝试重命名属性。
回到你的问题,你已经通过添加 @IndexedEmbedded
得到了 link。如果您在搜索查询中只需要类别 ID,则可以简单地使用 @IndexedEmbedded(includeEmbeddedObjectId = true, depth = 0)
而无需添加任何字段。
depth = 0
是可选的,只会确保嵌入类别 ID 以外的任何内容。
那么您只需在 Ad
:
的查询中添加一个子句
Query categoryQuery = queryBuilder.keyword().onField( "category.__Id" ).matching( <some ID> ).createQuery()
Query booleanJunction = queryBuilder.bool()
.must( categoryQuery )
.must( <some other query> )
.must( <some other query> )
.createQuery()
FullTextQuery fullTextQuery = fullTextEntityManager.createQuery( booleanJunction, Ad.class );
如果您希望字段的名称不同,则必须在 Category
class 的 __Id
字段上添加 @DocumentId(name = "yourIdName")
注释。然后这样查询:
Query categoryQuery = queryBuilder.keyword().onField( "category.yourIdName" ).matching( <some ID> ).createQuery()
Query booleanJunction = queryBuilder.bool()
.must( categoryQuery )
.must( <some other query> )
.must( <some other query> )
.createQuery()
FullTextQuery fullTextQuery = fullTextEntityManager.createQuery( booleanJunction, Ad.class );
我有 2 个实体:广告和类别;
我在广告实体上有一个 FullTextSearch (lucene),我想在广告和类别之间创建一个 "join",或者以某种方式在 Ad.category.id 上添加一个 where 子句。
我的添加 class :
@Entity
@Indexed
@Table(name = "adds")
public class Ad implements Serializable {
@Id
@SequenceGenerator(name="AdSQ", sequenceName="AdSQ", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "AdSQ")
@Column(name = "id")
@JsonProperty("Id")
private Long __Id;
@OneToOne(fetch = FetchType.LAZY)
@IndexedEmbedded
@JoinColumn(name="idCategory", foreignKey = @ForeignKey(name = "FK_AD_CATEGORY"))
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
Category category;
@Column(name = "price")
@JsonProperty("Price")
@Field
private Double _Price;
....
}
和类别:
@Entity
@Table(name = "categories"/*, indexes = {@Index(columnList="id",name = "index_category")}*/)
public class Category implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="CategorySQ")
@SequenceGenerator(name="CategorySQ", sequenceName="CategorySQ", allocationSize = 1)
@JsonProperty("Id")
@Column(name="id")
private Long __Id;
我在 Ad 上使用了 IndexedEmbedded,我认为我应该将 @field 放在 if 类别字段上。
我应该如何制作 link?我需要使用一种特殊类型的查询,分析器?
首先,请注意您选择使用非标准 属性 名称(至少在 JavaBeans 约定方面)可能会导致 Hibernate ORM 和 Hibernate Search 出现一些问题,它们可能无法检测属性正确。我不确定它是否会,但我只是警告你:如果它不起作用,请尝试重命名属性。
回到你的问题,你已经通过添加 @IndexedEmbedded
得到了 link。如果您在搜索查询中只需要类别 ID,则可以简单地使用 @IndexedEmbedded(includeEmbeddedObjectId = true, depth = 0)
而无需添加任何字段。
depth = 0
是可选的,只会确保嵌入类别 ID 以外的任何内容。
那么您只需在 Ad
:
Query categoryQuery = queryBuilder.keyword().onField( "category.__Id" ).matching( <some ID> ).createQuery()
Query booleanJunction = queryBuilder.bool()
.must( categoryQuery )
.must( <some other query> )
.must( <some other query> )
.createQuery()
FullTextQuery fullTextQuery = fullTextEntityManager.createQuery( booleanJunction, Ad.class );
如果您希望字段的名称不同,则必须在 Category
class 的 __Id
字段上添加 @DocumentId(name = "yourIdName")
注释。然后这样查询:
Query categoryQuery = queryBuilder.keyword().onField( "category.yourIdName" ).matching( <some ID> ).createQuery()
Query booleanJunction = queryBuilder.bool()
.must( categoryQuery )
.must( <some other query> )
.must( <some other query> )
.createQuery()
FullTextQuery fullTextQuery = fullTextEntityManager.createQuery( booleanJunction, Ad.class );