當前位置:首頁 » 編程軟體 » 聚合腳本平台

聚合腳本平台

發布時間: 2024-09-20 17:51:55

㈠ Elasticsearch之Doc Value與Fielddata

倒排索引在搜索包含指定term的doc時非常高效,但是在相反的操作時表現很差:查詢一個文檔中包含哪些term。具體來說,倒排索引在搜索時最為高效,但在排序、聚合等與指定filed相關的操作時效率低下,需要用 doc_values

倒排索引將term映射到包含它們的doc,而doc values將doc映射到它們包含的所有詞項,下面是一個示例:

當數據被逆置之後,想要收集到 Doc_1 和 Doc_2 的唯一 token 會非常容易。獲得每個文檔行,獲取所有的詞項,然後求兩個集合的並集。

其實,Doc Values本質上是一個序列化了的列式存儲結構,非常適合排序、聚合以及欄位相關的腳本操作。而且這種存儲方式便於壓縮,尤其是數字類型。壓縮後能夠大大減少磁碟空間,提升訪問速度。下面是一個數字類型的 Doc Values示例:

列式存儲意味著有一個連續的數據塊: [100,1000,1500,1200,300,1900,4200] 。因為我們已經知道他們都是數字(而不是像文檔或行中看到的異構集合),所以可以使用統一的偏移量來將他們緊緊排列。

而且,針對這樣的數字有很多種壓縮技巧。你會注意到這里每個數字都是 100 的倍數,Doc Values會檢測一個段裡面的所有數值,並使用一個最大公約數,方便做進一步的數據壓縮。

比如,這個例子中可以用100作為公約數,那麼以上數字就變為[1,10,15,12,3,19,42],可用很少的bit就能存儲,節約了磁碟空間。一般來說,Doc Values按順序來檢測以下壓縮方案:

String類型使用順序表,按和數字類型類似的方式編碼。String類型去重後排序,然後寫入一個表中,並分配一個ID號,然後這些ID號就被當做數字類型的Doc Values。這意味著字元串享有許多與數字相同的壓縮特點。

Doc Values是在欄位索引時與倒排索引同時生成,而且生成以後是不可變的。

Doc Value 默認對除了 analyzed String 外的所有欄位啟用(因為分詞後會生成很多token使得Doc Values效率降低)。但是當你知道某些欄位永遠不會進行排序、聚合以及腳本操作的時候可以禁用Doc Values以節約磁碟空間提升索引速度,示例如下:

以上配置以後,session_id欄位就只能被搜索,不能被用於排序、聚合以及腳本操作了。

還可以通過設定doc_values為true,index為no來讓欄位不能被搜索但可以用於排序、聚合以及腳本操作:

Doc Value的特點就是快速、高效、內存友好,使用由linux kernel管理的文件系統緩存彈性存儲。doc values在排序、聚合或與欄位相關的腳本計算得到了高效的運用,任何需要查找某個文檔包含的值的操作都必須使用它。如果你確定某個filed不會做欄位相關操作,可以直接關掉doc_values,節約內存,加快訪問速度。

上文說過,在排序、聚合以及在腳本中訪問field值時需要一個與倒排索引截然不同的數據訪問模式:不同於倒排索引中的查找term->找到對應docs的過程,我們需要直接查找doc然後找到指定某個filed中包含的terms。

大多數field使用索引時、磁碟上的doc_values來支持這種訪問模式,但是分詞了的String filed不支持Doc Values,而是使用一種叫FieldData的數據結構。

FieldData主要是針對analyzed String ,它是一種查詢時(query-time)的數據結構。

FieldData緩存主要應用場景是在對某一個field排序或者計算類的聚合運算時。它會把這個field列的所有值載入到內存,這樣做的目的是提供對這些值的快速文檔訪問。為field構建FieldData緩存可能會很昂貴,因此建議有足夠的內存來分配它,並保持其處於已載入狀態。

FieldData是在第一次將該filed用於聚合,排序或在腳本中訪問時按需構建 。FieldData是通過從磁碟讀取每個段來讀取整個反向索引,然後逆置term->doc的關系,並將結果存儲在JVM堆中構建的。

所以,載入FieldData是開銷很大的操作,一旦它被載入後,就會在整個段的生命周期中保留在內存中。

這了可以注意下FieldData和Doc Values的區別。較早的版本中,其他數據類型也是用的FieldData,但是目前已經用隨文檔索引時創建的Doc Values所替代。

JVM堆內存資源是非常寶貴的,能用好它對系統的高效穩定運行至關重要。FieldData是直接放在堆內的,所以必須合理設定用於存放它的堆內存資源數。ES中控制FieldData內存使用的參數是 indices.fielddata.cache.size ,可以用x%表示占該節點堆內存百分比,也可以用如12GB這樣的數值。默認狀況下,這個設置是無限制的,ES不會從FieldData中驅逐數據。如果生成的fielddata大小超過指定的size,則將驅逐其他值以騰出空間。使用時一定要注意,這個設置只是一個安全策略而並非內存不足的解決方案。因為通過此配置觸發數據驅逐,ES會立刻開始從磁碟載入數據,並把其他數據驅逐以保證有足夠空間,導致很高的IO以及大量的需要被垃圾回收的內存垃圾。

