Java 在TextFullSearch上休眠搜索“加入”

Java 在TextFullSearch上休眠搜索“加入”,java,hibernate,lucene,full-text-search,hibernate-search,Java,Hibernate,Lucene,Full Text Search,Hibernate Search,我有两个实体:广告和类别 我在广告实体上有一个FullTextSearch lucene,我想在广告和分类之间建立一个连接,或者在Ad.Category.id上添加一个where子句 我的添加类: @Entity @Indexed @Table(name = "adds") public class Ad implements Serializable { @Id @SequenceGenerator(name="AdSQ", sequenceName="AdSQ", allocationSiz

我有两个实体:广告和类别

我在广告实体上有一个FullTextSearch lucene,我想在广告和分类之间建立一个连接,或者在Ad.Category.id上添加一个where子句

我的添加类:

@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;
我在广告中使用了IndexedEmbedded,我想我应该把@field放在分类的if字段上


我应该如何建立链接?我需要使用一种特殊类型的查询analyzer?

首先,请注意,您选择使用非标准属性名称(至少在JavaBeans约定方面)可能会导致Hibernate ORM和Hibernate Search出现一些问题,这可能无法正确检测属性。我不确定它是否会,但我只是警告您:如果它不起作用,请尝试重命名属性

回到你的问题,你已经通过添加@IndexedEmbedded创建了链接。如果在搜索查询中只需要类别ID,只需使用@indexedembeddedincludedembeddedobjectid=true,depth=0,而无需添加任何字段。 depth=0是可选的,只需确保嵌入除category 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 );
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 );