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


《深入理解Elasticsearch(原書第2版)》一2.3.1 引入查詢模板

本節書摘來華章計算機《深入理解Elasticsearch(原書第2版)》一書中的第2章 ,第2.3.1節,[美]拉斐爾·酷奇(Rafal Ku) 馬雷克·羅戈任斯基(Marek Rogoziski)著 張世武 餘洪淼 商旦 譯 更多章節內容可以訪問雲棲社區“華章計算機”公眾號查看。

2.3.1 引入查詢模板

自Elasticsearch 1.1.0版本開始,我們可以自定義查詢模板。讓我們回到本書開頭的在線書店例子中。假定我們已經確定了需要傳遞給Elasticsearch的查詢語句的類型,不過查詢結構並未最終確定,我們還需要對它進行微調和優化。通過使用查詢模板,我們可以快速構建出查詢的基礎骨架,然後讓應用程序來提供對應的參數,最終由Elasticsearch完成查詢參數的替換。
假定我們有一個針對library索引的查詢語句,可以返回最相關的書籍記錄。在這個查詢中,我們還允許用戶選擇是否對書籍的庫存狀態做篩選。在這個場景中,我們需要傳入兩個參數—一個查詢短語和一個代表書籍庫存狀態的布爾變量。最初的簡化示例如下:
image

代碼中的QUERY和BOOLEAN是占位符,代表應用程序傳遞給查詢的變量。顯然這個查詢語句對當前示例場景來說實在太簡陋了,不過之前我們已經說過,這隻是它的最初版本,我們馬上將對它進行改進。
既然已經有了最初版本的查詢語句,我們可以基於它創建第一個查詢模板。對該查詢語句做簡單修改如下:
image
image

可以看出,原來的占位符被替換成了{{phrase}}和{{avail}}兩個變量,並且添加了一個新的params片段。當Elasticsearch在解析查詢語句時,遇到一個{{phrase}}變量,它將嚐試從params片段中查找出名為phrase的參數,並用參數值替換掉{{phrase}}變量。通常,我們需要把參數值放到params片段中,並在query中使用形如{{var}}的標記來引用params片段中參數名為var的參數。此外,查詢本身被嵌套進一個template元素中。通過這種方式,我們實現了查詢的參數化。
接下來讓我們使用HTTP GET請求把以下查詢語句發送給地址為/library/_search/template的REST端點(注意這裏不是我們通常使用的/library/_search端點)。請求命令構造如下:
image

字符串形式的查詢模板
查詢模板也可以以字符串的形式提供。比如,剛才的查詢模板可以變成這樣:
image

可見,這種形式不太適合閱讀和書寫,每個引號都需要被轉義,換行符容易引發格式問題,因此需要避免使用。盡管如此,如果你需要使用Mustache(一個模板引擎,我們將在下一小節探討),則必須使用這種格式(至少在Elasticsearch的1.1.0到1.4.0之間的所有版本中必須這樣做)。
 本書寫作時,筆者所使用的Elasticsearch相關版本中有一個關於查詢模板的小陷阱。如果你提供的查詢模板中有錯誤,被Elasticsearch檢測到後,會把錯誤寫到服務日誌裏,但是從API的視角來看,錯誤查詢將被忽略,接口將返回所有文檔,就好像你剛剛發送了一個match_all查詢一樣。記得複查你的查詢模板,直到這個缺陷不再存在。

最後更新:2017-06-23 23:02:50

  上一篇:go  想讓網站關鍵詞優化快速排名,可以這樣做
  下一篇:go  《深入理解Elasticsearch(原書第2版)》一2.3 查詢模板