如何在休眠搜索中禁用 dynamicBoost
How to disable dynamicBoost in hibernate search
假设我有 2 个实体 Book 和 BookReview,有时我想 return 一组评论最高的书,有时我只想要一组随机的书.
到目前为止,我了解到即使策略可以是动态的,但 DynamicBoost 已明确注释。因此它总是适用于处理该实体的休眠搜索查询?
来自休眠搜索的示例:
@Entity
@Indexed
@DynamicBoost(impl = VIPBoostStrategy.class)
public class Person {
private PersonType type;
// ...
}
public class VIPBoostStrategy implements BoostStrategy {
public float defineBoost(Object value) {
Person person = ( Person ) value;
if ( person.getType().equals( PersonType.VIP ) ) {
return 2.0f;
}
else {
return 1.0f;
}
}
}
例如,如果我对 BookReview 实体有第二个 DynamicBoost 策略,假设是针对大多数评论。我怎样才能做到这一点?
@DynamicBoost 是关于 index-time 提升,即将提升与索引文档一起存储。因此每个文档的每个字段只能有一个提升。
此外,请注意@DynamicBoost is in the process of being deprecated。
无论如何,我认为您太过努力使用提升。当按全文相关性分数排序时,提升最有用。 Lucene(以及 Hibernate Search)完全能够在不使用提升的情况下对标量数据进行排序。
如果您需要按评论数量排序,只需在您的映射中添加一个 "numberOfReview" 字段:
@Entity
@Indexed
public class Person {
private PersonType type;
@OneToMany
private List<Review> reviews = new ArrayList<>();
@javax.persistence.Transient
@Field
public int getNumberOfReviews() {
return reviews.size();
}
// ...
}
...然后按此字段排序:
QueryBuilder qb = /* the usual */;
FullTextQuery query = /* the usual */;
query.sort( qb.sort().byField( "numberOfReviews" ).desc().createSort() );
同样适用于您可能希望作为排序依据的任何值。
有趣的是,当使用显式排序时,全文相关性得分被忽略,因此动态提升被忽略.这似乎是您正在寻找的内容的一部分...?
请注意,如果您使用的是旧版本的 Hibernate Search,排序构建器可能不可用,然后您将不得不使用自定义构建的 Lucene 排序。文档中解释了两种构建排序的方法:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#__a_id_query_sorting_a_sorting
假设我有 2 个实体 Book 和 BookReview,有时我想 return 一组评论最高的书,有时我只想要一组随机的书.
到目前为止,我了解到即使策略可以是动态的,但 DynamicBoost 已明确注释。因此它总是适用于处理该实体的休眠搜索查询?
来自休眠搜索的示例:
@Entity
@Indexed
@DynamicBoost(impl = VIPBoostStrategy.class)
public class Person {
private PersonType type;
// ...
}
public class VIPBoostStrategy implements BoostStrategy {
public float defineBoost(Object value) {
Person person = ( Person ) value;
if ( person.getType().equals( PersonType.VIP ) ) {
return 2.0f;
}
else {
return 1.0f;
}
}
}
例如,如果我对 BookReview 实体有第二个 DynamicBoost 策略,假设是针对大多数评论。我怎样才能做到这一点?
@DynamicBoost 是关于 index-time 提升,即将提升与索引文档一起存储。因此每个文档的每个字段只能有一个提升。
此外,请注意@DynamicBoost is in the process of being deprecated。
无论如何,我认为您太过努力使用提升。当按全文相关性分数排序时,提升最有用。 Lucene(以及 Hibernate Search)完全能够在不使用提升的情况下对标量数据进行排序。
如果您需要按评论数量排序,只需在您的映射中添加一个 "numberOfReview" 字段:
@Entity
@Indexed
public class Person {
private PersonType type;
@OneToMany
private List<Review> reviews = new ArrayList<>();
@javax.persistence.Transient
@Field
public int getNumberOfReviews() {
return reviews.size();
}
// ...
}
...然后按此字段排序:
QueryBuilder qb = /* the usual */;
FullTextQuery query = /* the usual */;
query.sort( qb.sort().byField( "numberOfReviews" ).desc().createSort() );
同样适用于您可能希望作为排序依据的任何值。
有趣的是,当使用显式排序时,全文相关性得分被忽略,因此动态提升被忽略.这似乎是您正在寻找的内容的一部分...?
请注意,如果您使用的是旧版本的 Hibernate Search,排序构建器可能不可用,然后您将不得不使用自定义构建的 Lucene 排序。文档中解释了两种构建排序的方法:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#__a_id_query_sorting_a_sorting