You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by ha...@apache.org on 2022/08/24 23:55:18 UTC

[skywalking-banyandb] 01/01: Use bluge to implement inverted index

This is an automated email from the ASF dual-hosted git repository.

hanahmily pushed a commit to branch index-bluge
in repository https://gitbox.apache.org/repos/asf/skywalking-banyandb.git

commit 54ac2e21e682281f583fee070e34cea29644e67d
Author: Gao Hongtao <ha...@gmail.com>
AuthorDate: Wed Aug 24 23:46:56 2022 +0000

    Use bluge to implement inverted index
    
    Signed-off-by: Gao Hongtao <ha...@gmail.com>
---
 banyand/tsdb/block.go                              |  14 +-
 banyand/tsdb/index/writer.go                       | 207 +++++++------
 banyand/tsdb/indexdb.go                            |  45 +--
 banyand/tsdb/series_write.go                       |  18 +-
 dist/LICENSE                                       |  14 +-
 .../license-github.com-axiomhq-hyperloglog.txt     |  21 ++
 ...nse-github.com-blevesearch-go-porterstemmer.txt |  19 ++
 .../license-github.com-blevesearch-mmap-go.txt     |  25 ++
 .../license-github.com-blevesearch-segment.txt}    | 226 ++------------
 ...license-github.com-blevesearch-snowballstem.txt |  29 ++
 .../license-github.com-blevesearch-vellum.txt}     | 226 ++------------
 ...nse-github.com-blugelabs-bluge-segment-api.txt} | 226 ++------------
 .../license-github.com-blugelabs-bluge.txt}        | 226 ++------------
 .../license-github.com-blugelabs-ice-v2.txt}       | 226 ++------------
 .../license-github.com-blugelabs-ice.txt}          | 226 ++------------
 .../license-github.com-caio-go-tdigest.txt         |  21 ++
 .../license-github.com-dgryski-go-metro.txt        |  24 ++
 go.mod                                             |  14 +-
 go.sum                                             |  53 +++-
 pkg/index/index.go                                 |  22 +-
 pkg/index/inverted/field_map.go                    |  90 ------
 pkg/index/inverted/inverted.go                     | 331 ++++++++++-----------
 pkg/index/inverted/inverted_test.go                |  73 -----
 pkg/index/inverted/mem.go                          | 245 ---------------
 pkg/index/inverted/mem_test.go                     |  38 ---
 pkg/index/inverted/term_map.go                     |  96 ------
 pkg/index/lsm/lsm.go                               |  17 +-
 pkg/index/testcases/duration.go                    |   4 +-
 pkg/index/testcases/service_name.go                |   8 +-
 pkg/logger/logger.go                               |   4 +
 30 files changed, 733 insertions(+), 2055 deletions(-)

