diff --git a/src/matcher.go b/src/matcher.go
index 0879a0885da4d7060bd5ac0d457eb401fdaab157..06352f59da7c47fb3014b82bfcef8f6419a9f4a5 100644
--- a/src/matcher.go
+++ b/src/matcher.go
@@ -134,6 +134,10 @@ func (m *Matcher) scan(request MatchRequest) (*Merger, bool) {
 	}
 	pattern := request.pattern
 	empty := pattern.IsEmpty()
+	if empty {
+		return PassMerger(&request.chunks, m.tac), false
+	}
+
 	cancelled := util.NewAtomicBool(false)
 
 	slices := m.sliceChunks(request.chunks)
diff --git a/src/merger.go b/src/merger.go
index 41323c18d3b1c74dcb8f012bed20a26d285c32a3..21a745976fd5fd2beee06860a1b5f80ebf05966a 100644
--- a/src/merger.go
+++ b/src/merger.go
@@ -10,6 +10,7 @@ var EmptyMerger = NewMerger([][]*Item{}, false, false)
 type Merger struct {
 	lists   [][]*Item
 	merged  []*Item
+	chunks  *[]*Chunk
 	cursors []int
 	sorted  bool
 	tac     bool
@@ -17,11 +18,24 @@ type Merger struct {
 	count   int
 }
 
+func PassMerger(chunks *[]*Chunk, tac bool) *Merger {
+	mg := Merger{
+		chunks: chunks,
+		tac:    tac,
+		count:  0}
+
+	for _, chunk := range *mg.chunks {
+		mg.count += len(*chunk)
+	}
+	return &mg
+}
+
 // NewMerger returns a new Merger
 func NewMerger(lists [][]*Item, sorted bool, tac bool) *Merger {
 	mg := Merger{
 		lists:   lists,
 		merged:  []*Item{},
+		chunks:  nil,
 		cursors: make([]int, len(lists)),
 		sorted:  sorted,
 		tac:     tac,
@@ -41,12 +55,20 @@ func (mg *Merger) Length() int {
 
 // Get returns the pointer to the Item object indexed by the given integer
 func (mg *Merger) Get(idx int) *Item {
+	if mg.chunks != nil {
+		if mg.tac {
+			idx = mg.count - idx - 1
+		}
+		chunk := (*mg.chunks)[idx/ChunkSize]
+		return (*chunk)[idx%ChunkSize]
+	}
+
 	if mg.sorted {
 		return mg.mergedGet(idx)
 	}
 
 	if mg.tac {
-		idx = mg.Length() - idx - 1
+		idx = mg.count - idx - 1
 	}
 	for _, list := range mg.lists {
 		numItems := len(list)