2014-03-06 2 views
1

저는 sunspot/solr을 사용하는 초심자이며 이미 더 무거운 방법으로 이미 사용되고있는 더 큰 프로젝트에서 문제를 발견했습니다. 필자가해야 할 일은 다중 값 필드에 값이 있는지 여부에 따라 결과의 점수를 정렬/부스트하는 방법을 찾는 것입니다.흑점을 사용하여 다중 값 필드로 주문하는 방법은 무엇입니까?

searchable do 
    integer user_ids 
    integer unread_by_user_ids 
end 

나는 사용자가 이미 여부를 문서를 읽을 여부에 의해 주문되는 결과를 특정 사용자에 대한 모든 문서의 목록을 얻으려면 : 좀 더 명확하게하기 나는 다음과 같은 설정이 있다고 가정 할 수 있습니다 . 또한 나는 결과를 페이지에 넣어야한다고 언급 할 필요가있다. 그래서 solr 검색이 끝나면 순서를 정하는 것이 문제가되지 않는다. 나는 비슷한 질문을 여기에서 보았습니다. Rails Sunsport/Solr: Ordering on multiple-value field,하지만 실제 답변이 없기 때문에 새로운 행운을 빕니다. 필자가 읽은 바에 따르면 이렇게 할 수있는 방법이 없다고 생각되며 가장 좋은 방법은 읽지 않은 항목과 결과 페이지를 완료하는 데 필요한 읽기 항목에 대한 두 가지 쿼리를 수행하는 것입니다. 필요하다면 결과를 연결하십시오. 그래도 먼저이 작업을 수행하는 더 좋은 방법이 없는지 확인하려고했습니다. 모든 도움/조언을 부탁드립니다.

답변

1

마지막으로 동적 필드를 사용하여이 문제를 해결했습니다. 여기에 검색 선언이 어떻게 표시되는지를 보여줍니다 같은 :

searchable do 
    integer user_ids 
    dynamic_boolean :document_read_status do 
    user_ids = get_all_user_ids 
    unread_user_ids = get_all_unread_user_ids 
    user_ids.inject({}) do |hash, user_id| 
     hash.merge(:"unread_by_#{user_id}" => unread_user_ids.include?(user_id)) 
    end 
    end 
end 

실제 검색은 다음과 같습니다

I didn를 왜 경우
search.build do 
    with(:user_ids, user.id) 
    dynamic :document_read_status do 
    order_by(:"unread_by_#{user.id}", :desc) 
    end 
end 

당신은 키와 보간 된 문자열로 무엇을 궁금해하고있어 ' 사용자 ID를 키로 직접 사용하면 그 대답은 여기에서 찾을 수 있습니다. Indexing and ordering by dynamic field with sunspot

이 접근 방식에 문제가있는 경우 모든 입력을 환영합니다.