摘要: Solr查詢每一次返回的數據都有一定的順序,特定順序的結果對於業務來說可能非常重要。
不指定排序
一般我們不指定排序規則,這樣的結果能滿足大部分需求,默認是用文檔的得分作為排序標准。相當於加上了參數sort=score desc,這里的score是solr的一個隱藏字段,衡量這個文檔對於該查詢參數的權重。使用如下的HTTP查詢請求:
http://localhost:8080/solr/core/select?q=*:*&fl=*,score
返回數據:
{
"responseHeader":{ "status":0, "QTime":0, "params":{ "q":"*:*", "fl":"*,score", "wt":"json"}}, "response":{"numFound":106,"start":0,"maxScore":1.0,"docs":[ { "id":"c3812fee-de7a-48e5-a60d-79a882aca823", "title_s":"皇帝諷刺劇", "artist_s":"鮑勃·迪倫", "country_s":"美國", "company_s":"哥倫比亞", "price_d":10.9, "year_s":"1985", "type_s":"光盤", "description_s":"夏天的午后聽Bob Dylan的歌特別容易被催眠", "_version_":1551502047719718912, "score":1.0 }, ... ] } }
有一個socre的filed,所有score值為1,是因為我返回了所有數據,它們的權重都相同。
按某一filed排序
有時候,我們只關心某一字段,希望返回的數據根據這一字段排序。例如,我想查找所有書籍中比較便宜的書籍。可以使用查詢參數sort=price_s asc,使用如下的HTTP查詢請求:
http://localhost:8080/solr/core/select?q=*:*&sort=price_d asc
返回數據:
{
"responseHeader":{ "status":0, "QTime":0, "params":{ "q":"*:*", "sort":"price_d asc", "wt":"json"}}, "response":{"numFound":106,"start":0,"docs":[ { "id":"1900599155", "title_s":"渡邊淳一作品精選集", "author_s":"渡邊淳一", "category_s":"外國小說", "page_i":10000, "price_d":12.90, "odertime_dt":"2015-10-02T21:47:04Z", "publisher_s":"不知名出版社", "type_s":"圖書", "description_s":"擁有眾多的讀者,我倍感喜悅。", "_version_":1552794664615018496 }, ... ] } }
按多個filed排序
有時候,我希望返回的數據先按權重排序,再按某一filed排序,那么可以使用多個field來排序,此時按第一個排序參數排序,如果第一個參數不能區分順序,則按第二個參數排序。對於某次查詢,我希望先按權重排序,權重相同則按價格排序,那么,查詢參數可以為sort=score desc, price asc。
含有函數的排序
有時候,排序規則可能需要兩個filed的值做數學運算。比如,有一次排序基於兩個字段的和,可以使用這樣的查詢參數sort=sum(x_d, y_d) desc(這里的x字段和y字段都為double類型)。
