2013-05-15 3 views
0

~ 10,000 개의 앱 목록이 있는데 특정 열에 따라 주문하고 싶지만 특정 열을 다른 것보다 더 "가중치"를주고 싶습니다.가중치로 결과를 정렬 하시겠습니까?

예를 들어, 각 앱은 overall_ratingscurrent_ratings입니다. 앱에 overall_ratings이 많이 있다면 1.5의 가치가 있지만 current_ratings의 숫자는 의 숫자가 2이고, 가치가 있습니다. 앱의 수가 현재 인기 있고 현재 인기가있는 것으로 나타났습니다.

지금 당장 고려해야 할 변수 중 4-6 개가 있습니다.

그럼 어떻게하면 되죠? 쿼리 자체에서? 루비만을 사용한 후에 (여기서 처리해야 할 10,000 개의 행이 있다는 것을 기억하십시오)? 다른 것?

이것은 Rails 3.2 앱입니다.

+0

여기서는 SQL 데이터베이스가 최선의 도구가 아닙니다. 스택에 elasticsearch를 도입하면 당신은 황금색이됩니다. – BroiSatse

답변

1

평범한 루비로 10000 개의 객체를 정렬하는 것은 좋은 생각처럼 보이지 않습니다. 특별히 처음 10 개 정도만 원하면 좋습니다.

액티브 레코드의 주문 방법을 사용하여 쿼리 수식을 넣을 수 있습니다.

그러나 내가 선호하는 방법은 점수를 저장하고 그 값을 before_save 메서드로 업데이트 할 수있는 float 특성을 만드는 것입니다.

일부 특성이 업데이트되었을 때만이 채점을 수행하기 때문에 더러운 특성에 대해 읽습니다.

또한 현재 개체의 점수를 다시 계산하는 레이크 작업을 만들 수도 있습니다.

Ruby에서 스코어링 기능을 유지하면 (쉽게 테스트 할 수 있음) 플로트 속성에 인덱스를 추가하여 데이터베이스 쿼리의 성능이 향상 될 수 있습니다. (정말 때문에 laking의 DB 스키마를 테스트 할 수 없습니다) :

ActiveRecord::Base.connection.execute("SELECT *, 
             (2*(SELECT COUNT(*) FROM overall_ratings 
             WHERE app_id = a.id) + 
              1.5*(SELECT COUNT(*) FROM current_ratings 
             WHERE app_id = a.id) 
             AS rating FROM apps a 
             WHERE true HAVING rating > 3 ORDER BY rating desc") 

아이디어가 평가의 수를 요약하는 것입니다

+0

+1 점수를 매기려면 +1하십시오. "곡선으로 점수를 매길"필요가 있다면 조금 더 노력하겠습니다. –

0

한 시도는 DB가 같은 일부 쿼리와 함께 당신을 위해이 일을 할 수 있도록하는 것입니다 특정 앱 ID에 대한 하위 쿼리로 각 현재 및 전체 등급에서 찾은 다음 원하는만큼 가중치를 부여합니다.

관련 문제