如何在hibernate搜索中禁用dynamicBoost

时间:2017-09-06 02:36:15

标签: hibernate hibernate-search

假设我有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策略,那么就我们说大多数评论。我怎么能做到这一点?

1 个答案:

答案 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