2016-08-12 4 views
0

Groovy와 함께 Spring Solr을 사용 중입니다.Spring Solr boosting 문제

결과를 높이려고 할 때 문제가 발생합니다.

색인 된 엔티티가 Product 인 단순화 된 온라인 쇼핑 도메인을 고려해보십시오.

사용자는 shoppingBasket 및 wishList를 가지며, 각각은 단순한 제품 코드 목록 (예 : List <String>)입니다. 두 목록은 고유하고 고유한지 확인하기 위해 먼저 처리됩니다.

간단한 검색이 제품 '텍스트의 키워드 문자열 (복합 필드의 설명과 제목을 포함, copyField를 사용하여 만든)이 될 수 있습니다.

요구 사항은 키워드가 텍스트에서 일치하는 모든 제품을 shoppingBasket에 표시된 것과 먼저 나열한 다음 wishList에있는 제품과 그 뒤에 오는 제품 중 하나가 나열된 결과를 나열하는 것입니다. 발생

문제는 일부 위시리스트와 shoppingBasket 그룹화 각에서 장소와 결과를 복용 강화하지만 위시리스트 일치의의 shoppingBasket 경기는 항상 앞서 표시되지 않습니다 것입니다.

각 목록에서 제품에 따라, 때로는 순서로 표시 : 모든리스트가 일치

을, 모든 shoppingBasket 일치, 모든 다른 경기 대신 예상의

: 모든 shoppingBasket 일치

, 모든 wishList 일치, 다른 모든 일치

부스트는 다음 기준을 사용하여 적용됩니다.

내가 어떤 차이를 만들어하지 않는 PageRequest,에 추가 된 정렬 주석이 similar issue을 본 데.

는 또한 반환 된 결과에 점수를 포함하도록 @Score 주석을 사용했다. 그것들을 조사해 보면 solr이 shoppingBasket이나 wishList의 모든 일치 항목에 동일한 동일한 점수를 부여한다는 것을 알 수 있습니다. 이 목록 밖에있는 모든 경기는 점수가 더 낮아집니다 (둘 사이에 동일 함).

아무 소용 부스트 (각각 10000.0f 및 5000.0f)에 대해 다른 값을 노력했다. 그것은 다른 점수를 냈지만 그것은 shoppingBasket 또는 wishList에서 모든 경기간에 여전히 동일합니다.

심지어 혼자 그냥 밀어 기준 아래 검색을 단순화 순서는 밖으로 아직도있다.

모든 아이디어를 얻을 수 있습니다.

답변

0

시행 착오를 통해 솔루션을 .connect() 메서드를 다음과 같이 사용하는 것이 발견되었습니다.

boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f).connect() 
boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f).connect() 

그런 다음 함께 표시됩니다.

적용 할 다른 검색 기준이있는 곳 (예 :제품 설명에 특정 텍스트가 포함되어 있음)보다 복잡한 상황에서 createSearchCriteria (searchCommand) 메소드가 결과를 반환한다고 가정하면 연결을 사용하여 포장하기 전에 부스트 기준과 ANDed를 수행해야합니다. 기본 검색 기준) :

boostingShoppingBasket = new Criteria('productCode_s').in(shoppingBasket).boost(10.0f) 
boostingShoppingBasket = boostingShoppingBasket.and(createSearchCriteria(searchCommand)).connect() 

boostingWishList = new Criteria('productCode_s').in(wishList).boost(2.0f) 
boostingWishList = boostingWishList.and(createSearchCriteria(searchCommand)).connect() 

Criteria criteria = createSearchCriteria(searchCommand) 
    .or(boostingShoppingBasket).or(boostingWishList)