如何在休眠搜索中禁用 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