2017-09-06 18 views
0

2つのエンティティBookとBookReviewがあるとします。最もレビューの多い書籍を返すときがあります。ランダムなセットが必要なときもあります本。hibernate検索でdynamicBoostを無効にする方法

これまでのところ、戦略はダイナミックにできますが、DynamicBoostには明示的に注釈が付けられていますが、したがって、常にそのエンティティを処理するハイバネート検索クエリに適用されますか?

休止検索の例:私は書評エンティティの二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; 
     } 
    } 
} 

、のはレビューの数として言わせて。どうすればそれを達成できますか?

答えて

0

@DynamicBoostは、約インデックス時間ブースティングです。つまり、インデックス付きドキュメントと共にブーストを保存することです。したがって、1つのドキュメントにつき1つのフィールドにつき1つのブーストしかできません。

また、@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

+0

DynamicBoostingに夢中になってしまったと思っていますが、使用する方が良いと思っていました。しかし、とにかく、私はそれをもっと簡単に並べ替えることにします()。 – czetsuya

関連する問題