當進行精確值查詢時,
我們會使用過濾器(filters)。過濾器很重要,因為它們執行速度非常快,不會計算相關度(直接跳過了整個評分階段)而且很容易被快取。我們會在本章後面的 過濾器快取 中討論過濾器的效能優勢,不過現在只要記住:請盡可能多的使用過濾式查詢。
在內部,elasticsearch 會在執行非評分查詢的時執行多個操作:
查詢匹配文件.
term
查詢在倒排索引中查詢xhdk-a-1293-#fj3
然後獲取包含該 term 的所有文件。本例中,只有文件 1 滿足我們要求。
建立 bitset.
過濾器會建立乙個 bitset (乙個包含 0 和 1 的陣列),它描述了哪個文件會包含該 term 。匹配文件的標誌位是 1 。本例中,bitset 的值為[1,0,0,0]
。在內部,它表示成乙個 "roaring bitmap",可以同時對稀疏或密集的集合進行高效編碼。
迭代 bitset(s)
一旦為每個查詢生成了 bitsets ,elasticsearch 就會迴圈迭代 bitsets 從而找到滿足所有過濾條件的匹配文件的集合。執行順序是啟發式的,但一般來說先迭代稀疏的 bitset (因為它可以排除掉大量的文件)。
增量使用計數.
elasticsearch 能夠快取非評分查詢從而獲取更快的訪問,但是它也會不太聰明地快取一些使用極少的東西。非評分計算因為倒排索引已經足夠快了,所以我們只想快取那些我們 知道 在將來會被再次使用的查詢,以避免資源的浪費。
為了實現以上設想,elasticsearch 會為每個索引跟蹤保留查詢使用的歷史狀態。如果查詢在最近的 256 次查詢中會被用到,那麼它就會被快取到記憶體中。當 bitset 被快取後,快取會在那些低於 10,000 個文件(或少於 3% 的總索引數)的段(segment)中被忽略。這些小的段即將會消失,所以為它們分配快取是一種浪費。
實際情況並非如此(執行有它的複雜性,這取決於查詢計畫是如何重新規劃的,有些啟發式的演算法是基於查詢代價的),理論上非評分查詢 先於 評分查詢執行。非評分查詢任務旨在降低那些將對評分查詢計算帶來更高成本的文件數量,從而達到快速搜尋的目的。
從概念上記住非評分計算是首先執行的,這將有助於寫出高效又快速的搜尋請求。
過濾器(6) 過濾器的攔截
本系列部落格彙總在這裡 過濾器彙總 我們來做個測試,寫乙個過濾器,指定過濾的資源為 index.jsp,然後我們在瀏覽器中直接訪問 index.jsp,你會發現過濾器執行了!但是,當我們在 helloservlet 中使用伺服器端的跳轉request.getrequestdispathcer ind...
Vue 過濾器案例(全域性過濾器和區域性過濾器)
doctype html en utf 8 viewport content width device width,initial scale 1.0 js vue 2.4.0 js script 過濾器 title head 兩個過濾器的名稱都為msgformat,但是控制不同作用,乙個是全域性的...
vue中過濾器
常用語文字的格式化,過濾器可用在兩個地方 雙括號插值和v bind 表帶式 用符號 表示,在雙括號的中 在 v bind 中 具體使用請參考vue官方文件 如果專案中使用的過濾器比較多,不妨單獨用乙個filter.js檔案用來專門寫過濾器,在main.js中新增如下 就可以將filter中過濾器全部...