Elasticsearch之query與filter 阿新 • • 發佈:2019-01-10 Aggregation聚合 aggregation分為bucket和metric兩種,分別作為詞元劃分和數值計算。其中的bucket aggregation還支援在自身結果的基礎上疊加新的aggregation。這就是aggregation領先於facet的地方。比如實現一個時序百分比統計在facet介面無法直接完成,在aggregation介面就很簡單。 query與filter 1、區別如下: query是要相關性評分的,filter不要; query結果無法快取,filter可以。 所以,選擇參考: 1、全文搜尋、評分排序,使用query; 2、是非過濾,精確匹配,使用filter。 filter快取 預設情況下,並不是所有的filter都能用快取。常用的比如term、terms、prefix、range、bool等filter,其過濾結果明確,也容易設定快取,ES就對這幾個預設開啟了filter cache工嗯呢該。而複雜一些比如:geo、script等filter,從filddata資料到過濾結果還需要進行一些列計算的,ES預設是不開啟filter cache的。而想and、not、or這幾個關係型filter,也是不開啟的。如果想要強制開啟這些預設沒有的filter cache,需要在請求的JSON中帶上“cache”:true引數。 query_then_fetch ESd對請求的處理過程,是有不同型別的,預設的叫query_then_fetch。在這種情況下,各資料節點處理檢索請求後,返回的是隻包含文件id和相關性分之的結果,這一段處理,叫做query階段;匯聚到這份結果後,按照分值排序,得到一個全叢集最終需要的文件id,再向對應節點點發送一次文件獲取請求,拿到文件內容,這一段處理叫做fetch階段。兩階段都結束後才返回響應。 DFS_query_then_fetch型別,提高小資料量時的精確度;query_then_fetch型別在明確routing時可以省略一個數據來回;count型別,在不關心文件內容只需要計數時省略query極端;sacn型別批量獲取資料省略query階段(在reindex時就是使用這種型別)。