假设我有2个实体Book和BookReview,有些时候我想要返回一组评价最高的书籍,有时候我只想要一本随机的书籍。
到目前为止,我理解即使策略可以是动态的,但DynamicBoost是明确注释的。因此它总是适用于处理该实体的hibernate-search查询?
来自hibernate搜索的一个例子:
@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策略,那么就我们说大多数评论。我怎么能做到这一点?
答案 0 :(得分:0)
@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 Sort。构建排序的两种方法都在文档中解释:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#__a_id_query_sorting_a_sorting