1. 程式人生 > >Solr查詢引數sort(排序)

Solr查詢引數sort(排序)

摘要: 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型別)。