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