diff --git a/banyand/tsdb/block.go b/banyand/tsdb/block.go
index a090f41..1dc1df0 100644
--- a/banyand/tsdb/block.go
+++ b/banyand/tsdb/block.go
@@ -295,8 +295,8 @@ type blockDelegate interface {
 	contains(ts time.Time) bool
 	write(key []byte, val []byte, ts time.Time) error
 	writePrimaryIndex(field index.Field, id common.ItemID) error
-	writeLSMIndex(field index.Field, id common.ItemID) error
-	writeInvertedIndex(field index.Field, id common.ItemID) error
+	writeLSMIndex(fields []index.Field, id common.ItemID) error
+	writeInvertedIndex(fields []index.Field, id common.ItemID) error
 	dataReader() kv.TimeSeriesReader
 	lsmIndexReader() index.Searcher
 	invertedIndexReader() index.Searcher
@@ -341,15 +341,15 @@ func (d *bDelegate) write(key []byte, val []byte, ts time.Time) error {
 }
 
 func (d *bDelegate) writePrimaryIndex(field index.Field, id common.ItemID) error {
-	return d.delegate.lsmIndex.Write(field, id)
+	return d.delegate.lsmIndex.Write([]index.Field{field}, id)
 }
 
-func (d *bDelegate) writeLSMIndex(field index.Field, id common.ItemID) error {
-	return d.delegate.lsmIndex.Write(field, id)
+func (d *bDelegate) writeLSMIndex(fields []index.Field, id common.ItemID) error {
+	return d.delegate.lsmIndex.Write(fields, id)
 }
 
-func (d *bDelegate) writeInvertedIndex(field index.Field, id common.ItemID) error {
-	return d.delegate.invertedIndex.Write(field, id)
+func (d *bDelegate) writeInvertedIndex(fields []index.Field, id common.ItemID) error {
+	return d.delegate.invertedIndex.Write(fields, id)
 }
 
 func (d *bDelegate) contains(ts time.Time) bool {
diff --git a/banyand/tsdb/index/writer.go b/banyand/tsdb/index/writer.go
index 8b0dcc9..4204b0f 100644
--- a/banyand/tsdb/index/writer.go
+++ b/banyand/tsdb/index/writer.go
@@ -58,13 +58,20 @@ type WriterOptions struct {
 	EnableGlobalIndex bool
 }
 
+const (
+	local = 1 << iota
+	global
+	inverted
+	tree
+)
+
 type Writer struct {
 	l                 *logger.Logger
 	db                tsdb.Supplier
 	shardNum          uint32
 	enableGlobalIndex bool
 	ch                chan Message
-	indexRuleIndex    []*partition.IndexRuleLocator
+	invertRuleIndex   map[byte][]*partition.IndexRuleLocator
 }
 
 func NewWriter(ctx context.Context, options WriterOptions) *Writer {
@@ -78,7 +85,30 @@ func NewWriter(ctx context.Context, options WriterOptions) *Writer {
 	w.shardNum = options.ShardNum
 	w.db = options.DB
 	w.enableGlobalIndex = options.EnableGlobalIndex
-	w.indexRuleIndex = partition.ParseIndexRuleLocators(options.Families, options.IndexRules)
+	w.invertRuleIndex = make(map[byte][]*partition.IndexRuleLocator, 4)
+	for _, ruleIndex := range partition.ParseIndexRuleLocators(options.Families, options.IndexRules) {
+		rule := ruleIndex.Rule
+		var key byte
+		switch rule.GetLocation() {
+		case databasev1.IndexRule_LOCATION_SERIES:
+			key = key | local
+		case databasev1.IndexRule_LOCATION_GLOBAL:
+			if !w.enableGlobalIndex {
+				w.l.Warn().Stringer("index-rule", ruleIndex.Rule).Msg("global index is disabled")
+				continue
+			}
+			key = key | global
+		}
+		switch rule.Type {
+		case databasev1.IndexRule_TYPE_INVERTED:
+			key = key | inverted
+		case databasev1.IndexRule_TYPE_TREE:
+			key = key | tree
+		}
+		rules := w.invertRuleIndex[key]
+		rules = append(rules, ruleIndex)
+		w.invertRuleIndex[key] = rules
+	}
 	w.ch = make(chan Message)
 	w.bootIndexGenerator()
 	return w
@@ -97,21 +127,11 @@ func (s *Writer) Close() error {
 func (s *Writer) bootIndexGenerator() {
 	go func() {
 		for m := range s.ch {
-			var err error
-			for _, ruleIndex := range s.indexRuleIndex {
-				rule := ruleIndex.Rule
-				switch rule.GetLocation() {
-				case databasev1.IndexRule_LOCATION_SERIES:
-					err = multierr.Append(err, writeLocalIndex(m.LocalWriter, ruleIndex, m.Value))
-				case databasev1.IndexRule_LOCATION_GLOBAL:
-					if !s.enableGlobalIndex {
-						s.l.Warn().Stringer("index-rule", ruleIndex.Rule).Msg("global index is disabled")
-						continue
-					}
-					err = multierr.Append(err, s.writeGlobalIndex(m.Scope, ruleIndex, m.LocalWriter.ItemID(), m.Value))
-				}
-			}
-			err = multierr.Append(err, m.BlockCloser.Close())
+			err := multierr.Combine(
+				s.writeLocalIndex(m.LocalWriter, m.Value),
+				s.writeGlobalIndex(m.Scope, m.LocalWriter.ItemID(), m.Value),
+				m.BlockCloser.Close(),
+			)
 			if err != nil {
 				s.l.Error().Err(err).Msg("encounter some errors when generating indices")
 			}
@@ -123,84 +143,95 @@ func (s *Writer) bootIndexGenerator() {
 }
 
 // TODO: should listen to pipeline in a distributed cluster
-func (s *Writer) writeGlobalIndex(scope tsdb.Entry, ruleIndex *partition.IndexRuleLocator, ref tsdb.GlobalItemID, value Value) error {
-	values, _, err := getIndexValue(ruleIndex, value)
-	if err != nil {
-		return err
-	}
-	if values == nil {
-		return nil
-	}
-	var errWriting error
-	for _, val := range values {
-		indexShardID, err := partition.ShardID(val, s.shardNum)
-		if err != nil {
-			return err
-		}
-		shard, err := s.db.SupplyTSDB().Shard(common.ShardID(indexShardID))
-		if err != nil {
-			return err
-		}
-		builder := shard.Index().WriterBuilder()
-		indexWriter, err := builder.
-			Scope(scope).
-			GlobalItemID(ref).
-			Time(value.Timestamp).
-			Build()
-		if err != nil {
-			return err
+func (s *Writer) writeGlobalIndex(scope tsdb.Entry, ref tsdb.GlobalItemID, value Value) error {
+	collect := func(ruleIndexes []*partition.IndexRuleLocator, fn func(indexWriter tsdb.IndexWriter, fields []index.Field) error) error {
+		fields := make(map[uint][]index.Field)
+		for _, ruleIndex := range ruleIndexes {
+			values, _, err := getIndexValue(ruleIndex, value)
+			if err != nil {
+				return err
+			}
+			if values == nil {
+				continue
+			}
+			for _, val := range values {
+				indexShardID, err := partition.ShardID(val, s.shardNum)
+				if err != nil {
+					return err
+				}
+				rule := ruleIndex.Rule
+				rr := fields[indexShardID]
+				rr = append(rr, index.Field{
+					Key: index.FieldKey{
+						IndexRuleID: rule.GetMetadata().GetId(),
+					},
+					Term: val,
+				})
+				fields[indexShardID] = rr
+			}
 		}
-		rule := ruleIndex.Rule
-		switch rule.GetType() {
-		case databasev1.IndexRule_TYPE_INVERTED:
-			errWriting = multierr.Append(errWriting, indexWriter.WriteInvertedIndex(index.Field{
-				Key: index.FieldKey{
-					IndexRuleID: rule.GetMetadata().GetId(),
-				},
-				Term: val,
-			}))
-		case databasev1.IndexRule_TYPE_TREE:
-			errWriting = multierr.Append(errWriting, indexWriter.WriteLSMIndex(index.Field{
-				Key: index.FieldKey{
-					IndexRuleID: rule.GetMetadata().GetId(),
-				},
-				Term: val,
-			}))
+		for shardID, rules := range fields {
+			shard, err := s.db.SupplyTSDB().Shard(common.ShardID(shardID))
+			if err != nil {
+				return err
+			}
+			builder := shard.Index().WriterBuilder()
+			indexWriter, err := builder.
+				Scope(scope).
+				GlobalItemID(ref).
+				Time(value.Timestamp).
+				Build()
+			if err != nil {
+				return err
+			}
+			err = fn(indexWriter, rules)
+			if err != nil {
+				return err
+			}
 		}
+		return nil
 	}
-	return errWriting
+	return multierr.Combine(
+		collect(s.invertRuleIndex[global|inverted], func(indexWriter tsdb.IndexWriter, fields []index.Field) error {
+			return indexWriter.WriteInvertedIndex(fields)
+		}),
+		collect(s.invertRuleIndex[global|tree], func(indexWriter tsdb.IndexWriter, fields []index.Field) error {
+			return indexWriter.WriteLSMIndex(fields)
+		}),
+	)
 }
 
-func writeLocalIndex(writer tsdb.Writer, ruleIndex *partition.IndexRuleLocator, value Value) (err error) {
-	values, _, err := getIndexValue(ruleIndex, value)
-	if err != nil {
-		return err
-	}
-	if values == nil {
-		return nil
-	}
-	var errWriting error
-	for _, val := range values {
-		rule := ruleIndex.Rule
-		switch rule.GetType() {
-		case databasev1.IndexRule_TYPE_INVERTED:
-			errWriting = multierr.Append(errWriting, writer.WriteInvertedIndex(index.Field{
-				Key: index.FieldKey{
-					IndexRuleID: rule.GetMetadata().GetId(),
-				},
-				Term: val,
-			}))
-		case databasev1.IndexRule_TYPE_TREE:
-			errWriting = multierr.Append(errWriting, writer.WriteLSMIndex(index.Field{
-				Key: index.FieldKey{
-					IndexRuleID: rule.GetMetadata().GetId(),
-				},
-				Term: val,
-			}))
+func (s *Writer) writeLocalIndex(writer tsdb.Writer, value Value) (err error) {
+	collect := func(ruleIndexes []*partition.IndexRuleLocator, fn func(fields []index.Field) error) error {
+		var fields []index.Field
+		for _, ruleIndex := range ruleIndexes {
+			values, _, err := getIndexValue(ruleIndex, value)
+			if err != nil {
+				return err
+			}
+			if values == nil {
+				continue
+			}
+			for _, val := range values {
+				rule := ruleIndex.Rule
+				fields = append(fields, index.Field{
+					Key: index.FieldKey{
+						IndexRuleID: rule.GetMetadata().GetId(),
+					},
+					Term: val,
+				})
+			}
 		}
+		return fn(fields)
 	}
-
-	return errWriting
+	return multierr.Combine(
+		collect(s.invertRuleIndex[local|inverted], func(fields []index.Field) error {
+			return writer.WriteInvertedIndex(fields)
+		}),
+		collect(s.invertRuleIndex[local|tree], func(fields []index.Field) error {
+			return writer.WriteLSMIndex(fields)
+		}),
+	)
 }
 
 var ErrUnsupportedIndexType = errors.New("unsupported index type")
diff --git a/banyand/tsdb/indexdb.go b/banyand/tsdb/indexdb.go
index 261b39e..e7ce863 100644
--- a/banyand/tsdb/indexdb.go
+++ b/banyand/tsdb/indexdb.go
@@ -22,6 +22,7 @@ import (
 	"time"
 
 	"github.com/pkg/errors"
+	"go.uber.org/multierr"
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	"github.com/apache/skywalking-banyandb/banyand/kv"
@@ -36,8 +37,8 @@ type IndexDatabase interface {
 }
 
 type IndexWriter interface {
-	WriteLSMIndex(field index.Field) error
-	WriteInvertedIndex(field index.Field) error
+	WriteLSMIndex(field []index.Field) error
+	WriteInvertedIndex(field []index.Field) error
 }
 
 type IndexWriterBuilder interface {
@@ -150,26 +151,34 @@ type indexWriter struct {
 	itemID *GlobalItemID
 }
 
-func (i *indexWriter) WriteLSMIndex(field index.Field) error {
-	if i.scope != nil {
-		field.Key.SeriesID = GlobalSeriesID(i.scope)
-	}
-	key, err := field.Marshal()
-	if err != nil {
-		return err
+func (i *indexWriter) WriteLSMIndex(fields []index.Field) (err error) {
+	for _, field := range fields {
+		if i.scope != nil {
+			field.Key.SeriesID = GlobalSeriesID(i.scope)
+		}
+		key, errInternal := field.Marshal()
+		if errInternal != nil {
+			err = multierr.Append(err, errInternal)
+			continue
+		}
+		err = multierr.Append(err, i.seg.globalIndex.PutWithVersion(key, i.itemID.Marshal(), uint64(i.ts.UnixNano())))
 	}
-	return i.seg.globalIndex.PutWithVersion(key, i.itemID.Marshal(), uint64(i.ts.UnixNano()))
+	return err
 }
 
-func (i *indexWriter) WriteInvertedIndex(field index.Field) error {
-	if i.scope != nil {
-		field.Key.SeriesID = GlobalSeriesID(i.scope)
-	}
-	key, err := field.Marshal()
-	if err != nil {
-		return err
+func (i *indexWriter) WriteInvertedIndex(fields []index.Field) (err error) {
+	for _, field := range fields {
+		if i.scope != nil {
+			field.Key.SeriesID = GlobalSeriesID(i.scope)
+		}
+		key, errInternal := field.Marshal()
+		if errInternal != nil {
+			err = multierr.Append(err, errInternal)
+			continue
+		}
+		err = multierr.Append(err, i.seg.globalIndex.PutWithVersion(key, i.itemID.Marshal(), uint64(i.ts.UnixNano())))
 	}
-	return i.seg.globalIndex.PutWithVersion(key, i.itemID.Marshal(), uint64(i.ts.UnixNano()))
+	return err
 }
 
 func GlobalSeriesID(scope Entry) common.SeriesID {
diff --git a/banyand/tsdb/series_write.go b/banyand/tsdb/series_write.go
index 0d0d82d..e3e4a22 100644
--- a/banyand/tsdb/series_write.go
+++ b/banyand/tsdb/series_write.go
@@ -145,14 +145,20 @@ func (w *writer) ItemID() GlobalItemID {
 	return *w.itemID
 }
 
-func (w *writer) WriteLSMIndex(field index.Field) error {
-	field.Key.SeriesID = w.itemID.SeriesID
-	return w.block.writeLSMIndex(field, w.itemID.ID)
+func (w *writer) WriteLSMIndex(fields []index.Field) error {
+	for i, f := range fields {
+		f.Key.SeriesID = w.itemID.SeriesID
+		fields[i] = f
+	}
+	return w.block.writeLSMIndex(fields, w.itemID.ID)
 }
 
-func (w *writer) WriteInvertedIndex(field index.Field) error {
-	field.Key.SeriesID = w.itemID.SeriesID
-	return w.block.writeInvertedIndex(field, w.itemID.ID)
+func (w *writer) WriteInvertedIndex(fields []index.Field) error {
+	for i, f := range fields {
+		f.Key.SeriesID = w.itemID.SeriesID
+		fields[i] = f
+	}
+	return w.block.writeInvertedIndex(fields, w.itemID.ID)
 }
 
 func (w *writer) String() string {
diff --git a/dist/LICENSE b/dist/LICENSE
index 7848d86..734f3c5 100644
--- a/dist/LICENSE
+++ b/dist/LICENSE
@@ -179,6 +179,12 @@ Apache-2.0 licenses
 ========================================================================
 
     github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
+    github.com/blevesearch/segment v0.9.0 Apache-2.0
+    github.com/blevesearch/vellum v1.0.7 Apache-2.0
+    github.com/blugelabs/bluge v0.2.2 Apache-2.0
+    github.com/blugelabs/bluge_segment_api v0.2.0 Apache-2.0
+    github.com/blugelabs/ice v1.0.0 Apache-2.0
+    github.com/blugelabs/ice/v2 v2.0.1 Apache-2.0
     github.com/coreos/go-semver v0.3.0 Apache-2.0
     github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
     github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
@@ -231,7 +237,7 @@ Apache-2.0 licenses
 Apache-2.0 and BSD-3-Clause licenses
 ========================================================================
 
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
+    github.com/RoaringBitmap/roaring v0.9.4 Apache-2.0 and BSD-3-Clause
 
 ========================================================================
 BSD-2-Clause licenses
@@ -246,6 +252,8 @@ BSD-3-Clause licenses
 ========================================================================
 
     github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
+    github.com/blevesearch/mmap-go v1.0.4 BSD-3-Clause
+    github.com/blevesearch/snowballstem v0.9.0 BSD-3-Clause
     github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
     github.com/gogo/protobuf v1.3.2 BSD-3-Clause
     github.com/golang/protobuf v1.5.2 BSD-3-Clause
@@ -283,9 +291,13 @@ MIT licenses
 ========================================================================
 
     github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
+    github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f MIT
     github.com/beorn7/perks v1.0.1 MIT
+    github.com/blevesearch/go-porterstemmer v1.0.3 MIT
+    github.com/caio/go-tdigest v3.1.0+incompatible MIT
     github.com/cespare/xxhash v1.1.0 MIT
     github.com/cespare/xxhash/v2 v2.1.2 MIT
+    github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc MIT
     github.com/dustin/go-humanize v1.0.0 MIT
     github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
     github.com/go-chi/chi/v5 v5.0.7 MIT
diff --git a/dist/licenses/license-github.com-axiomhq-hyperloglog.txt b/dist/licenses/license-github.com-axiomhq-hyperloglog.txt
new file mode 100644
index 0000000..8436fdb
--- /dev/null
+++ b/dist/licenses/license-github.com-axiomhq-hyperloglog.txt
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 Axiom Inc. <se...@axiom.sh>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/dist/licenses/license-github.com-blevesearch-go-porterstemmer.txt b/dist/licenses/license-github.com-blevesearch-go-porterstemmer.txt
new file mode 100644
index 0000000..8d2999c
--- /dev/null
+++ b/dist/licenses/license-github.com-blevesearch-go-porterstemmer.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Charles Iliya Krempeaux <ch...@reptile.ca> :: http://changelog.ca/
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/dist/licenses/license-github.com-blevesearch-mmap-go.txt b/dist/licenses/license-github.com-blevesearch-mmap-go.txt
new file mode 100644
index 0000000..8f05f33
--- /dev/null
+++ b/dist/licenses/license-github.com-blevesearch-mmap-go.txt
@@ -0,0 +1,25 @@
+Copyright (c) 2011, Evan Shaw <ed...@gmail.com>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright
+      notice, this list of conditions and the following disclaimer in the
+      documentation and/or other materials provided with the distribution.
+    * Neither the name of the copyright holder nor the
+      names of its contributors may be used to endorse or promote products
+      derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/dist/LICENSE b/dist/licenses/license-github.com-blevesearch-segment.txt
similarity index 53%
copy from dist/LICENSE
copy to dist/licenses/license-github.com-blevesearch-segment.txt
index 7848d86..7a4a3ea 100644
--- a/dist/LICENSE
+++ b/dist/licenses/license-github.com-blevesearch-segment.txt
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -173,204 +174,29 @@
       incurred by, or claims asserted against, such Contributor by reason
       of your accepting any such warranty or additional liability.
 
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
 
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
-    github.com/coreos/go-semver v0.3.0 Apache-2.0
-    github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
-    github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
-    github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/golang/glog v1.0.0 Apache-2.0
-    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.6.0 Apache-2.0
-    github.com/google/btree v1.0.1 Apache-2.0
-    github.com/google/flatbuffers v1.12.1 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
-    github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
-    github.com/jonboulle/clockwork v0.2.2 Apache-2.0
-    github.com/matttproud/golang_protobuf_extensions v1.0.1 Apache-2.0
-    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
-    github.com/mschoch/smat v0.2.0 Apache-2.0
-    github.com/oklog/run v1.1.0 Apache-2.0
-    github.com/prometheus/client_golang v1.12.2 Apache-2.0
-    github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.32.1 Apache-2.0
-    github.com/prometheus/procfs v0.7.3 Apache-2.0
-    github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.8.2 Apache-2.0
-    github.com/spf13/cobra v1.4.0 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/v2 v2.305.4 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/raft/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/server/v3 v3.5.4 Apache-2.0
-    go.opencensus.io v0.23.0 Apache-2.0
-    go.opentelemetry.io/contrib v0.20.0 Apache-2.0
-    go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/exporters/otlp v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/export/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/trace v0.20.0 Apache-2.0
-    go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
-    google.golang.org/genproto v0.0.0-20220615141314-f1464d18c36b Apache-2.0
-    google.golang.org/grpc v1.47.0 Apache-2.0
-    gopkg.in/ini.v1 v1.66.4 Apache-2.0
-    gopkg.in/yaml.v2 v2.4.0 Apache-2.0
-
-========================================================================
-Apache-2.0 and BSD-3-Clause licenses
-========================================================================
-
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
-
-========================================================================
-BSD-2-Clause licenses
-========================================================================
-
-    github.com/gorilla/websocket v1.4.2 BSD-2-Clause
-    github.com/magiconair/properties v1.8.6 BSD-2-Clause
-    github.com/pkg/errors v0.9.1 BSD-2-Clause
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
-    github.com/gogo/protobuf v1.3.2 BSD-3-Clause
-    github.com/golang/protobuf v1.5.2 BSD-3-Clause
-    github.com/golang/snappy v0.0.3 BSD-3-Clause
-    github.com/google/go-cmp v0.5.8 BSD-3-Clause
-    github.com/google/uuid v1.3.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.3 BSD-3-Clause
-    github.com/pmezard/go-difflib v1.0.0 BSD-3-Clause
-    github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 BSD-3-Clause
-    golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f BSD-3-Clause
-    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
-    golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 BSD-3-Clause
-    golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a BSD-3-Clause
-    golang.org/x/text v0.3.7 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba BSD-3-Clause
-    golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df BSD-3-Clause
-    google.golang.org/protobuf v1.28.0 BSD-3-Clause
-
-========================================================================
-BSD-3-Clause and Apache-2.0 and MIT licenses
-========================================================================
-
-    github.com/klauspost/compress v1.15.6 BSD-3-Clause and Apache-2.0 and MIT
-
-========================================================================
-ISC licenses
-========================================================================
-
-    github.com/davecgh/go-spew v1.1.1 ISC
-
-========================================================================
-MIT licenses
-========================================================================
-
-    github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
-    github.com/beorn7/perks v1.0.1 MIT
-    github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.2 MIT
-    github.com/dustin/go-humanize v1.0.0 MIT
-    github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
-    github.com/go-chi/chi/v5 v5.0.7 MIT
-    github.com/json-iterator/go v1.1.12 MIT
-    github.com/mitchellh/mapstructure v1.5.0 MIT
-    github.com/onsi/ginkgo/v2 v2.1.4 MIT
-    github.com/onsi/gomega v1.20.0 MIT
-    github.com/pelletier/go-toml/v2 v2.0.1 MIT
-    github.com/rs/zerolog v1.26.1 MIT
-    github.com/sirupsen/logrus v1.7.0 MIT
-    github.com/spf13/cast v1.5.0 MIT
-    github.com/spf13/jwalterweatherman v1.1.0 MIT
-    github.com/spf13/viper v1.12.0 MIT
-    github.com/stretchr/objx v0.1.1 MIT
-    github.com/stretchr/testify v1.7.1 MIT
-    github.com/subosito/gotenv v1.3.0 MIT
-    github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
-    github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    go.etcd.io/bbolt v1.3.6 MIT
-    go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/multierr v1.8.0 MIT
-    go.uber.org/zap v1.17.0 MIT
-    gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
-
-========================================================================
-MIT and Apache-2.0 licenses
-========================================================================
-
-    github.com/pelletier/go-toml v1.9.5 MIT and Apache-2.0
-    gopkg.in/yaml.v3 v3.0.1 MIT and Apache-2.0
-
-========================================================================
-MIT and BSD-3-Clause licenses
-========================================================================
-
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
-
-========================================================================
-MPL-2.0 licenses
-========================================================================
-
-    github.com/hashicorp/golang-lru v0.5.4 MPL-2.0
-    github.com/hashicorp/hcl v1.0.0 MPL-2.0
-
-========================================================================
-UI related licenses
-========================================================================
-
-The following components are used in UI.See project link for details.
-The text of each license is also included at licenses/ui-licenses/LICENSE-[project].txt.
- 
-
-========================================================================
-0BSD licenses
-========================================================================
-
-    tslib 2.3.0 0BSD
-
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    echarts 5.3.3 Apache-2.0
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    normalize-wheel 1.0.1 BSD-3-Clause
-    zrender 5.3.2 BSD-3-Clause
-
-========================================================================
-MIT licenses
-========================================================================
-
-    async-validator  MIT
-    babel-helper-vue-jsx-merge-props 2.0.3 MIT
-    babel-runtime 6.26.0 MIT
-    babel-runtime/node_modules/core-js 2.6.12 MIT
-    babel-runtime/node_modules/regenerator-runtime 0.11.1 MIT
-    core-js 3.22.8 MIT
-    deepmerge 1.5.2 MIT
-    element-ui 2.15.9 MIT
-    resize-observer-polyfill 1.5.1 MIT
-    throttle-debounce 1.1.0 MIT
-    vue 2.6.14 MIT
-    vue-router 3.5.4 MIT
-    vuex 3.6.2 MIT
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/dist/licenses/license-github.com-blevesearch-snowballstem.txt b/dist/licenses/license-github.com-blevesearch-snowballstem.txt
new file mode 100644
index 0000000..f36607f
--- /dev/null
+++ b/dist/licenses/license-github.com-blevesearch-snowballstem.txt
@@ -0,0 +1,29 @@
+Copyright (c) 2001, Dr Martin Porter
+Copyright (c) 2004,2005, Richard Boulton
+Copyright (c) 2013, Yoshiki Shibukawa
+Copyright (c) 2006,2007,2009,2010,2011,2014-2019, Olly Betts
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+  1. Redistributions of source code must retain the above copyright notice,
+     this list of conditions and the following disclaimer.
+  2. Redistributions in binary form must reproduce the above copyright notice,
+     this list of conditions and the following disclaimer in the documentation
+     and/or other materials provided with the distribution.
+  3. Neither the name of the Snowball project nor the names of its contributors
+     may be used to endorse or promote products derived from this software
+     without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dist/LICENSE b/dist/licenses/license-github.com-blevesearch-vellum.txt
similarity index 53%
copy from dist/LICENSE
copy to dist/licenses/license-github.com-blevesearch-vellum.txt
index 7848d86..7a4a3ea 100644
--- a/dist/LICENSE
+++ b/dist/licenses/license-github.com-blevesearch-vellum.txt
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -173,204 +174,29 @@
       incurred by, or claims asserted against, such Contributor by reason
       of your accepting any such warranty or additional liability.
 
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
 
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
-    github.com/coreos/go-semver v0.3.0 Apache-2.0
-    github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
-    github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
-    github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/golang/glog v1.0.0 Apache-2.0
-    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.6.0 Apache-2.0
-    github.com/google/btree v1.0.1 Apache-2.0
-    github.com/google/flatbuffers v1.12.1 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
-    github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
-    github.com/jonboulle/clockwork v0.2.2 Apache-2.0
-    github.com/matttproud/golang_protobuf_extensions v1.0.1 Apache-2.0
-    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
-    github.com/mschoch/smat v0.2.0 Apache-2.0
-    github.com/oklog/run v1.1.0 Apache-2.0
-    github.com/prometheus/client_golang v1.12.2 Apache-2.0
-    github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.32.1 Apache-2.0
-    github.com/prometheus/procfs v0.7.3 Apache-2.0
-    github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.8.2 Apache-2.0
-    github.com/spf13/cobra v1.4.0 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/v2 v2.305.4 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/raft/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/server/v3 v3.5.4 Apache-2.0
-    go.opencensus.io v0.23.0 Apache-2.0
-    go.opentelemetry.io/contrib v0.20.0 Apache-2.0
-    go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/exporters/otlp v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/export/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/trace v0.20.0 Apache-2.0
-    go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
-    google.golang.org/genproto v0.0.0-20220615141314-f1464d18c36b Apache-2.0
-    google.golang.org/grpc v1.47.0 Apache-2.0
-    gopkg.in/ini.v1 v1.66.4 Apache-2.0
-    gopkg.in/yaml.v2 v2.4.0 Apache-2.0
-
-========================================================================
-Apache-2.0 and BSD-3-Clause licenses
-========================================================================
-
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
-
-========================================================================
-BSD-2-Clause licenses
-========================================================================
-
-    github.com/gorilla/websocket v1.4.2 BSD-2-Clause
-    github.com/magiconair/properties v1.8.6 BSD-2-Clause
-    github.com/pkg/errors v0.9.1 BSD-2-Clause
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
-    github.com/gogo/protobuf v1.3.2 BSD-3-Clause
-    github.com/golang/protobuf v1.5.2 BSD-3-Clause
-    github.com/golang/snappy v0.0.3 BSD-3-Clause
-    github.com/google/go-cmp v0.5.8 BSD-3-Clause
-    github.com/google/uuid v1.3.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.3 BSD-3-Clause
-    github.com/pmezard/go-difflib v1.0.0 BSD-3-Clause
-    github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 BSD-3-Clause
-    golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f BSD-3-Clause
-    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
-    golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 BSD-3-Clause
-    golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a BSD-3-Clause
-    golang.org/x/text v0.3.7 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba BSD-3-Clause
-    golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df BSD-3-Clause
-    google.golang.org/protobuf v1.28.0 BSD-3-Clause
-
-========================================================================
-BSD-3-Clause and Apache-2.0 and MIT licenses
-========================================================================
-
-    github.com/klauspost/compress v1.15.6 BSD-3-Clause and Apache-2.0 and MIT
-
-========================================================================
-ISC licenses
-========================================================================
-
-    github.com/davecgh/go-spew v1.1.1 ISC
-
-========================================================================
-MIT licenses
-========================================================================
-
-    github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
-    github.com/beorn7/perks v1.0.1 MIT
-    github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.2 MIT
-    github.com/dustin/go-humanize v1.0.0 MIT
-    github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
-    github.com/go-chi/chi/v5 v5.0.7 MIT
-    github.com/json-iterator/go v1.1.12 MIT
-    github.com/mitchellh/mapstructure v1.5.0 MIT
-    github.com/onsi/ginkgo/v2 v2.1.4 MIT
-    github.com/onsi/gomega v1.20.0 MIT
-    github.com/pelletier/go-toml/v2 v2.0.1 MIT
-    github.com/rs/zerolog v1.26.1 MIT
-    github.com/sirupsen/logrus v1.7.0 MIT
-    github.com/spf13/cast v1.5.0 MIT
-    github.com/spf13/jwalterweatherman v1.1.0 MIT
-    github.com/spf13/viper v1.12.0 MIT
-    github.com/stretchr/objx v0.1.1 MIT
-    github.com/stretchr/testify v1.7.1 MIT
-    github.com/subosito/gotenv v1.3.0 MIT
-    github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
-    github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    go.etcd.io/bbolt v1.3.6 MIT
-    go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/multierr v1.8.0 MIT
-    go.uber.org/zap v1.17.0 MIT
-    gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
-
-========================================================================
-MIT and Apache-2.0 licenses
-========================================================================
-
-    github.com/pelletier/go-toml v1.9.5 MIT and Apache-2.0
-    gopkg.in/yaml.v3 v3.0.1 MIT and Apache-2.0
-
-========================================================================
-MIT and BSD-3-Clause licenses
-========================================================================
-
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
-
-========================================================================
-MPL-2.0 licenses
-========================================================================
-
-    github.com/hashicorp/golang-lru v0.5.4 MPL-2.0
-    github.com/hashicorp/hcl v1.0.0 MPL-2.0
-
-========================================================================
-UI related licenses
-========================================================================
-
-The following components are used in UI.See project link for details.
-The text of each license is also included at licenses/ui-licenses/LICENSE-[project].txt.
- 
-
-========================================================================
-0BSD licenses
-========================================================================
-
-    tslib 2.3.0 0BSD
-
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    echarts 5.3.3 Apache-2.0
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    normalize-wheel 1.0.1 BSD-3-Clause
-    zrender 5.3.2 BSD-3-Clause
-
-========================================================================
-MIT licenses
-========================================================================
-
-    async-validator  MIT
-    babel-helper-vue-jsx-merge-props 2.0.3 MIT
-    babel-runtime 6.26.0 MIT
-    babel-runtime/node_modules/core-js 2.6.12 MIT
-    babel-runtime/node_modules/regenerator-runtime 0.11.1 MIT
-    core-js 3.22.8 MIT
-    deepmerge 1.5.2 MIT
-    element-ui 2.15.9 MIT
-    resize-observer-polyfill 1.5.1 MIT
-    throttle-debounce 1.1.0 MIT
-    vue 2.6.14 MIT
-    vue-router 3.5.4 MIT
-    vuex 3.6.2 MIT
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/dist/LICENSE b/dist/licenses/license-github.com-blugelabs-bluge-segment-api.txt
similarity index 53%
copy from dist/LICENSE
copy to dist/licenses/license-github.com-blugelabs-bluge-segment-api.txt
index 7848d86..7a4a3ea 100644
--- a/dist/LICENSE
+++ b/dist/licenses/license-github.com-blugelabs-bluge-segment-api.txt
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -173,204 +174,29 @@
       incurred by, or claims asserted against, such Contributor by reason
       of your accepting any such warranty or additional liability.
 
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
 
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
-    github.com/coreos/go-semver v0.3.0 Apache-2.0
-    github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
-    github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
-    github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/golang/glog v1.0.0 Apache-2.0
-    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.6.0 Apache-2.0
-    github.com/google/btree v1.0.1 Apache-2.0
-    github.com/google/flatbuffers v1.12.1 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
-    github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
-    github.com/jonboulle/clockwork v0.2.2 Apache-2.0
-    github.com/matttproud/golang_protobuf_extensions v1.0.1 Apache-2.0
-    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
-    github.com/mschoch/smat v0.2.0 Apache-2.0
-    github.com/oklog/run v1.1.0 Apache-2.0
-    github.com/prometheus/client_golang v1.12.2 Apache-2.0
-    github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.32.1 Apache-2.0
-    github.com/prometheus/procfs v0.7.3 Apache-2.0
-    github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.8.2 Apache-2.0
-    github.com/spf13/cobra v1.4.0 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/v2 v2.305.4 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/raft/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/server/v3 v3.5.4 Apache-2.0
-    go.opencensus.io v0.23.0 Apache-2.0
-    go.opentelemetry.io/contrib v0.20.0 Apache-2.0
-    go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/exporters/otlp v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/export/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/trace v0.20.0 Apache-2.0
-    go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
-    google.golang.org/genproto v0.0.0-20220615141314-f1464d18c36b Apache-2.0
-    google.golang.org/grpc v1.47.0 Apache-2.0
-    gopkg.in/ini.v1 v1.66.4 Apache-2.0
-    gopkg.in/yaml.v2 v2.4.0 Apache-2.0
-
-========================================================================
-Apache-2.0 and BSD-3-Clause licenses
-========================================================================
-
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
-
-========================================================================
-BSD-2-Clause licenses
-========================================================================
-
-    github.com/gorilla/websocket v1.4.2 BSD-2-Clause
-    github.com/magiconair/properties v1.8.6 BSD-2-Clause
-    github.com/pkg/errors v0.9.1 BSD-2-Clause
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
-    github.com/gogo/protobuf v1.3.2 BSD-3-Clause
-    github.com/golang/protobuf v1.5.2 BSD-3-Clause
-    github.com/golang/snappy v0.0.3 BSD-3-Clause
-    github.com/google/go-cmp v0.5.8 BSD-3-Clause
-    github.com/google/uuid v1.3.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.3 BSD-3-Clause
-    github.com/pmezard/go-difflib v1.0.0 BSD-3-Clause
-    github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 BSD-3-Clause
-    golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f BSD-3-Clause
-    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
-    golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 BSD-3-Clause
-    golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a BSD-3-Clause
-    golang.org/x/text v0.3.7 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba BSD-3-Clause
-    golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df BSD-3-Clause
-    google.golang.org/protobuf v1.28.0 BSD-3-Clause
-
-========================================================================
-BSD-3-Clause and Apache-2.0 and MIT licenses
-========================================================================
-
-    github.com/klauspost/compress v1.15.6 BSD-3-Clause and Apache-2.0 and MIT
-
-========================================================================
-ISC licenses
-========================================================================
-
-    github.com/davecgh/go-spew v1.1.1 ISC
-
-========================================================================
-MIT licenses
-========================================================================
-
-    github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
-    github.com/beorn7/perks v1.0.1 MIT
-    github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.2 MIT
-    github.com/dustin/go-humanize v1.0.0 MIT
-    github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
-    github.com/go-chi/chi/v5 v5.0.7 MIT
-    github.com/json-iterator/go v1.1.12 MIT
-    github.com/mitchellh/mapstructure v1.5.0 MIT
-    github.com/onsi/ginkgo/v2 v2.1.4 MIT
-    github.com/onsi/gomega v1.20.0 MIT
-    github.com/pelletier/go-toml/v2 v2.0.1 MIT
-    github.com/rs/zerolog v1.26.1 MIT
-    github.com/sirupsen/logrus v1.7.0 MIT
-    github.com/spf13/cast v1.5.0 MIT
-    github.com/spf13/jwalterweatherman v1.1.0 MIT
-    github.com/spf13/viper v1.12.0 MIT
-    github.com/stretchr/objx v0.1.1 MIT
-    github.com/stretchr/testify v1.7.1 MIT
-    github.com/subosito/gotenv v1.3.0 MIT
-    github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
-    github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    go.etcd.io/bbolt v1.3.6 MIT
-    go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/multierr v1.8.0 MIT
-    go.uber.org/zap v1.17.0 MIT
-    gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
-
-========================================================================
-MIT and Apache-2.0 licenses
-========================================================================
-
-    github.com/pelletier/go-toml v1.9.5 MIT and Apache-2.0
-    gopkg.in/yaml.v3 v3.0.1 MIT and Apache-2.0
-
-========================================================================
-MIT and BSD-3-Clause licenses
-========================================================================
-
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
-
-========================================================================
-MPL-2.0 licenses
-========================================================================
-
-    github.com/hashicorp/golang-lru v0.5.4 MPL-2.0
-    github.com/hashicorp/hcl v1.0.0 MPL-2.0
-
-========================================================================
-UI related licenses
-========================================================================
-
-The following components are used in UI.See project link for details.
-The text of each license is also included at licenses/ui-licenses/LICENSE-[project].txt.
- 
-
-========================================================================
-0BSD licenses
-========================================================================
-
-    tslib 2.3.0 0BSD
-
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    echarts 5.3.3 Apache-2.0
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    normalize-wheel 1.0.1 BSD-3-Clause
-    zrender 5.3.2 BSD-3-Clause
-
-========================================================================
-MIT licenses
-========================================================================
-
-    async-validator  MIT
-    babel-helper-vue-jsx-merge-props 2.0.3 MIT
-    babel-runtime 6.26.0 MIT
-    babel-runtime/node_modules/core-js 2.6.12 MIT
-    babel-runtime/node_modules/regenerator-runtime 0.11.1 MIT
-    core-js 3.22.8 MIT
-    deepmerge 1.5.2 MIT
-    element-ui 2.15.9 MIT
-    resize-observer-polyfill 1.5.1 MIT
-    throttle-debounce 1.1.0 MIT
-    vue 2.6.14 MIT
-    vue-router 3.5.4 MIT
-    vuex 3.6.2 MIT
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/dist/LICENSE b/dist/licenses/license-github.com-blugelabs-bluge.txt
similarity index 53%
copy from dist/LICENSE
copy to dist/licenses/license-github.com-blugelabs-bluge.txt
index 7848d86..7a4a3ea 100644
--- a/dist/LICENSE
+++ b/dist/licenses/license-github.com-blugelabs-bluge.txt
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -173,204 +174,29 @@
       incurred by, or claims asserted against, such Contributor by reason
       of your accepting any such warranty or additional liability.
 
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
 
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
-    github.com/coreos/go-semver v0.3.0 Apache-2.0
-    github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
-    github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
-    github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/golang/glog v1.0.0 Apache-2.0
-    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.6.0 Apache-2.0
-    github.com/google/btree v1.0.1 Apache-2.0
-    github.com/google/flatbuffers v1.12.1 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
-    github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
-    github.com/jonboulle/clockwork v0.2.2 Apache-2.0
-    github.com/matttproud/golang_protobuf_extensions v1.0.1 Apache-2.0
-    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
-    github.com/mschoch/smat v0.2.0 Apache-2.0
-    github.com/oklog/run v1.1.0 Apache-2.0
-    github.com/prometheus/client_golang v1.12.2 Apache-2.0
-    github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.32.1 Apache-2.0
-    github.com/prometheus/procfs v0.7.3 Apache-2.0
-    github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.8.2 Apache-2.0
-    github.com/spf13/cobra v1.4.0 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/v2 v2.305.4 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/raft/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/server/v3 v3.5.4 Apache-2.0
-    go.opencensus.io v0.23.0 Apache-2.0
-    go.opentelemetry.io/contrib v0.20.0 Apache-2.0
-    go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/exporters/otlp v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/export/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/trace v0.20.0 Apache-2.0
-    go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
-    google.golang.org/genproto v0.0.0-20220615141314-f1464d18c36b Apache-2.0
-    google.golang.org/grpc v1.47.0 Apache-2.0
-    gopkg.in/ini.v1 v1.66.4 Apache-2.0
-    gopkg.in/yaml.v2 v2.4.0 Apache-2.0
-
-========================================================================
-Apache-2.0 and BSD-3-Clause licenses
-========================================================================
-
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
-
-========================================================================
-BSD-2-Clause licenses
-========================================================================
-
-    github.com/gorilla/websocket v1.4.2 BSD-2-Clause
-    github.com/magiconair/properties v1.8.6 BSD-2-Clause
-    github.com/pkg/errors v0.9.1 BSD-2-Clause
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
-    github.com/gogo/protobuf v1.3.2 BSD-3-Clause
-    github.com/golang/protobuf v1.5.2 BSD-3-Clause
-    github.com/golang/snappy v0.0.3 BSD-3-Clause
-    github.com/google/go-cmp v0.5.8 BSD-3-Clause
-    github.com/google/uuid v1.3.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.3 BSD-3-Clause
-    github.com/pmezard/go-difflib v1.0.0 BSD-3-Clause
-    github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 BSD-3-Clause
-    golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f BSD-3-Clause
-    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
-    golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 BSD-3-Clause
-    golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a BSD-3-Clause
-    golang.org/x/text v0.3.7 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba BSD-3-Clause
-    golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df BSD-3-Clause
-    google.golang.org/protobuf v1.28.0 BSD-3-Clause
-
-========================================================================
-BSD-3-Clause and Apache-2.0 and MIT licenses
-========================================================================
-
-    github.com/klauspost/compress v1.15.6 BSD-3-Clause and Apache-2.0 and MIT
-
-========================================================================
-ISC licenses
-========================================================================
-
-    github.com/davecgh/go-spew v1.1.1 ISC
-
-========================================================================
-MIT licenses
-========================================================================
-
-    github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
-    github.com/beorn7/perks v1.0.1 MIT
-    github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.2 MIT
-    github.com/dustin/go-humanize v1.0.0 MIT
-    github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
-    github.com/go-chi/chi/v5 v5.0.7 MIT
-    github.com/json-iterator/go v1.1.12 MIT
-    github.com/mitchellh/mapstructure v1.5.0 MIT
-    github.com/onsi/ginkgo/v2 v2.1.4 MIT
-    github.com/onsi/gomega v1.20.0 MIT
-    github.com/pelletier/go-toml/v2 v2.0.1 MIT
-    github.com/rs/zerolog v1.26.1 MIT
-    github.com/sirupsen/logrus v1.7.0 MIT
-    github.com/spf13/cast v1.5.0 MIT
-    github.com/spf13/jwalterweatherman v1.1.0 MIT
-    github.com/spf13/viper v1.12.0 MIT
-    github.com/stretchr/objx v0.1.1 MIT
-    github.com/stretchr/testify v1.7.1 MIT
-    github.com/subosito/gotenv v1.3.0 MIT
-    github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
-    github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    go.etcd.io/bbolt v1.3.6 MIT
-    go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/multierr v1.8.0 MIT
-    go.uber.org/zap v1.17.0 MIT
-    gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
-
-========================================================================
-MIT and Apache-2.0 licenses
-========================================================================
-
-    github.com/pelletier/go-toml v1.9.5 MIT and Apache-2.0
-    gopkg.in/yaml.v3 v3.0.1 MIT and Apache-2.0
-
-========================================================================
-MIT and BSD-3-Clause licenses
-========================================================================
-
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
-
-========================================================================
-MPL-2.0 licenses
-========================================================================
-
-    github.com/hashicorp/golang-lru v0.5.4 MPL-2.0
-    github.com/hashicorp/hcl v1.0.0 MPL-2.0
-
-========================================================================
-UI related licenses
-========================================================================
-
-The following components are used in UI.See project link for details.
-The text of each license is also included at licenses/ui-licenses/LICENSE-[project].txt.
- 
-
-========================================================================
-0BSD licenses
-========================================================================
-
-    tslib 2.3.0 0BSD
-
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    echarts 5.3.3 Apache-2.0
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    normalize-wheel 1.0.1 BSD-3-Clause
-    zrender 5.3.2 BSD-3-Clause
-
-========================================================================
-MIT licenses
-========================================================================
-
-    async-validator  MIT
-    babel-helper-vue-jsx-merge-props 2.0.3 MIT
-    babel-runtime 6.26.0 MIT
-    babel-runtime/node_modules/core-js 2.6.12 MIT
-    babel-runtime/node_modules/regenerator-runtime 0.11.1 MIT
-    core-js 3.22.8 MIT
-    deepmerge 1.5.2 MIT
-    element-ui 2.15.9 MIT
-    resize-observer-polyfill 1.5.1 MIT
-    throttle-debounce 1.1.0 MIT
-    vue 2.6.14 MIT
-    vue-router 3.5.4 MIT
-    vuex 3.6.2 MIT
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/dist/LICENSE b/dist/licenses/license-github.com-blugelabs-ice-v2.txt
similarity index 53%
copy from dist/LICENSE
copy to dist/licenses/license-github.com-blugelabs-ice-v2.txt
index 7848d86..7a4a3ea 100644
--- a/dist/LICENSE
+++ b/dist/licenses/license-github.com-blugelabs-ice-v2.txt
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -173,204 +174,29 @@
       incurred by, or claims asserted against, such Contributor by reason
       of your accepting any such warranty or additional liability.
 
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
 
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
-    github.com/coreos/go-semver v0.3.0 Apache-2.0
-    github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
-    github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
-    github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/golang/glog v1.0.0 Apache-2.0
-    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.6.0 Apache-2.0
-    github.com/google/btree v1.0.1 Apache-2.0
-    github.com/google/flatbuffers v1.12.1 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
-    github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
-    github.com/jonboulle/clockwork v0.2.2 Apache-2.0
-    github.com/matttproud/golang_protobuf_extensions v1.0.1 Apache-2.0
-    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
-    github.com/mschoch/smat v0.2.0 Apache-2.0
-    github.com/oklog/run v1.1.0 Apache-2.0
-    github.com/prometheus/client_golang v1.12.2 Apache-2.0
-    github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.32.1 Apache-2.0
-    github.com/prometheus/procfs v0.7.3 Apache-2.0
-    github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.8.2 Apache-2.0
-    github.com/spf13/cobra v1.4.0 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/v2 v2.305.4 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/raft/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/server/v3 v3.5.4 Apache-2.0
-    go.opencensus.io v0.23.0 Apache-2.0
-    go.opentelemetry.io/contrib v0.20.0 Apache-2.0
-    go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/exporters/otlp v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/export/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/trace v0.20.0 Apache-2.0
-    go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
-    google.golang.org/genproto v0.0.0-20220615141314-f1464d18c36b Apache-2.0
-    google.golang.org/grpc v1.47.0 Apache-2.0
-    gopkg.in/ini.v1 v1.66.4 Apache-2.0
-    gopkg.in/yaml.v2 v2.4.0 Apache-2.0
-
-========================================================================
-Apache-2.0 and BSD-3-Clause licenses
-========================================================================
-
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
-
-========================================================================
-BSD-2-Clause licenses
-========================================================================
-
-    github.com/gorilla/websocket v1.4.2 BSD-2-Clause
-    github.com/magiconair/properties v1.8.6 BSD-2-Clause
-    github.com/pkg/errors v0.9.1 BSD-2-Clause
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
-    github.com/gogo/protobuf v1.3.2 BSD-3-Clause
-    github.com/golang/protobuf v1.5.2 BSD-3-Clause
-    github.com/golang/snappy v0.0.3 BSD-3-Clause
-    github.com/google/go-cmp v0.5.8 BSD-3-Clause
-    github.com/google/uuid v1.3.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.3 BSD-3-Clause
-    github.com/pmezard/go-difflib v1.0.0 BSD-3-Clause
-    github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 BSD-3-Clause
-    golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f BSD-3-Clause
-    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
-    golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 BSD-3-Clause
-    golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a BSD-3-Clause
-    golang.org/x/text v0.3.7 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba BSD-3-Clause
-    golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df BSD-3-Clause
-    google.golang.org/protobuf v1.28.0 BSD-3-Clause
-
-========================================================================
-BSD-3-Clause and Apache-2.0 and MIT licenses
-========================================================================
-
-    github.com/klauspost/compress v1.15.6 BSD-3-Clause and Apache-2.0 and MIT
-
-========================================================================
-ISC licenses
-========================================================================
-
-    github.com/davecgh/go-spew v1.1.1 ISC
-
-========================================================================
-MIT licenses
-========================================================================
-
-    github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
-    github.com/beorn7/perks v1.0.1 MIT
-    github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.2 MIT
-    github.com/dustin/go-humanize v1.0.0 MIT
-    github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
-    github.com/go-chi/chi/v5 v5.0.7 MIT
-    github.com/json-iterator/go v1.1.12 MIT
-    github.com/mitchellh/mapstructure v1.5.0 MIT
-    github.com/onsi/ginkgo/v2 v2.1.4 MIT
-    github.com/onsi/gomega v1.20.0 MIT
-    github.com/pelletier/go-toml/v2 v2.0.1 MIT
-    github.com/rs/zerolog v1.26.1 MIT
-    github.com/sirupsen/logrus v1.7.0 MIT
-    github.com/spf13/cast v1.5.0 MIT
-    github.com/spf13/jwalterweatherman v1.1.0 MIT
-    github.com/spf13/viper v1.12.0 MIT
-    github.com/stretchr/objx v0.1.1 MIT
-    github.com/stretchr/testify v1.7.1 MIT
-    github.com/subosito/gotenv v1.3.0 MIT
-    github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
-    github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    go.etcd.io/bbolt v1.3.6 MIT
-    go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/multierr v1.8.0 MIT
-    go.uber.org/zap v1.17.0 MIT
-    gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
-
-========================================================================
-MIT and Apache-2.0 licenses
-========================================================================
-
-    github.com/pelletier/go-toml v1.9.5 MIT and Apache-2.0
-    gopkg.in/yaml.v3 v3.0.1 MIT and Apache-2.0
-
-========================================================================
-MIT and BSD-3-Clause licenses
-========================================================================
-
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
-
-========================================================================
-MPL-2.0 licenses
-========================================================================
-
-    github.com/hashicorp/golang-lru v0.5.4 MPL-2.0
-    github.com/hashicorp/hcl v1.0.0 MPL-2.0
-
-========================================================================
-UI related licenses
-========================================================================
-
-The following components are used in UI.See project link for details.
-The text of each license is also included at licenses/ui-licenses/LICENSE-[project].txt.
- 
-
-========================================================================
-0BSD licenses
-========================================================================
-
-    tslib 2.3.0 0BSD
-
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    echarts 5.3.3 Apache-2.0
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    normalize-wheel 1.0.1 BSD-3-Clause
-    zrender 5.3.2 BSD-3-Clause
-
-========================================================================
-MIT licenses
-========================================================================
-
-    async-validator  MIT
-    babel-helper-vue-jsx-merge-props 2.0.3 MIT
-    babel-runtime 6.26.0 MIT
-    babel-runtime/node_modules/core-js 2.6.12 MIT
-    babel-runtime/node_modules/regenerator-runtime 0.11.1 MIT
-    core-js 3.22.8 MIT
-    deepmerge 1.5.2 MIT
-    element-ui 2.15.9 MIT
-    resize-observer-polyfill 1.5.1 MIT
-    throttle-debounce 1.1.0 MIT
-    vue 2.6.14 MIT
-    vue-router 3.5.4 MIT
-    vuex 3.6.2 MIT
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/dist/LICENSE b/dist/licenses/license-github.com-blugelabs-ice.txt
similarity index 53%
copy from dist/LICENSE
copy to dist/licenses/license-github.com-blugelabs-ice.txt
index 7848d86..7a4a3ea 100644
--- a/dist/LICENSE
+++ b/dist/licenses/license-github.com-blugelabs-ice.txt
@@ -1,3 +1,4 @@
+
                                  Apache License
                            Version 2.0, January 2004
                         http://www.apache.org/licenses/
@@ -173,204 +174,29 @@
       incurred by, or claims asserted against, such Contributor by reason
       of your accepting any such warranty or additional liability.
 
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
 
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 Apache-2.0
-    github.com/coreos/go-semver v0.3.0 Apache-2.0
-    github.com/coreos/go-systemd/v22 v22.3.2 Apache-2.0
-    github.com/dgraph-io/ristretto v0.1.0 Apache-2.0
-    github.com/envoyproxy/protoc-gen-validate v0.1.0 Apache-2.0
-    github.com/golang/glog v1.0.0 Apache-2.0
-    github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da Apache-2.0
-    github.com/golang/mock v1.6.0 Apache-2.0
-    github.com/google/btree v1.0.1 Apache-2.0
-    github.com/google/flatbuffers v1.12.1 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 Apache-2.0
-    github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 Apache-2.0
-    github.com/inconshreveable/mousetrap v1.0.0 Apache-2.0
-    github.com/jonboulle/clockwork v0.2.2 Apache-2.0
-    github.com/matttproud/golang_protobuf_extensions v1.0.1 Apache-2.0
-    github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd Apache-2.0
-    github.com/modern-go/reflect2 v1.0.2 Apache-2.0
-    github.com/mschoch/smat v0.2.0 Apache-2.0
-    github.com/oklog/run v1.1.0 Apache-2.0
-    github.com/prometheus/client_golang v1.12.2 Apache-2.0
-    github.com/prometheus/client_model v0.2.0 Apache-2.0
-    github.com/prometheus/common v0.32.1 Apache-2.0
-    github.com/prometheus/procfs v0.7.3 Apache-2.0
-    github.com/soheilhy/cmux v0.1.5 Apache-2.0
-    github.com/spf13/afero v1.8.2 Apache-2.0
-    github.com/spf13/cobra v1.4.0 Apache-2.0
-    go.etcd.io/etcd/api/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/client/v2 v2.305.4 Apache-2.0
-    go.etcd.io/etcd/client/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/pkg/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/raft/v3 v3.5.4 Apache-2.0
-    go.etcd.io/etcd/server/v3 v3.5.4 Apache-2.0
-    go.opencensus.io v0.23.0 Apache-2.0
-    go.opentelemetry.io/contrib v0.20.0 Apache-2.0
-    go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/exporters/otlp v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/export/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/sdk/metric v0.20.0 Apache-2.0
-    go.opentelemetry.io/otel/trace v0.20.0 Apache-2.0
-    go.opentelemetry.io/proto/otlp v0.7.0 Apache-2.0
-    google.golang.org/genproto v0.0.0-20220615141314-f1464d18c36b Apache-2.0
-    google.golang.org/grpc v1.47.0 Apache-2.0
-    gopkg.in/ini.v1 v1.66.4 Apache-2.0
-    gopkg.in/yaml.v2 v2.4.0 Apache-2.0
-
-========================================================================
-Apache-2.0 and BSD-3-Clause licenses
-========================================================================
-
-    github.com/RoaringBitmap/roaring v0.9.1 Apache-2.0 and BSD-3-Clause
-
-========================================================================
-BSD-2-Clause licenses
-========================================================================
-
-    github.com/gorilla/websocket v1.4.2 BSD-2-Clause
-    github.com/magiconair/properties v1.8.6 BSD-2-Clause
-    github.com/pkg/errors v0.9.1 BSD-2-Clause
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    github.com/bits-and-blooms/bitset v1.2.0 BSD-3-Clause
-    github.com/fsnotify/fsnotify v1.5.4 BSD-3-Clause
-    github.com/gogo/protobuf v1.3.2 BSD-3-Clause
-    github.com/golang/protobuf v1.5.2 BSD-3-Clause
-    github.com/golang/snappy v0.0.3 BSD-3-Clause
-    github.com/google/go-cmp v0.5.8 BSD-3-Clause
-    github.com/google/uuid v1.3.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway v1.16.0 BSD-3-Clause
-    github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.3 BSD-3-Clause
-    github.com/pmezard/go-difflib v1.0.0 BSD-3-Clause
-    github.com/spf13/pflag v1.0.5 BSD-3-Clause
-    golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 BSD-3-Clause
-    golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f BSD-3-Clause
-    golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 BSD-3-Clause
-    golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 BSD-3-Clause
-    golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a BSD-3-Clause
-    golang.org/x/text v0.3.7 BSD-3-Clause
-    golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba BSD-3-Clause
-    golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df BSD-3-Clause
-    google.golang.org/protobuf v1.28.0 BSD-3-Clause
-
-========================================================================
-BSD-3-Clause and Apache-2.0 and MIT licenses
-========================================================================
-
-    github.com/klauspost/compress v1.15.6 BSD-3-Clause and Apache-2.0 and MIT
-
-========================================================================
-ISC licenses
-========================================================================
-
-    github.com/davecgh/go-spew v1.1.1 ISC
-
-========================================================================
-MIT licenses
-========================================================================
-
-    github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 MIT
-    github.com/beorn7/perks v1.0.1 MIT
-    github.com/cespare/xxhash v1.1.0 MIT
-    github.com/cespare/xxhash/v2 v2.1.2 MIT
-    github.com/dustin/go-humanize v1.0.0 MIT
-    github.com/form3tech-oss/jwt-go v3.2.3+incompatible MIT
-    github.com/go-chi/chi/v5 v5.0.7 MIT
-    github.com/json-iterator/go v1.1.12 MIT
-    github.com/mitchellh/mapstructure v1.5.0 MIT
-    github.com/onsi/ginkgo/v2 v2.1.4 MIT
-    github.com/onsi/gomega v1.20.0 MIT
-    github.com/pelletier/go-toml/v2 v2.0.1 MIT
-    github.com/rs/zerolog v1.26.1 MIT
-    github.com/sirupsen/logrus v1.7.0 MIT
-    github.com/spf13/cast v1.5.0 MIT
-    github.com/spf13/jwalterweatherman v1.1.0 MIT
-    github.com/spf13/viper v1.12.0 MIT
-    github.com/stretchr/objx v0.1.1 MIT
-    github.com/stretchr/testify v1.7.1 MIT
-    github.com/subosito/gotenv v1.3.0 MIT
-    github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802 MIT
-    github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 MIT
-    go.etcd.io/bbolt v1.3.6 MIT
-    go.uber.org/atomic v1.7.0 MIT
-    go.uber.org/multierr v1.8.0 MIT
-    go.uber.org/zap v1.17.0 MIT
-    gopkg.in/natefinch/lumberjack.v2 v2.0.0 MIT
-
-========================================================================
-MIT and Apache-2.0 licenses
-========================================================================
-
-    github.com/pelletier/go-toml v1.9.5 MIT and Apache-2.0
-    gopkg.in/yaml.v3 v3.0.1 MIT and Apache-2.0
-
-========================================================================
-MIT and BSD-3-Clause licenses
-========================================================================
-
-    sigs.k8s.io/yaml v1.2.0 MIT and BSD-3-Clause
-
-========================================================================
-MPL-2.0 licenses
-========================================================================
-
-    github.com/hashicorp/golang-lru v0.5.4 MPL-2.0
-    github.com/hashicorp/hcl v1.0.0 MPL-2.0
-
-========================================================================
-UI related licenses
-========================================================================
-
-The following components are used in UI.See project link for details.
-The text of each license is also included at licenses/ui-licenses/LICENSE-[project].txt.
- 
-
-========================================================================
-0BSD licenses
-========================================================================
-
-    tslib 2.3.0 0BSD
-
-========================================================================
-Apache-2.0 licenses
-========================================================================
-
-    echarts 5.3.3 Apache-2.0
-
-========================================================================
-BSD-3-Clause licenses
-========================================================================
-
-    normalize-wheel 1.0.1 BSD-3-Clause
-    zrender 5.3.2 BSD-3-Clause
-
-========================================================================
-MIT licenses
-========================================================================
-
-    async-validator  MIT
-    babel-helper-vue-jsx-merge-props 2.0.3 MIT
-    babel-runtime 6.26.0 MIT
-    babel-runtime/node_modules/core-js 2.6.12 MIT
-    babel-runtime/node_modules/regenerator-runtime 0.11.1 MIT
-    core-js 3.22.8 MIT
-    deepmerge 1.5.2 MIT
-    element-ui 2.15.9 MIT
-    resize-observer-polyfill 1.5.1 MIT
-    throttle-debounce 1.1.0 MIT
-    vue 2.6.14 MIT
-    vue-router 3.5.4 MIT
-    vuex 3.6.2 MIT
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
\ No newline at end of file
diff --git a/dist/licenses/license-github.com-caio-go-tdigest.txt b/dist/licenses/license-github.com-caio-go-tdigest.txt
new file mode 100644
index 0000000..f5f0744
--- /dev/null
+++ b/dist/licenses/license-github.com-caio-go-tdigest.txt
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Caio Romão Costa Nascimento
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/dist/licenses/license-github.com-dgryski-go-metro.txt b/dist/licenses/license-github.com-dgryski-go-metro.txt
new file mode 100644
index 0000000..6243b61
--- /dev/null
+++ b/dist/licenses/license-github.com-dgryski-go-metro.txt
@@ -0,0 +1,24 @@
+This package is a mechanical translation of the reference C++ code for
+MetroHash, available at https://github.com/jandrewrogers/MetroHash 
+
+The MIT License (MIT)
+
+Copyright (c) 2016 Damian Gryski
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/go.mod b/go.mod
index 9ea4d80..116eb9b 100644
--- a/go.mod
+++ b/go.mod
@@ -3,8 +3,9 @@ module github.com/apache/skywalking-banyandb
 go 1.19
 
 require (
-	github.com/RoaringBitmap/roaring v0.9.1
+	github.com/RoaringBitmap/roaring v0.9.4
 	github.com/benbjohnson/clock v1.3.0
+	github.com/blugelabs/bluge v0.2.2
 	github.com/cespare/xxhash v1.1.0
 	github.com/dgraph-io/badger/v3 v3.2011.1
 	github.com/dgraph-io/ristretto v0.1.0
@@ -38,12 +39,23 @@ require (
 )
 
 require (
+	github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f // indirect
 	github.com/beorn7/perks v1.0.1 // indirect
 	github.com/bits-and-blooms/bitset v1.2.0 // indirect
+	github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
+	github.com/blevesearch/mmap-go v1.0.4 // indirect
+	github.com/blevesearch/segment v0.9.0 // indirect
+	github.com/blevesearch/snowballstem v0.9.0 // indirect
+	github.com/blevesearch/vellum v1.0.7 // indirect
+	github.com/blugelabs/bluge_segment_api v0.2.0 // indirect
+	github.com/blugelabs/ice v1.0.0 // indirect
+	github.com/blugelabs/ice/v2 v2.0.1 // indirect
+	github.com/caio/go-tdigest v3.1.0+incompatible // indirect
 	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 	github.com/coreos/go-semver v0.3.0 // indirect
 	github.com/coreos/go-systemd/v22 v22.3.2 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc // indirect
 	github.com/dustin/go-humanize v1.0.0 // indirect
 	github.com/form3tech-oss/jwt-go v3.2.3+incompatible // indirect
 	github.com/fsnotify/fsnotify v1.5.4 // indirect
diff --git a/go.sum b/go.sum
index 7431b3a..b62e59b 100644
--- a/go.sum
+++ b/go.sum
@@ -46,12 +46,14 @@ github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE
 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/RoaringBitmap/gocroaring v0.4.0/go.mod h1:NieMwz7ZqwU2DD73/vvYwv7r4eWBKuPVSXZIpsaMwCI=
 github.com/RoaringBitmap/real-roaring-datasets v0.0.0-20190726190000-eb7c87156f76/go.mod h1:oM0MHmQ3nDsq609SS36p+oYbRi16+oVvU2Bw4Ipv0SE=
-github.com/RoaringBitmap/roaring v0.9.1 h1:5PRizBmoN/PfV17nPNQou4dHQ7NcJi8FO/bihdYyCEM=
 github.com/RoaringBitmap/roaring v0.9.1/go.mod h1:h1B7iIUOmnAeb5ytYMvnHJwxMc6LUrwBnzXWRuqTQUc=
+github.com/RoaringBitmap/roaring v0.9.4 h1:ckvZSX5gwCRaJYBNe7syNawCU5oruY9gQmjXlp4riwo=
+github.com/RoaringBitmap/roaring v0.9.4/go.mod h1:icnadbWcNyfEHlYdr+tDlOTih1Bf/h+rzPpv4sbomAA=
 github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876 h1:zH//2cmDpBla7rL9NzWr+vZ2UskMrvdnUvslz3KYTN0=
 github.com/SkyAPM/badger/v3 v3.0.0-20220817114744-b3711444d876/go.mod h1:TQb+QXS839JUIX5jEySXoAvAIDROfU22HqVHcBr9bRA=
 github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97 h1:FKuhJ+6n/DHspGeLleeNbziWnKr9gHKYN4q7NcoCp4s=
 github.com/SkyAPM/clock v1.3.1-0.20220809233656-dc7607c94a97/go.mod h1:2xGRl9H1pllhxTbEGO1W3gDkip8P9GQaHPni/wpdR44=
+github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
@@ -62,6 +64,8 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
 github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f h1:y06x6vGnFYfXUoVMbrcP1Uzpj4JG01eB5vRps9G8agM=
+github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f/go.mod h1:2stgcRjl6QmW+gU2h5E7BQXg4HU0gzxKWDuT5HviN9s=
 github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
@@ -71,6 +75,29 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB
 github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA=
 github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
+github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo=
+github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
+github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA=
+github.com/blevesearch/mmap-go v1.0.3/go.mod h1:pYvKl/grLQrBxuaRYgoTssa4rVujYYeenDp++2E+yvs=
+github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc=
+github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs=
+github.com/blevesearch/segment v0.9.0 h1:5lG7yBCx98or7gK2cHMKPukPZ/31Kag7nONpoBt22Ac=
+github.com/blevesearch/segment v0.9.0/go.mod h1:9PfHYUdQCgHktBgvtUOF4x+pc4/l8rdH0u5spnW85UQ=
+github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s=
+github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs=
+github.com/blevesearch/vellum v1.0.5/go.mod h1:atE0EH3fvk43zzS7t1YNdNC7DbmcC3uz+eMD5xZ2OyQ=
+github.com/blevesearch/vellum v1.0.7 h1:+vn8rfyCRHxKVRgDLeR0FAXej2+6mEb5Q15aQE/XESQ=
+github.com/blevesearch/vellum v1.0.7/go.mod h1:doBZpmRhwTsASB4QdUZANlJvqVAUdUyX0ZK7QJCTeBE=
+github.com/blugelabs/bluge v0.2.2 h1:gat8CqE6P6tOgeX30XGLOVNTC26cpM2RWVcreXWtYcM=
+github.com/blugelabs/bluge v0.2.2/go.mod h1:am1LU9jS8dZgWkRzkGLQN3757EgMs3upWrU2fdN9foE=
+github.com/blugelabs/bluge_segment_api v0.2.0 h1:cCX1Y2y8v0LZ7+EEJ6gH7dW6TtVTW4RhG0vp3R+N2Lo=
+github.com/blugelabs/bluge_segment_api v0.2.0/go.mod h1:95XA+ZXfRj/IXADm7gZ+iTcWOJPg5jQTY1EReIzl3LA=
+github.com/blugelabs/ice v1.0.0 h1:um7wf9e6jbkTVCrOyQq3tKK43fBMOvLUYxbj3Qtc4eo=
+github.com/blugelabs/ice v1.0.0/go.mod h1:gNfFPk5zM+yxJROhthxhVQYjpBO9amuxWXJQ2Lo+IbQ=
+github.com/blugelabs/ice/v2 v2.0.1 h1:mzHbntLjk2v7eDRgoXCgzOsPKN1Tenu9Svo6l9cTLS4=
+github.com/blugelabs/ice/v2 v2.0.1/go.mod h1:QxAWSPNwZwsIqS25c3lbIPFQrVvT1sphf5x5DfMLH5M=
+github.com/caio/go-tdigest v3.1.0+incompatible h1:uoVMJ3Q5lXmVLCCqaMGHLBWnbGoN6Lpu7OAUPR60cds=
+github.com/caio/go-tdigest v3.1.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI=
@@ -121,6 +148,8 @@ github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
+github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8=
+github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/go.mod h1:c9O8+fpSOX1DM8cPNSkX/qsBWdkD4yd2dpciOWQjpBw=
 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
 github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
@@ -134,6 +163,7 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.
 github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNyAWIKUMIwqxEtgHOs5c=
 github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
 github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
@@ -161,6 +191,7 @@ github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zV
 github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
 github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
 github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
 github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
@@ -197,6 +228,7 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
 github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
 github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
 github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA=
 github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
@@ -280,6 +312,7 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/influxdata/influxdb v1.7.6/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
 github.com/jonboulle/clockwork v0.2.2 h1:UOGuzwb1PwsrDAObMuhUnj0p5ULPj8V/xJ7Kx9qUBdQ=
 github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
@@ -294,11 +327,13 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X
 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes=
 github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg=
+github.com/klauspost/compress v1.15.2/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
 github.com/klauspost/compress v1.15.6 h1:6D9PcO8QWu0JyaQ2zUMmu16T1T+zjjEpP91guRsvDfY=
 github.com/klauspost/compress v1.15.6/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
@@ -311,6 +346,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353 h1:X/79QL0b4YJVO5+OsPH9rF2u428CIrGL/jLmPsoOQQ4=
+github.com/leesper/go_rng v0.0.0-20190531154944-a612b043e353/go.mod h1:N0SVk0uhy+E1PZ3C9ctsPRlvOPAFPkCNlcPBDkt0N3U=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
@@ -536,7 +573,10 @@ golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5
 golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4 h1:kUhD7nTDoI3fVd9G4ORWrbV5NY0liEs/Jg2pv5f+bBA=
 golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
 golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
@@ -548,6 +588,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f h1:KK6mxegmt5hGJRcAnEDjSNLxIRhZxDcgwMbcO/lMCRM=
 golang.org/x/exp v0.0.0-20220602145555-4a0574d9293f/go.mod h1:yh0Ynu2b5ZUe3MQfp2nM0ecK7wsgouWTDN0FNeJuIys=
+golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -649,6 +690,7 @@ golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181221143128-b4a75ba826a6/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -658,6 +700,7 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -716,9 +759,11 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxb
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE=
 golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
@@ -779,6 +824,11 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618=
 golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
+gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo=
+gonum.org/v1/gonum v0.7.0 h1:Hdks0L0hgznZLG9nzXb8vZ0rRvqNvAcgAp84y7Mwkgw=
+gonum.org/v1/gonum v0.7.0/go.mod h1:L02bwd0sqlsvRv41G7wGWFCsVNZFv/k1xzGIxeANHGM=
+gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
+gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
 google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
 google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
 google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
@@ -918,6 +968,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
 honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
 rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
 rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
 sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
diff --git a/pkg/index/index.go b/pkg/index/index.go
index b3eb099..b9b332d 100644
--- a/pkg/index/index.go
+++ b/pkg/index/index.go
@@ -45,6 +45,10 @@ func (f FieldKey) Marshal() []byte {
 	}, nil)
 }
 
+func (f FieldKey) MarshalToStr() string {
+	return string(f.Marshal())
+}
+
 func (f *FieldKey) Unmarshal(raw []byte) error {
 	f.SeriesID = common.SeriesID(convert.BytesToUint64(raw[0:8]))
 	f.IndexRuleID = convert.BytesToUint32(raw[8:])
@@ -118,13 +122,29 @@ type FieldIterator interface {
 	Close() error
 }
 
+var EmptyFieldIterator = &emptyIterator{}
+
+type emptyIterator struct{}
+
+func (i *emptyIterator) Next() bool {
+	return false
+}
+
+func (i *emptyIterator) Val() *PostingValue {
+	return nil
+}
+
+func (i *emptyIterator) Close() error {
+	return nil
+}
+
 type PostingValue struct {
 	Term  []byte
 	Value posting.List
 }
 
 type Writer interface {
-	Write(field Field, itemID common.ItemID) error
+	Write(fields []Field, itemID common.ItemID) error
 }
 
 type FieldIterable interface {
diff --git a/pkg/index/inverted/field_map.go b/pkg/index/inverted/field_map.go
deleted file mode 100644
index 0f354e7..0000000
--- a/pkg/index/inverted/field_map.go
+++ /dev/null
@@ -1,90 +0,0 @@
-// Licensed to Apache Software Foundation (ASF) under one or more contributor
-// license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright
-// ownership. Apache Software Foundation (ASF) licenses this file to you under
-// the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package inverted
-
-import (
-	"sync"
-
-	"github.com/apache/skywalking-banyandb/api/common"
-	"github.com/apache/skywalking-banyandb/banyand/observability"
-	"github.com/apache/skywalking-banyandb/pkg/convert"
-	"github.com/apache/skywalking-banyandb/pkg/index"
-)
-
-type fieldHashID uint64
-
-type fieldMap struct {
-	repo  map[fieldHashID]*termContainer
-	lst   []fieldHashID
-	mutex sync.RWMutex
-}
-
-func newFieldMap(initialSize int) *fieldMap {
-	return &fieldMap{
-		repo: make(map[fieldHashID]*termContainer, initialSize),
-		lst:  make([]fieldHashID, 0),
-	}
-}
-
-func (fm *fieldMap) createKey(field index.Field) *termContainer {
-	result := &termContainer{
-		key:   field.Key,
-		value: newPostingMap(),
-	}
-	k := fieldHashID(convert.Hash(field.Key.Marshal()))
-	fm.repo[k] = result
-	fm.lst = append(fm.lst, k)
-	return result
-}
-
-func (fm *fieldMap) get(key index.FieldKey) (*termContainer, bool) {
-	fm.mutex.RLock()
-	defer fm.mutex.RUnlock()
-	return fm.getWithoutLock(key)
-}
-
-func (fm *fieldMap) getWithoutLock(key index.FieldKey) (*termContainer, bool) {
-	v, ok := fm.repo[fieldHashID(convert.Hash(key.Marshal()))]
-	return v, ok
-}
-
-func (fm *fieldMap) put(fv index.Field, id common.ItemID) error {
-	fm.mutex.Lock()
-	defer fm.mutex.Unlock()
-	pm, ok := fm.getWithoutLock(fv.Key)
-	if !ok {
-		pm = fm.createKey(fv)
-	}
-	return pm.value.put(fv.Term, id)
-}
-
-func (fm *fieldMap) Stats() (s observability.Statistics) {
-	fm.mutex.RLock()
-	defer fm.mutex.RUnlock()
-	for _, pv := range fm.repo {
-		// 8 is the size of key
-		s.MemBytes += 8
-		s.MemBytes += pv.value.Stats().MemBytes
-	}
-	return s
-}
-
-type termContainer struct {
-	key   index.FieldKey
-	value *termMap
-}
diff --git a/pkg/index/inverted/inverted.go b/pkg/index/inverted/inverted.go
index a9e6b40..d3c7e75 100644
--- a/pkg/index/inverted/inverted.go
+++ b/pkg/index/inverted/inverted.go
@@ -19,146 +19,124 @@ package inverted
 
 import (
 	"bytes"
-	"sync"
-
-	"github.com/pkg/errors"
+	"context"
+	"errors"
+	"log"
+	"math"
+
+	"github.com/blugelabs/bluge"
+	"github.com/blugelabs/bluge/analysis/analyzer"
+	"github.com/blugelabs/bluge/search"
+	"github.com/dgraph-io/badger/v3/y"
 	"go.uber.org/multierr"
 
 	"github.com/apache/skywalking-banyandb/api/common"
 	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
-	"github.com/apache/skywalking-banyandb/banyand/kv"
 	"github.com/apache/skywalking-banyandb/banyand/observability"
+	"github.com/apache/skywalking-banyandb/pkg/convert"
 	"github.com/apache/skywalking-banyandb/pkg/index"
 	"github.com/apache/skywalking-banyandb/pkg/index/posting"
 	"github.com/apache/skywalking-banyandb/pkg/index/posting/roaring"
 	"github.com/apache/skywalking-banyandb/pkg/logger"
 )
 
-var _ index.Store = (*store)(nil)
+const docID = "_id"
 
-type store struct {
-	diskTable         kv.IndexStore
-	memTable          *memTable
-	immutableMemTable *memTable
-	rwMutex           sync.RWMutex
-	closed            bool
+var defaultAnalyzer = analyzer.NewKeywordAnalyzer()
 
-	l *logger.Logger
-}
+var _ index.Store = (*store)(nil)
 
 type StoreOpts struct {
 	Path   string
 	Logger *logger.Logger
 }
 
+type store struct {
+	writer *bluge.Writer
+}
+
 func NewStore(opts StoreOpts) (index.Store, error) {
-	diskTable, err := kv.OpenIndexStore(0, opts.Path+"/table", kv.IndexWithLogger(opts.Logger))
+	config := bluge.DefaultConfig(opts.Path)
+	config.DefaultSearchAnalyzer = defaultAnalyzer
+	config.Logger = log.New(opts.Logger, opts.Logger.Module(), 0)
+	w, err := bluge.OpenWriter(config)
 	if err != nil {
 		return nil, err
 	}
 	return &store{
-		memTable:  newMemTable(),
-		diskTable: diskTable,
-		l:         opts.Logger,
+		writer: w,
 	}, nil
 }
 
-func (s *store) Close() error {
-	return s.flush(true)
+func (s *store) Stats() observability.Statistics {
+	return observability.Statistics{}
 }
 
-func (s *store) Write(field index.Field, chunkID common.ItemID) error {
-	s.rwMutex.Lock()
-	defer s.rwMutex.Unlock()
-	return s.memTable.Write(field, chunkID)
+func (s *store) Close() error {
+	return s.writer.Close()
 }
 
-func (s *store) Flush() error {
-	return s.flush(false)
+func (s *store) Write(fields []index.Field, itemID common.ItemID) error {
+	doc := bluge.NewDocument(string(convert.Uint64ToBytes(uint64(itemID))))
+	for _, f := range fields {
+		doc.AddField(bluge.NewKeywordFieldBytes(f.Key.MarshalToStr(), f.Term).StoreValue().Sortable())
+	}
+	return s.writer.Insert(doc)
 }
 
-func (s *store) flush(toClose bool) error {
-	s.rwMutex.Lock()
-	defer func() {
-		if toClose && !s.closed {
-			_ = s.diskTable.Close()
-			s.closed = true
-		}
-		s.rwMutex.Unlock()
-	}()
-	state := s.memTable.Stats()
-	if state.MemBytes <= 0 {
-		return nil
-	}
-	if s.immutableMemTable == nil {
-		s.immutableMemTable = s.memTable
-		s.memTable = newMemTable()
+func (s *store) Iterator(fieldKey index.FieldKey, termRange index.RangeOpts, order modelv1.Sort) (iter index.FieldIterator, err error) {
+	if termRange.Lower != nil &&
+		termRange.Upper != nil &&
+		bytes.Compare(termRange.Lower, termRange.Upper) > 0 {
+		return index.EmptyFieldIterator, nil
 	}
-	err := s.diskTable.
-		Handover(s.immutableMemTable.Iter())
+	reader, err := s.writer.Reader()
 	if err != nil {
-		return err
+		return nil, err
 	}
-	s.immutableMemTable = nil
-	return nil
-}
-
-func (s *store) Stats() observability.Statistics {
-	stat := s.mainStats()
-	disk := s.diskTable.Stats()
-	stat.MaxMemBytes = disk.MaxMemBytes
-	return stat
-}
-
-func (s *store) mainStats() (stat observability.Statistics) {
-	s.rwMutex.RLock()
-	defer s.rwMutex.RUnlock()
-	main := s.memTable.Stats()
-	stat.MemBytes += main.MemBytes
-	if s.immutableMemTable != nil {
-		sub := s.immutableMemTable.Stats()
-		stat.MemBytes += sub.MemBytes
+	fk := fieldKey.MarshalToStr()
+	query := bluge.NewTermRangeInclusiveQuery(
+		string(termRange.Lower),
+		string(termRange.Upper),
+		termRange.IncludesLower,
+		termRange.IncludesUpper,
+	).
+		SetField(fk)
+	sortedKey := fk
+	if order == modelv1.Sort_SORT_DESC {
+		sortedKey = "-" + sortedKey
+	}
+	documentMatchIterator, err := reader.Search(context.Background(), bluge.NewTopNSearch(math.MaxInt64, query).SortBy([]string{sortedKey}))
+	if err != nil {
+		return nil, err
 	}
-	return stat
+	result := newBlugeMatchIterator(documentMatchIterator, fk)
+	return &result, nil
 }
 
-func (s *store) MatchField(fieldKey index.FieldKey) (posting.List, error) {
+func (s *store) MatchField(fieldKey index.FieldKey) (list posting.List, err error) {
 	return s.Range(fieldKey, index.RangeOpts{})
 }
 
-func (s *store) MatchTerms(field index.Field) (posting.List, error) {
-	f, err := field.Marshal()
+func (s *store) MatchTerms(field index.Field) (list posting.List, err error) {
+	reader, err := s.writer.Reader()
 	if err != nil {
 		return nil, err
 	}
-	result := roaring.NewPostingList()
-	result, errMem := s.searchInMemTables(result, func(table *memTable) (posting.List, error) {
-		list, errInner := table.MatchTerms(field)
-		if errInner != nil {
-			return nil, errInner
-		}
-		return list, nil
-	})
-	if errMem != nil {
-		return nil, errors.Wrap(errMem, "mem table of inverted index")
-	}
-	raw, errTable := s.diskTable.Get(f)
-	switch {
-	case errors.Is(errTable, kv.ErrKeyNotFound):
-		return result, nil
-	case errTable != nil:
-		return nil, errors.Wrap(errTable, "disk table of inverted index")
-	}
-	list := roaring.NewPostingList()
-	err = list.Unmarshall(raw)
+	fk := field.Key.MarshalToStr()
+	query := bluge.NewTermQuery(string(field.Term)).SetField(fk)
+	documentMatchIterator, err := reader.Search(context.Background(), bluge.NewAllMatches(query))
 	if err != nil {
 		return nil, err
 	}
-	err = result.Union(list)
-	if err != nil {
+	iter := newBlugeMatchIterator(documentMatchIterator, fk)
+	if !iter.Next() {
+		return roaring.EmptyPostingList, nil
+	}
+	if err = iter.Close(); err != nil {
 		return nil, err
 	}
-	return result, nil
+	return iter.Val().Value, nil
 }
 
 func (s *store) Range(fieldKey index.FieldKey, opts index.RangeOpts) (list posting.List, err error) {
@@ -166,9 +144,6 @@ func (s *store) Range(fieldKey index.FieldKey, opts index.RangeOpts) (list posti
 	if err != nil {
 		return roaring.EmptyPostingList, err
 	}
-	if iter == nil {
-		return roaring.EmptyPostingList, nil
-	}
 	list = roaring.NewPostingList()
 	for iter.Next() {
 		err = multierr.Append(err, list.Union(iter.Val().Value))
@@ -177,101 +152,101 @@ func (s *store) Range(fieldKey index.FieldKey, opts index.RangeOpts) (list posti
 	return
 }
 
-func (s *store) Iterator(fieldKey index.FieldKey, termRange index.RangeOpts,
-	order modelv1.Sort,
-) (index.FieldIterator, error) {
-	s.rwMutex.RLock()
-	defer s.rwMutex.RUnlock()
-	tt := []*memTable{s.memTable, s.immutableMemTable}
-	iters := make([]index.FieldIterator, 0, len(tt)+1)
-	for _, table := range tt {
-		if table == nil {
-			continue
-		}
-		it, err := table.Iterator(fieldKey, termRange, order)
-		if err != nil {
-			return nil, err
-		}
-		if it == nil {
-			continue
-		}
-		iters = append(iters, it)
-	}
-	it, err := index.NewFieldIteratorTemplate(s.l, fieldKey, termRange, order, s.diskTable,
-		func(term, val []byte, delegated kv.Iterator) (*index.PostingValue, error) {
-			list := roaring.NewPostingList()
-			err := list.Unmarshall(val)
-			if err != nil {
-				return nil, err
-			}
+// Flush flushed memory data to disk
+func (s *store) Flush() error {
+	return nil
+}
 
-			pv := &index.PostingValue{
-				Term:  term,
-				Value: list,
-			}
+type blugeMatchIterator struct {
+	delegated search.DocumentMatchIterator
+	fieldKey  string
 
-			for ; delegated.Valid(); delegated.Next() {
-				f := index.Field{
-					Key: fieldKey,
-				}
-				err := f.Unmarshal(delegated.Key())
-				if err != nil {
-					return nil, err
-				}
-				if !bytes.Equal(f.Term, term) {
-					break
-				}
-				l := roaring.NewPostingList()
-				err = l.Unmarshall(delegated.Val())
-				if err != nil {
-					return nil, err
-				}
-				err = pv.Value.Union(l)
-				if err != nil {
-					return nil, err
-				}
-			}
-			return pv, nil
-		})
-	if err != nil {
-		return nil, err
+	current *index.PostingValue
+	agg     *index.PostingValue
+
+	closed bool
+	err    error
+}
+
+func newBlugeMatchIterator(delegated search.DocumentMatchIterator, fieldKey string) blugeMatchIterator {
+	return blugeMatchIterator{
+		delegated: delegated,
+		fieldKey:  fieldKey,
 	}
-	iters = append(iters, it)
-	if len(iters) < 1 {
-		return nil, nil
+}
+
+func (bmi *blugeMatchIterator) Next() bool {
+	if bmi.err != nil || bmi.closed {
+		return false
 	}
-	var fn index.SwitchFn
-	switch order {
-	case modelv1.Sort_SORT_ASC, modelv1.Sort_SORT_UNSPECIFIED:
-		fn = func(a, b []byte) bool {
-			return bytes.Compare(a, b) > 0
-		}
-	case modelv1.Sort_SORT_DESC:
-		fn = func(a, b []byte) bool {
-			return bytes.Compare(a, b) < 0
-		}
+	for bmi.nextTerm() {
 	}
-	return index.NewMergedIterator(iters, fn), nil
+	if bmi.err != nil || bmi.closed {
+		return false
+	}
+	return true
 }
 
-func (s *store) searchInMemTables(result posting.List, entityFunc entityFunc) (posting.List, error) {
-	s.rwMutex.RLock()
-	defer s.rwMutex.RUnlock()
-	tt := []*memTable{s.memTable, s.immutableMemTable}
-	for _, table := range tt {
-		if table == nil {
-			continue
+func (bmi *blugeMatchIterator) nextTerm() bool {
+	var match *search.DocumentMatch
+	match, bmi.err = bmi.delegated.Next()
+	if bmi.err != nil {
+		return false
+	}
+	if match == nil {
+		if bmi.agg == nil {
+			bmi.closed = true
+		} else {
+			bmi.current = bmi.agg
+			bmi.agg = nil
+		}
+		return false
+	}
+	i := 0
+	var itemID common.ItemID
+	var term []byte
+	bmi.err = match.VisitStoredFields(func(field string, value []byte) bool {
+		if field == docID {
+			id := convert.BytesToUint64(value)
+			itemID = common.ItemID(id)
 		}
-		list, err := entityFunc(table)
-		if err != nil {
-			return result, err
+		if field == bmi.fieldKey {
+			term = y.Copy(value)
 		}
-		err = result.Union(list)
-		if err != nil {
-			return result, err
+		i++
+		return i < 2
+	})
+	if i != 2 {
+		bmi.err = errors.New("less fields")
+		return false
+	}
+	if bmi.err != nil {
+		return false
+	}
+	if bmi.agg == nil {
+		bmi.agg = &index.PostingValue{
+			Term:  term,
+			Value: roaring.NewPostingListWithInitialData(uint64(itemID)),
 		}
+		return true
+	}
+	if bytes.Equal(bmi.agg.Term, term) {
+		bmi.agg.Value.Insert(itemID)
+		return true
+	}
+	bmi.current = bmi.agg
+	bmi.agg = &index.PostingValue{
+		Term:  term,
+		Value: roaring.NewPostingListWithInitialData(uint64(itemID)),
 	}
-	return result, nil
+	return false
 }
 
-type entityFunc func(table *memTable) (posting.List, error)
+func (bmi *blugeMatchIterator) Val() *index.PostingValue {
+	return bmi.current
+}
+
+func (bmi *blugeMatchIterator) Close() error {
+	bmi.closed = true
+	return bmi.err
+}
diff --git a/pkg/index/inverted/inverted_test.go b/pkg/index/inverted/inverted_test.go
index 387cd18..b329322 100644
--- a/pkg/index/inverted/inverted_test.go
+++ b/pkg/index/inverted/inverted_test.go
@@ -23,8 +23,6 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/apache/skywalking-banyandb/pkg/index/posting"
-	"github.com/apache/skywalking-banyandb/pkg/index/posting/roaring"
 	"github.com/apache/skywalking-banyandb/pkg/index/testcases"
 	"github.com/apache/skywalking-banyandb/pkg/logger"
 	"github.com/apache/skywalking-banyandb/pkg/test"
@@ -46,23 +44,6 @@ func TestStore_MatchTerm(t *testing.T) {
 	testcases.RunServiceName(t, s)
 }
 
-func TestStore_MatchTerm_AfterFlush(t *testing.T) {
-	tester := assert.New(t)
-	path, fn := setUp(require.New(t))
-	s, err := NewStore(StoreOpts{
-		Path:   path,
-		Logger: logger.GetLogger("test"),
-	})
-	defer func() {
-		tester.NoError(s.Close())
-		fn()
-	}()
-	tester.NoError(err)
-	testcases.SetUp(tester, s)
-	tester.NoError(s.(*store).Flush())
-	testcases.RunServiceName(t, s)
-}
-
 func TestStore_Iterator(t *testing.T) {
 	tester := assert.New(t)
 	path, fn := setUp(require.New(t))
@@ -79,60 +60,6 @@ func TestStore_Iterator(t *testing.T) {
 	testcases.RunDuration(t, data, s)
 }
 
-func TestStore_Iterator_AfterFlush(t *testing.T) {
-	tester := assert.New(t)
-	path, fn := setUp(require.New(t))
-	s, err := NewStore(StoreOpts{
-		Path:   path,
-		Logger: logger.GetLogger("test"),
-	})
-	defer func() {
-		tester.NoError(s.Close())
-		fn()
-	}()
-	tester.NoError(err)
-	data := testcases.SetUpDuration(tester, s)
-	tester.NoError(s.(*store).Flush())
-	testcases.RunDuration(t, data, s)
-}
-
-func TestStore_Iterator_Hybrid(t *testing.T) {
-	tester := assert.New(t)
-	path, fn := setUp(require.New(t))
-	s, err := NewStore(StoreOpts{
-		Path:   path,
-		Logger: logger.GetLogger("test"),
-	})
-	defer func() {
-		tester.NoError(s.Close())
-		fn()
-	}()
-	tester.NoError(err)
-	r := map[int]posting.List{
-		50:   roaring.NewPostingList(),
-		200:  nil,
-		500:  roaring.NewPostingList(),
-		1000: nil,
-		2000: roaring.NewPostingList(),
-	}
-	data1 := testcases.SetUpPartialDuration(tester, s, r)
-	tester.NoError(s.(*store).Flush())
-	r = map[int]posting.List{
-		50:   nil,
-		200:  roaring.NewPostingList(),
-		500:  nil,
-		1000: roaring.NewPostingList(),
-		2000: nil,
-	}
-	data := testcases.SetUpPartialDuration(tester, s, r)
-	for i, list := range data {
-		if list == nil {
-			data[i] = data1[i]
-		}
-	}
-	testcases.RunDuration(t, data, s)
-}
-
 func setUp(t *require.Assertions) (tempDir string, deferFunc func()) {
 	t.NoError(logger.Init(logger.Logging{
 		Env:   "dev",
diff --git a/pkg/index/inverted/mem.go b/pkg/index/inverted/mem.go
deleted file mode 100644
index 041359d..0000000
--- a/pkg/index/inverted/mem.go
+++ /dev/null
@@ -1,245 +0,0 @@
-// Licensed to Apache Software Foundation (ASF) under one or more contributor
-// license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright
-// ownership. Apache Software Foundation (ASF) licenses this file to you under
-// the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package inverted
-
-import (
-	"bytes"
-	"sort"
-
-	"go.uber.org/multierr"
-
-	"github.com/apache/skywalking-banyandb/api/common"
-	modelv1 "github.com/apache/skywalking-banyandb/api/proto/banyandb/model/v1"
-	"github.com/apache/skywalking-banyandb/banyand/kv"
-	"github.com/apache/skywalking-banyandb/banyand/observability"
-	"github.com/apache/skywalking-banyandb/pkg/index"
-	"github.com/apache/skywalking-banyandb/pkg/index/posting"
-	"github.com/apache/skywalking-banyandb/pkg/index/posting/roaring"
-)
-
-var (
-	_ index.Writer        = (*memTable)(nil)
-	_ index.FieldIterable = (*memTable)(nil)
-)
-
-type memTable struct {
-	fields *fieldMap
-}
-
-func newMemTable() *memTable {
-	return &memTable{
-		fields: newFieldMap(1000),
-	}
-}
-
-func (m *memTable) Write(field index.Field, itemID common.ItemID) error {
-	return m.fields.put(field, itemID)
-}
-
-func (m *memTable) Stats() observability.Statistics {
-	return m.fields.Stats()
-}
-
-var _ index.FieldIterator = (*fIterator)(nil)
-
-type fIterator struct {
-	index     int
-	val       *index.PostingValue
-	keys      [][]byte
-	valueRepo *termMap
-	closed    bool
-}
-
-func (f *fIterator) Next() bool {
-	if f.closed {
-		return false
-	}
-	f.index++
-	if f.index >= len(f.keys) {
-		return false
-	}
-	f.val = f.valueRepo.getEntry(f.keys[f.index])
-	if f.val == nil {
-		return f.Next()
-	}
-	return true
-}
-
-func (f *fIterator) Val() *index.PostingValue {
-	return f.val
-}
-
-func (f *fIterator) Close() error {
-	f.closed = true
-	return nil
-}
-
-func newFieldIterator(keys [][]byte, fValue *termMap) index.FieldIterator {
-	return &fIterator{
-		keys:      keys,
-		valueRepo: fValue,
-		index:     -1,
-	}
-}
-
-func (m *memTable) Iterator(fieldKey index.FieldKey, rangeOpts index.RangeOpts,
-	order modelv1.Sort,
-) (iter index.FieldIterator, err error) {
-	fieldsValues, ok := m.fields.get(fieldKey)
-	if !ok {
-		return nil, nil
-	}
-	fValue := fieldsValues.value
-	var terms [][]byte
-	fValue.mutex.RLock()
-	for _, value := range fValue.repo {
-		if rangeOpts.Between(value.Term) == 0 {
-			terms = append(terms, value.Term)
-		}
-	}
-	fValue.mutex.RUnlock()
-	if len(terms) < 1 {
-		return nil, nil
-	}
-	switch order {
-	case modelv1.Sort_SORT_ASC, modelv1.Sort_SORT_UNSPECIFIED:
-		sort.SliceStable(terms, func(i, j int) bool {
-			return bytes.Compare(terms[i], terms[j]) < 0
-		})
-	case modelv1.Sort_SORT_DESC:
-		sort.SliceStable(terms, func(i, j int) bool {
-			return bytes.Compare(terms[i], terms[j]) > 0
-		})
-	}
-	return newFieldIterator(terms, fValue), nil
-}
-
-func (m *memTable) MatchTerms(field index.Field) (posting.List, error) {
-	fieldsValues, ok := m.fields.get(field.Key)
-	if !ok {
-		return roaring.EmptyPostingList, nil
-	}
-	list := fieldsValues.value.get(field.Term)
-	if list == nil {
-		return roaring.EmptyPostingList, nil
-	}
-	return list, nil
-}
-
-var _ kv.Iterator = (*flushIterator)(nil)
-
-type flushIterator struct {
-	fieldIdx int
-	termIdx  int
-	key      []byte
-	value    []byte
-	fields   *fieldMap
-	valid    bool
-	err      error
-}
-
-func (i *flushIterator) Next() {
-	if i.fieldIdx >= len(i.fields.lst) {
-		i.valid = false
-		return
-	}
-	fieldID := i.fields.lst[i.fieldIdx]
-	terms := i.fields.repo[fieldID]
-	if i.termIdx < len(terms.value.lst) {
-		i.termIdx++
-		if !i.setCurr() {
-			i.Next()
-		}
-		return
-	}
-	i.fieldIdx++
-	i.termIdx = 0
-	if !i.setCurr() {
-		i.Next()
-	}
-}
-
-func (i *flushIterator) Rewind() {
-	i.fieldIdx = 0
-	i.termIdx = 0
-	i.valid = true
-	if !i.setCurr() {
-		i.valid = false
-	}
-}
-
-func (i *flushIterator) Seek(_ []byte) {
-	panic("unsupported")
-}
-
-func (i *flushIterator) Key() []byte {
-	return i.key
-}
-
-func (i *flushIterator) Val() []byte {
-	return i.value
-}
-
-func (i *flushIterator) Valid() bool {
-	return i.valid
-}
-
-func (i *flushIterator) Close() error {
-	return i.err
-}
-
-func (i *flushIterator) setCurr() bool {
-	i.fields.mutex.RLock()
-	if i.fieldIdx >= len(i.fields.lst) {
-		i.fields.mutex.RUnlock()
-		return false
-	}
-	fieldID := i.fields.lst[i.fieldIdx]
-	term := i.fields.repo[fieldID]
-	i.fields.mutex.RUnlock()
-	term.value.mutex.RLock()
-	if i.termIdx >= len(term.value.lst) {
-		term.value.mutex.RUnlock()
-		return false
-	}
-	valueID := term.value.lst[i.termIdx]
-	value := term.value.repo[valueID]
-	term.value.mutex.RUnlock()
-	v, err := value.Value.Marshall()
-	if err != nil {
-		i.err = multierr.Append(i.err, err)
-		return false
-	}
-	i.value = v
-	f := index.Field{
-		Key:  term.key,
-		Term: value.Term,
-	}
-	i.key, err = f.Marshal()
-	if err != nil {
-		i.err = multierr.Append(i.err, err)
-		return false
-	}
-	return true
-}
-
-func (m *memTable) Iter() kv.Iterator {
-	return &flushIterator{
-		fields: m.fields,
-	}
-}
diff --git a/pkg/index/inverted/mem_test.go b/pkg/index/inverted/mem_test.go
deleted file mode 100644
index 7d9a3e4..0000000
--- a/pkg/index/inverted/mem_test.go
+++ /dev/null
@@ -1,38 +0,0 @@
-// Licensed to Apache Software Foundation (ASF) under one or more contributor
-// license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright
-// ownership. Apache Software Foundation (ASF) licenses this file to you under
-// the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package inverted
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/apache/skywalking-banyandb/pkg/index/testcases"
-)
-
-func TestMemTable_MatchTerm(t *testing.T) {
-	mt := newMemTable()
-	testcases.SetUp(assert.New(t), mt)
-	testcases.RunServiceName(t, mt)
-}
-
-func TestMemTable_Iterator(t *testing.T) {
-	mt := newMemTable()
-	data := testcases.SetUpDuration(assert.New(t), mt)
-	testcases.RunDuration(t, data, mt)
-}
diff --git a/pkg/index/inverted/term_map.go b/pkg/index/inverted/term_map.go
deleted file mode 100644
index 42a10b7..0000000
--- a/pkg/index/inverted/term_map.go
+++ /dev/null
@@ -1,96 +0,0 @@
-// Licensed to Apache Software Foundation (ASF) under one or more contributor
-// license agreements. See the NOTICE file distributed with
-// this work for additional information regarding copyright
-// ownership. Apache Software Foundation (ASF) licenses this file to you under
-// the Apache License, Version 2.0 (the "License"); you may
-// not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-
-package inverted
-
-import (
-	"sync"
-
-	"github.com/apache/skywalking-banyandb/api/common"
-	"github.com/apache/skywalking-banyandb/banyand/observability"
-	"github.com/apache/skywalking-banyandb/pkg/convert"
-	"github.com/apache/skywalking-banyandb/pkg/index"
-	"github.com/apache/skywalking-banyandb/pkg/index/posting"
-	"github.com/apache/skywalking-banyandb/pkg/index/posting/roaring"
-)
-
-type termHashID uint64
-
-type termMap struct {
-	repo  map[termHashID]*index.PostingValue
-	lst   []termHashID
-	mutex sync.RWMutex
-}
-
-func newPostingMap() *termMap {
-	return &termMap{
-		repo: make(map[termHashID]*index.PostingValue),
-	}
-}
-
-func (p *termMap) put(key []byte, id common.ItemID) error {
-	list := p.getOrCreate(key)
-	list.Insert(id)
-	return nil
-}
-
-func (p *termMap) getOrCreate(key []byte) posting.List {
-	list := p.get(key)
-	if list != nil {
-		return list
-	}
-	p.mutex.Lock()
-	defer p.mutex.Unlock()
-	hashedKey := termHashID(convert.Hash(key))
-	v := &index.PostingValue{
-		Term:  key,
-		Value: roaring.NewPostingList(),
-	}
-	p.repo[hashedKey] = v
-	p.lst = append(p.lst, hashedKey)
-	return v.Value
-}
-
-func (p *termMap) get(key []byte) posting.List {
-	e := p.getEntry(key)
-	if e == nil {
-		return nil
-	}
-	return e.Value
-}
-
-func (p *termMap) getEntry(key []byte) *index.PostingValue {
-	p.mutex.RLock()
-	defer p.mutex.RUnlock()
-	hashedKey := termHashID(convert.Hash(key))
-	v, ok := p.repo[hashedKey]
-	if !ok {
-		return nil
-	}
-	return v
-}
-
-func (p *termMap) Stats() (s observability.Statistics) {
-	p.mutex.RLock()
-	defer p.mutex.RUnlock()
-	for _, pv := range p.repo {
-		// 8 is the size of key
-		s.MemBytes += 8
-		s.MemBytes += pv.Value.SizeInBytes()
-	}
-	return s
-}
diff --git a/pkg/index/lsm/lsm.go b/pkg/index/lsm/lsm.go
index e903098..7af6cd2 100644
--- a/pkg/index/lsm/lsm.go
+++ b/pkg/index/lsm/lsm.go
@@ -24,6 +24,7 @@ import (
 	"github.com/apache/skywalking-banyandb/pkg/convert"
 	"github.com/apache/skywalking-banyandb/pkg/index"
 	"github.com/apache/skywalking-banyandb/pkg/logger"
+	"go.uber.org/multierr"
 )
 
 var _ index.Store = (*store)(nil)
@@ -45,13 +46,17 @@ func (s *store) Close() error {
 	return s.lsm.Close()
 }
 
-func (s *store) Write(field index.Field, itemID common.ItemID) error {
-	f, err := field.Marshal()
-	if err != nil {
-		return err
+func (s *store) Write(fields []index.Field, itemID common.ItemID) (err error) {
+	for _, field := range fields {
+		f, errInternal := field.Marshal()
+		if errInternal != nil {
+			err = multierr.Append(err, errInternal)
+			continue
+		}
+		itemIDInt := uint64(itemID)
+		err = multierr.Append(err, s.lsm.PutWithVersion(f, convert.Uint64ToBytes(itemIDInt), itemIDInt))
 	}
-	itemIDInt := uint64(itemID)
-	return s.lsm.PutWithVersion(f, convert.Uint64ToBytes(itemIDInt), itemIDInt)
+	return err
 }
 
 type StoreOpts struct {
diff --git a/pkg/index/testcases/duration.go b/pkg/index/testcases/duration.go
index 85f9355..c065d96 100644
--- a/pkg/index/testcases/duration.go
+++ b/pkg/index/testcases/duration.go
@@ -332,10 +332,10 @@ func SetUpPartialDuration(t *assert.Assertions, store index.Writer, r map[int]po
 			if i%len(idx) != i2 || r[term] == nil {
 				continue
 			}
-			t.NoError(store.Write(index.Field{
+			t.NoError(store.Write([]index.Field{{
 				Key:  duration,
 				Term: convert.Int64ToBytes(int64(term)),
-			}, id))
+			}}, id))
 			r[term].Insert(id)
 		}
 	}
diff --git a/pkg/index/testcases/service_name.go b/pkg/index/testcases/service_name.go
index df5e067..5c711f7 100644
--- a/pkg/index/testcases/service_name.go
+++ b/pkg/index/testcases/service_name.go
@@ -88,15 +88,15 @@ func RunServiceName(t *testing.T, store SimpleStore) {
 func SetUp(t *assert.Assertions, store SimpleStore) {
 	for i := 0; i < 100; i++ {
 		if i < 100/2 {
-			t.NoError(store.Write(index.Field{
+			t.NoError(store.Write([]index.Field{{
 				Key:  serviceName,
 				Term: []byte("gateway"),
-			}, common.ItemID(i)))
+			}}, common.ItemID(i)))
 		} else {
-			t.NoError(store.Write(index.Field{
+			t.NoError(store.Write([]index.Field{{
 				Key:  serviceName,
 				Term: []byte("webpage"),
-			}, common.ItemID(i)))
+			}}, common.ItemID(i)))
 		}
 	}
 }
diff --git a/pkg/logger/logger.go b/pkg/logger/logger.go
index f28d5c0..4fce4de 100644
--- a/pkg/logger/logger.go
+++ b/pkg/logger/logger.go
@@ -44,6 +44,10 @@ type Logger struct {
 	*zerolog.Logger
 }
 
+func (l Logger) Module() string {
+	return l.module
+}
+
 func (l *Logger) Named(name string) *Logger {
 	module := strings.Join([]string{l.module, name}, ".")
 	subLogger := root.l.With().Str("module", module).Logger()