1. 程式人生 > >ES聚合原理:(來源自官方文件)

ES聚合原理:(來源自官方文件)

聚合原理:(來源自官方文件)

大多數字段預設為索引,這使得它們可以搜尋。 但是,排序,聚合和訪問指令碼中的欄位值需要與搜尋不同的訪問模式。

搜尋需要回答“哪些文件包含此術語?”的問題,而排序和聚合需要回答一個不同的問題:“本文對這個文件有什麼價值?”。

大多數字段可以使用索引時間,磁碟上doc_values這種資料訪問模式,但文字欄位不支援doc_values。

相反,文字欄位使用名為fielddata的查詢時記憶體資料結構。 這種資料結構是在第一次將欄位用於聚合,排序或指令碼時構建的。 它是通過從磁碟讀取每個段的整個倒排索引而構建的,反轉術語↔︎文件關係,並將結果儲存在記憶體中的JVM堆中。

Fielddata可以消耗大量堆空間,特別是在載入高基數文字欄位時。 一旦fielddata被載入到堆中,它將在該段的整個生命週期內保持在那裡。 此外,載入fielddata是一個昂貴的過程,可能會導致使用者體驗延遲命中。 這就是為什麼fielddata預設是禁用的。

如果您嘗試對文字欄位上的指令碼進行排序,聚合或訪問值,則會看到以下異常:

   Fielddata is disabled on text fields by default. Set fielddata=true on [your_field_name] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory.

     // Fielddata在預設情況下在文字欄位中被禁用。 在[your_field_name]上設定fielddata = true,以便通過取消倒置索引來載入記憶體中的fielddata。 請注意,這可以使用大量的記憶體。

Fielddata過濾可用於減少載入到記憶體中的術語數量,從而減少記憶體使用量。 術語可以按頻率過濾:

頻率過濾器允許您只加載文件頻率落在最小值和最大值之間的項,可以用絕對值(數值大於1.0)或百分比表示(例如,0.01為1%,1.0為100%)。 頻率按每個段計算。 百分比基於具有該欄位價值的文件數量,而不是該分段中的所有文件。

小段可以通過指定段包含min_segment_size的文件的最小數量來完全排除