RoaringBitmap外掛能將ElasticSearch過濾效能提高 10 倍

banq發表於2021-11-29

Java中更好地壓縮點陣圖、位集。通常用作快速資料結構,如果沒有壓縮它們可能會使用太多記憶體。RoaringBitmap效能往往優於傳統的壓縮點陣圖,例如 WAH、EWAH 或 Concise。特點:

  • 非常快的隨機訪問
  • 良好的壓縮比
  • 快速計算
  • 快速序列化

以下列方式工作:

它將資料分成 2^16 個整數的塊(例如,[0, 2^16), [2^16, 2 x 2^16), ...)。在塊中,它可以使用未壓縮的點陣圖、簡單的整數列表或執行列表。無論它使用什麼格式,它們都允許您快速檢查值是否存在(例如,使用二進位制搜尋)。

這將如何改善您的整體系統:

  • 要傳輸的資料更少——不僅從客戶端到伺服器,而且在 ES 節點之間。
  • 更少的記憶體使用——我們的客戶端將使用更少的記憶體,但最重要的是,ES 節點也將使用更少的記憶體。
  • 更少的磁碟空間——如果這些列表需要儲存在資料庫中的某個地方,使用 RoaringBitmaps 儲存它可以節省大量空間。
  • 高效查詢——Roaringbitmaps 對於記憶體中查詢來說非常高效和快速

下面是ElasticSearch 外掛程式碼:

@Override
public FilterScript newInstance(LeafReaderContext context) throws IOException {
    final byte[] decodedTerms = Base64.getDecoder().decode(terms);
    final ByteBuffer buffer = ByteBuffer.wrap(decodedTerms);
    RoaringBitmap rBitmap = new RoaringBitmap();
    rBitmap.deserialize(buffer);

    return new FilterScript(params, lookup, context) {

        @Override
        public boolean execute() {
            try {
                final ScriptDocValues.Longs fieldNameValue = (ScriptDocValues.Longs)getDoc().get(fieldName);
                final int docId = (int)fieldNameValue.getValue();    

                if (opType.equals("exclude") && rBitmap.contains(docId)) {
                    return false;
                }
                else if (opType.equals("include") && !rBitmap.contains(docId)) {
                    return false;
                }
                return true;

            } catch (Exception exception) {
                throw exception;
            }
        }
    };
}

外掛庫Github

相關文章