代码之家  ›  专栏  ›  技术社区  ›  czetsuya

如何在hibernate搜索中禁用dynamicBoost

  •  0
  • czetsuya  · 技术社区  · 7 年前

    @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 回复  |  直到 7 年前
        1
  •  0
  •   yrodiere    7 年前

    @DynamicBoost是关于 boosting,即关于将boost与索引文档一起存储。因此,每个文档的每个字段只能有一个提升。

    另外,请注意@DynamicBoost is in the process of being deprecated

    不管怎样,我认为你太努力了,不想使用助推。当按全文相关性分数排序时,增强最有用。Lucene(以及Hibernate搜索)完全能够在不使用boost的情况下对标量数据进行排序。

    如果需要按评论数量排序,只需在映射中添加“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搜索,则排序生成器可能不可用,然后您必须使用自定义的Lucene排序。文档中解释了两种建筑排序方法: https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#__a_id_query_sorting_a_sorting