閱讀199 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Solr查詢語言 JSON Request API

一、背景與動機

JSON Request API是由noggit作者(同時也Solr Committer Leader)在Solr.5.3帶來新特性,意在改善Solr原來複雜且又醜陋查詢語法。

注:JSON Request API與Solr API v2並不是一回來,JSON Request API是一種新型Solr Query DSL。API v2新版本查詢API,是基於Restful API實現的。當然JSON Request API顯然是基於JSON實現的咯。
不過Request API還是API v2都是Solr學習ElasticSearch靠近的表現。

以前想寫簡單查詢其實也沒有很複雜,就是寫個q參數,然後指定一下rowssort嘛,但是對於用Solr來做統計相關工作的同學,還是覺得挺煩的。因為它
https://yq.aliyun.com/articles/1. 冗長,沒有結構,容易出錯,難於校驗和debug。f.facet_field_name.facet.range.start=5
2. 沒有數據類型,整個世界都是String,缺乏結構,不便於編程
3. 對服務端而言,解釋得也相當複雜。

總之,就是有一係列問題。所以在Solr5.3,Yonik小哥帶來這個。當然,我們Solr的JSON解析器用的就是Noggit。

Noggit是非常牛比,非常最效,非常新穎的JSON解析器。她是流式JSON解釋器,同時她還**擴展JSON格式**,使得她的結構更加簡潔,優雅。想了解她更牛比之處請閱讀noggit項目首頁。

這就是JSON Request API出現的背景,當然動機就是針對這些痛點進行優化,一方麵有利於推廣Solr的搜索統計功能;二方麵優化搜索解析效率、優化使用體驗。

二、用法

在過去,我寫Blog從不寫用法一類的Blog。主要是這一類文章寫的非常多,這次為什麼要寫呢,原因有二。一,Solr6.6正式推出這套API;二,貌似並沒多少人關注她。這麼好的特征,不能讓她一直默默無聞。

雖然Noggit已經非常簡潔好看,但是她在瀏覽器的地址欄裏編輯還非常不好方便的。但我依然她覺得非常好,特別在她提供一係列非常好用的Facet Statistics & Aggregations Function。之前沒有她的時候,我們要寫這些查詢,非常苦痛的,除了可能需要用到stats查詢之外,還很有用可能需要用到非常用的Query Function。(這也可能就是Solr一直很搜索的原因吧。)

因此,非常有必要來推廣她,不能讓這個世界都是ElasticSearch

好了,回歸正題,先看來幾個Query。

Query #https://yq.aliyun.com/articles/1. 直接POST

  • 原來寫法 https://solr.daming.com/solr/daming/select?q=helloWorld
  • JSON Request API寫法 $ curl https://solr.daming.com/solr/daming -d '{ query : "helloWorld" }' 非常清淅,特別是熟悉ElasticSearch的同學們,可謂是ElasticSearch轉向Solr的一條橋梁。

query #2. HttpGet Method

JSON Request API作為新版的query api,其實它也是相當成熟了的,功能也相當豐富,也基本兼容舊版API。當是HttpGet是需要一個參數來接收我們新版JSON Request內容的。通過Parameter json={}的方式來接收JSON Request API的查詢語句,且新版API與舊版API完全兼容,即是可以一起來描述一個查詢請求。

這種情況下,JSON Request API完全就是原來查詢語法的一個擴展,即是多出一個叫json的新參數。

$ curl https://localhost:8983/solr/query -d 'json={query:"hero"}&fq=author:brandon'

Query #3 來看一個完整的示例

老實說,JSONS Request API定義真的是非常人性化、貼近自然語言。

{
  query : "*:*",
  filter : [
    "author:brandon",
    "genre_s:fantasy"
  ],
  offset : 0,
  limit : 5,
  fields : ["title","author"],  // we could also use the string form "title,author"
  sort : "sequence_i desc",

  facet : {  // the JSON Facet API is nicely integrated as well
    avg_price : "avg(price)",
    top_authors : {terms : author}
  }
}
  • 參數解釋 我以為新版本的API參數名並不需要加於描述,看名字即可。
  • query,等同於q
  • filter,等同於fq,注意新版API是結構化的,並且是有類型的。因為我們並不需要向以前那麼樣拚一堆的fq,如今如隻需要一個數組即可。
  • offset,等同於start
  • limit,等同於rows
  • sort,還是sort
  • facet,新款Facet API,具體下篇再繼續討論。

跟舊版一樣,並不需要一個請求裏為所有參數進行賦值。同時所有參數都是可以缺省,當新舊版同語義的參數出現時,由舊版本參數值覆蓋新版。
按Yonik的說法,JSON Request API屬於二級查詢,因為它由json=開始。那麼即是上級會覆蓋下級。

noggit json string完全支持扁平化,意思是說我們通過打點的方式把查詢語句變得扁平化,然後拚在上級結構裏。此時同樣滿足上級覆蓋下級的基本規則。

三、後語

Solr擁有一套完整、非常強大且複雜的查詢語法,所以如果JSON Request API隻是這樣就結束的話,那就一點都不Solr了。因此還下一篇,下篇我們來聊聊JSON Facet API,這是才我為什麼一直想要來介紹一下JSON Request API的原因。
在基本查詢部分,JSON Request API的確沒什麼優勢,我也建議你繼續舊語法。但如果你需要用Solr來做統計的話,盡管Solr的Sql讓你很失望,但請相信我,JSON Facet API會讓你耳目一新,然後愛上她的。

參考文章:
大神Yonik博客

最後更新:2017-06-17 08:32:42

  上一篇:go  (原創)想成為偉大的公司從域名開始
  下一篇:go  大明想跟你聊聊Solr6.x