舉個例子來說:每天為日誌文件建一個新的索引。一般來說我們只對最近幾天數據感興趣,很少查詢老數據。但是,按默認設置FieldData中的老索引數據是不會被驅逐的。這樣的話,FieldData就會一直持續增長直到觸發 熔斷機制 ,這個機制會讓你再也不能載入更多的FieldData到內存。這樣的場景下,你只能對老的索引訪問FieldData,但不能載入更多新數據。所以,這個時候就可以通過以上配置來把最近最少使用的FieldData驅逐以夠新進來的數據騰空間。

FieldData是在數據被載入後再檢查的,那麼如果一個查詢導致嘗試載入超過可用內存的數據就會導致OOM異常。ES中使用了 FieldData Circuit Breaker 來處理上述問題,他可以通過分析一個查詢涉及到的欄位的類型、基數、大小等來評估所需內存。如果估計的查詢大小大於配置的堆內存使用百分比限制,則斷路器會跳閘,查詢將被中止並返回異常。

斷路器是工作是在數據載入前,所以你不用擔心遇到FieldData導致的OOM異常。ES擁有多種類型的斷路器:

可以根據實際需要進行配置。

FieldData是為分詞String而生,它會消耗大量的java 堆空間,特別是載入基數(cardinality)很大的分詞String filed時。但是往往對這種類型的分詞Field做聚合是沒有意義的。

值得注意的是,FieldData和Doc Values的載入時機不同,前者是首次查詢時,後者是doc索引時。還有一點,FieldData是按每個段來緩存的。

doc_values與fielddata一個很顯著的區別是,前者的工作地盤主要在磁碟,而後者的工作地盤在內存。

索引速度稍低這個是相對於fielddata方案的,其實仔細想想也可以理解。拿排序舉例,相對於一個在磁碟排序,一個在內存排序,誰的速度快不言自明。

在ES 1.x版本的官方說法是,

雖然速度稍慢,doc_values的優勢還是非常明顯的。一個很顯著的點就是它不會隨著文檔的增多引起OOM問題。正如前面說的,doc_values在磁碟創建排序和聚合所需的正排索引。這樣我們就避免了在生產環境給ES設置一個很大的 HEAP_SIZE ,也使得JVM的GC更加高效,這個又為其它的操作帶來了間接的好處。

而且,隨著ES版本的升級,對於doc_values的優化越來越好,索引的速度已經很接近fielddata了,而且我們知道硬碟的訪問速度也是越來越快(比如SSD)。所以 doc_values 現在可以滿足大部分場景,也是ES官方重點維護的對象。

所以我想說的是,doc values相比field data還是有很多優勢的。所以 ES2.x 之後,支持聚合的欄位屬性默認都使用doc_values,而不是fielddata。

Global Ordinals是一個在Doc Values和FieldData之上的數據結構,它為每個唯一的term按字典序維護了一個自增的數字序列。每個term都有自己的一個唯一數字,而且字母A的全局序號小於字母B。特別注意,全局序號只支持String類型的field。

請注意,Doc Values和FieldData也有自己的ordinals序號,這個序號是特定segment和field中的唯一編號。通過提供Segment Ordinals和Global Ordinals間的映射關系,全局序號只是在此基礎上創建,後者(即全局序號)是在整個shard分片中是唯一的。

一個特定欄位的Global Ordinals跟一個分片中的所有段相關,而Doc Values和FieldData的ordinals只跟單個段相關。因此,只要是一個新段要變得可見,那麼就必須完全重建全局序號。

也就是說,跟FieldData一樣,在默認情況下全局序號也是懶載入的,會在第一個請求FieldData命中一個索引時來構建全局序號。實際上,在為每個段載入FieldData後,ES就會創建一個稱為Global Ordinals(全局序號)的數據結構來構建一個由分片內的所有段中的唯一term組成的列表。

全局序號的內存開銷小的原因是它由非常高效的壓縮機制。提前載入的全局序號可以將載入時間從第一次搜索時轉到全局序號刷新時。

全局序號的載入時間依賴於一個欄位中的term數量,但是總的來說耗時較低,因為來源的欄位數據都已經載入到內存了。

全局序號在用到段序號的時候很有用,比如排序或者terms aggregation,可以提升執行效率。

我們舉個簡單的例子。比如有十億級別的doc,每個doc都有一個status欄位,但只有pending, published, deleted三個狀態數據。如果直接存整個String數據到內存,那麼就算每個doc有15位元組,那麼一共就是差不多14GB的數據。怎麼減少佔用空間呢?首先想到的就是用數字來進行編碼,碼表如下:

這樣的話,初始的那三個String就只在碼表內被存了一次。FieldData中的doc就可以直接用編碼來指向實際值:

