(前略,因為不知道要寫什麼引言XD)

這陣子一個很苦惱我的問題,
就是在solr傳出來的結果是依照關聯性(score)排序,但下了query後,卻變成用primary key排序。
因為Ruby語法還不熟,加上不知道用什麼關鍵字去Google,整個卡關卡超大,
總之,是備忘用筆記。

原則上,最初的一步是在solr的fl參數,將score加上去,像是 :fl => "score, id"這樣,
才會把比對的分數一併傳出來

問題來了,在query時要用solr的id去作,同時用score的分數作排序
後來才知道應該要傳hash進去,以下則是邏輯上的思考
(由於id是primary key,因為不會重複,所以作為hash的key)
(而不同的id可能會有相同的score,所以score作為hash的value,拿score當key會天下大亂XD)

# res is the result of solr
key_array = res.map { |k| k['id'] }
value_array = res.map { |v| v['score'] }
id_and_score_array = [key_array, value_array].transpose
id_and_score_hash = Hash[*id_and_score_array.flatten]


這樣target_hash就是我要的hash了

最後是query時要用到sort來根據score作排序,但拉資料要用id來拉

post_find = Post.find(key_array)
post_score_array = [post_find, value_array].transpose
post_score_array.sort! { |a,b| b[1] <=> a[1] } # sort by value
@post = Hash[*post_score_array.flatten].keys


這樣@post就是依照solr的score去排序了,但以上顯然是很不漂亮的寫法XD
所以改成以下寫法,就可以得到排序後的結果了

id_score_hash = Hash[*res.map { |h| [h['id'], h['score']] }.flatten]
@post = Post.find(id_score_hash.keys).sort {|a, b| id_score_hash["#{b.id}"] <=> id_score_hash["#{a.id}"]}
相关文章