微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用其他表中的值进行休眠搜索提升

如何解决使用其他表中的值进行休眠搜索提升

我正在使用带有本地 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)

我应该如何根据具有一对一关系的另一个实体的另一个字段来排序/提升搜索结果

解决方法

您使用的是“提升”这个词,但我认为您只是在“排序”之后。 “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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。