這樣編碼以後,直接把數據量壓縮了十倍左右。但有個問題是FieldData是按每個段來分別載入、緩存的。那麼就會出現一個情況,如果一個段內的doc只有deleted和published兩個狀態,那麼就會導致該FieldData算出來的碼表只有0和1,這就和擁有3個狀態的段算出的FieldData碼表不同。這樣的話,聚合的時候就必須一個段一個段的計算,最後再聚合,十分緩慢,開銷巨大。

ES的做法是用Global Ordinals這種構建在FieldData之上的小巧數據結構,編碼會結合所有段來計算唯一值然後存放為一個序號碼表。這樣一來,term aggregation可以只在全局序號上進行聚合,而且只會在聚合的最終階段來計算從序號到真實的String值一次。這個機制可以提升聚合的性能3-4倍。

㈡ 這幾個實用的油猴腳本你有嗎

TemperMoneky 油猴,最流行的一款腳本管理器,它適用於chrome、Microsoft Edge、Safari、Opera Next、Firefox。通過這些腳本,可實現視頻解析、音樂下載、網盤直連解析、豆瓣資源下載、網路文庫增強、屏蔽網站廣告、網頁加速器等功能。

如何使用油猴腳本呢?

1.安裝 TemperMoneky 腳本管理器,可至 https://www.tampermonkey.net/ 或是 https://www.crx4chrome.com/ 下載

2.可在 https://greasyfork.org/zh-CN 或 https://openuserjs.org 或 http://userscripts-mirror.org 搜索相關關鍵詞下載腳本

3.使用腳本

1.Endless Google - 自動翻頁谷歌搜索結果

Endless Google 腳本實現的是每次滾動到搜索結果每一頁底部時,會自動實現翻頁,並快速展示下一頁內容,無需再次手動點擊下一頁

2.remove-web-limits - 網頁限制解除

remove-web-limits 腳本通殺大部分網站,可以解除禁止復制、剪切、選擇文本、右鍵菜單的限制;基本不影響網頁正常功能,如果影響了任何功能,可以暫時禁用腳本解決

3.AC- - 重定向優化網路搜狗谷歌必應搜索_favicon_雙列

AC- 腳本繞過網路、搜狗、Google 搜索結果的重定向,直達原網頁,減少打開目標網頁的時間。這款腳本改進了搜索頁面的顯示,為搜索結果添加了 Favicon 網站小圖標,增加了辨識度,還可為搜索結果頁面設置了單列或者雙列顯示模式、自定義攔截、自動翻頁

4.Yet Another Weibo Filter - 看真正想看的微博

YWF腳本的功能非常豐富,包括對外觀、內容、版面、排版、過濾等方面的優化,通過對內容的過濾,版面圖標的優化清理、外觀樣式的修改,讓微博不再眼花繚亂


5.Userscript+ - 油猴腳本推薦

」授人以魚,不如授人以漁「。

好用的腳本數不勝數,每個用戶都有自己獨特的使用需求。

而Userscript+是一款可以根據你當前訪問的站點,自動為你推薦適用的腳本工具。

6.Search By Image - 以圖搜圖

可以快速選擇網頁中的圖片來進行搜索相似的圖片,同時還支持上傳本地圖片進行搜索

7.searchEngineJump - 搜索引擎快捷跳轉

方便地在各個搜索引擎之間跳轉,增加可視化設置菜單,能更友好地自定義設置,修復網路搜索樣式丟失的問題

8.網盤助手

可以自動填充網路網盤提取碼,和wifi萬能鑰匙類似

9.豆瓣資源下載大師

聚合數百家資源網站,通過右側邊欄1秒告訴你哪些網站能下載豆瓣頁面上的電影|電視劇|紀錄片|綜藝|動畫|音樂|圖書等,有資源的網站顯示綠色,沒資源的網站顯示黃色,就這么直觀!所有豆瓣條目均提供在線播放|閱讀、字幕|歌詞下載及PT|NZB|BT|磁力|網路盤|115網盤等下載鏈接,此外還能給豆瓣條目額外添加IMDB評分|IMDB TOP 250|Metascore評分|爛番茄評分|AniDB評分|Bgm評分|MAL|亞馬遜評分等更多評分形式

熱點內容
在c語言中表示什麼 發布:2024-11-24 19:04:46 瀏覽:408
discuz友情鏈接緩存 發布:2024-11-24 19:00:11 瀏覽:693
資料庫時區 發布:2024-11-24 18:28:30 瀏覽:614
板的塑性演算法 發布:2024-11-24 18:17:59 瀏覽:29
酷狗緩存亂碼 發布:2024-11-24 18:12:42 瀏覽:509
aes演算法模式 發布:2024-11-24 17:47:19 瀏覽:612
linux查看埠是否佔用 發布:2024-11-24 17:42:15 瀏覽:467
手機電影天堂的文件夾 發布:2024-11-24 17:39:08 瀏覽:690
吉林金稅盤安全伺服器地址 發布:2024-11-24 17:39:00 瀏覽:277
360無法訪問網路 發布:2024-11-24 17:32:48 瀏覽:558