使用其他 table 的值提升 Hibernate Search

Hibernate Search boost with values from other table

我正在使用带有本地 Lucene 后端的休眠搜索(最新版本)。 我有两个实体如下;

@Entity
@Indexed
public class A {

    @Id
    private Long id; 

    @FullTextField
    private String text;

    @KeywordField
    private String keyword;
}

@Entity
public class B {
    
    private BigDecimal number;

    @OneToOne
    @JoinColumn(name = "a_id")
    private A a;
}

我有质量索引器,可以在应用程序启动时处理索引 A 实体。 搜索时,我希望搜索结果按实体 B 的 number 字段排序。

我的搜索函数是一个简单的布尔谓词,如下所示

.where(f -> f.bool()
          .should(f.match().field("text").matching(query))
          .should(f.match().field("keyword").matching(query.toUpperCase(Locale.ENGLISH)))
)
.fetch(offset, limit)

我应该如何处理 order/boost 搜索结果取决于具有一对一关系的另一个实体的另一个字段?

你用的是“提升”这个词,但我认为你只是在“排序”之后。 “bootsting”是影响得分的不同概念,只会间接影响命中顺序。

要按此 number 属性 排序,您必须将其嵌入到为 A 创建的索引文档中。为此,使用 @IndexedEmbedded:

@Entity
@Indexed
public class A {

    @Id
    private Long id; 

    @FullTextField
    private String text;

    @KeywordField
    private String keyword;

    // Add this, and make sure to update it every time you update B.a
    @OneToOne(mappedBy = "a")
    @IndexedEmbedded
    private B b;
}

@Entity
public class B {
    
    private BigDecimal number;

    @OneToOne
    @JoinColumn(name = "a_id")
    private A a;
}

警告:确保每次调用 b.setA(...) 时也调用 a.setB(...) 以便所有实体保持一致。否则,Hibernate Search 将无法正确索引您的数据。

然后注释 number 以便它被索引并且 sortable:

@Entity
public class B {
    
    @GenericField(searchable = Searchable.NO, sortable = Sortable.YES)
    private BigDecimal number;

    @OneToOne
    @JoinColumn(name = "a_id")
    private A a;
}

然后在您的查询中添加 sort

.where(f -> f.bool()
          .should(f.match().field("text").matching(query))
          .should(f.match().field("keyword").matching(query.toUpperCase(Locale.ENGLISH)))
)
.sort(f -> f.field("b.number").asc())
.fetch(offset, limit)