2017-09-06 1 views
0

두 개의 엔티티 Book과 BookReview가 있다고 가정 해 봅시다. 가장 높은 리뷰를 가진 일련의 책을 반환하려는 특정시기가 있습니다. 서적.최대 절전 모드 검색에서 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는 약 색인 시간 부스팅입니다. 즉, 색인 된 문서와 함께 부스트를 저장하는 것입니다. 따라서 문서 당 필드 당 하나의 강조 만있을 수 있습니다.

또한 @DynamicBoost is in the process of being deprecated에 유의하십시오.

관계없이, 나는 당신이 부스터를 사용하기에 너무 열심히 노력한다고 생각합니다. 부스팅은 전체 텍스트 관련성 점수로 정렬 할 때 주로 유용합니다. Lucene (따라서 Hibernate Search)은 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 Search를 사용하고 있다면 정렬 빌더를 사용할 수 없을 수도 있고 사용자 정의 루틴 정렬을 사용해야 할 것입니다. 문서를 보면 두 가지 방법이 모두 설명되어 있습니다. https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#__a_id_query_sorting_a_sorting

+0

내 생각에 DynamicBoosting에 너무 집착하여 사용하는 것이 더 좋을 것이라고 생각합니다. 그러나 어쨌든 나는 훨씬 더 쉬운 정렬()에 찬성하여 그것을 제거 할 것이다. – czetsuya