在 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 );