java - Hibernate 在 TextFullSearch 上搜索 "join"

标签 java hibernate lucene full-text-search hibernate-search

我有 2 个实体:广告和类别;

我在 Ad 实体上有一个 FullTextSearch (lucene),我想在 Ad 和 Category 之间进行“连接”,或者以某种方式在 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 字段上。

我应该如何建立链接?我需要使用特殊类型的查询、分析器?

最佳答案

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

回到您的问题,您已经通过添加 @IndexedEmbedded 建立了链接。如果您只需要搜索查询中的类别 ID,则只需使用 @IndexedEmbedded(includeEmbeddedObjectId = true, height = 0) 即可,无需添加任何字段。 深度 = 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 );

如果您希望字段名称不同,则必须在 __Id 字段上添加 @DocumentId(name = "yourIdName") 注解Category 类。然后像这样查询:

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

关于java - Hibernate 在 TextFullSearch 上搜索 "join",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50852565/

相关文章:

java - 使用 UserDetailsS​​ervice 时对数据库进行事务调用

lucene - Lucene StandardAnalyzer 和 EnglishAnalyzer 有什么区别?

Java程序编译错误

java - 将一个实体持久化到另一个实体之后 ~ Netbeans、J2E、bean、EntityManager

java - Spring Data JPA、Hibernate 和 EXASOL 数据库

java - group by 子句上的 jdbc.SQLServerException

lucene - Sitecore Search Predicate Builder 多关键字搜索与 boosting 无法按预期工作

java - 将 Alfresco 社区版 5.0 升级到 5.1 搜索功能不起作用?

java - 为什么在AQS(AbstractQueuedSynchronizer)的await方法中使用 "while"

java - 如何检查输入字段中的文本