Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
88 commits
Select commit Hold shift + click to select a range
16093d1
rebase
CascadingRadium Nov 17, 2025
abaddc7
minor UT change
CascadingRadium Nov 17, 2025
f8f4061
revert gomod change
CascadingRadium Nov 17, 2025
b6ac3e1
typos
CascadingRadium Nov 17, 2025
a5fab17
frankUT
CascadingRadium Nov 17, 2025
2be276f
fix array of arrays
CascadingRadium Nov 19, 2025
9b68719
bug fixes and UTs
CascadingRadium Nov 20, 2025
dddf0ab
update readme, add docs
CascadingRadium Nov 22, 2025
7883233
fix render
CascadingRadium Nov 22, 2025
7b058a6
lint fix
CascadingRadium Nov 22, 2025
311f578
bug fixes
CascadingRadium Nov 25, 2025
106dcb3
fix bugs
CascadingRadium Nov 26, 2025
0d5bafc
perf optimization
CascadingRadium Nov 26, 2025
9da53cf
perf optimization
CascadingRadium Nov 26, 2025
53a5699
perf optimiztion 2
CascadingRadium Nov 26, 2025
32bfd15
fix prefilter case
CascadingRadium Nov 27, 2025
e341e38
cleanup
CascadingRadium Nov 27, 2025
b94610d
cleanup
CascadingRadium Nov 27, 2025
204aa23
performance optimization 3
CascadingRadium Nov 27, 2025
056d963
fix knn
CascadingRadium Nov 27, 2025
e13bcc5
add vector use case in md
CascadingRadium Nov 27, 2025
7c58c80
perf optimization 4
CascadingRadium Nov 27, 2025
9ee54b1
use clear
CascadingRadium Nov 27, 2025
2f6769a
perf opt 7
CascadingRadium Nov 27, 2025
4841173
rewire api to avoid alloc
CascadingRadium Nov 28, 2025
2e318dc
use new API
CascadingRadium Nov 28, 2025
fa38d98
reuse descendantIDs
CascadingRadium Nov 28, 2025
7857fef
fix bug
CascadingRadium Nov 28, 2025
5eb7766
heuristic for Advance()
CascadingRadium Nov 29, 2025
77f4b32
trivial fix
CascadingRadium Nov 29, 2025
f4b8c1f
fix String() method
CascadingRadium Nov 30, 2025
7215a0a
performance optimization
CascadingRadium Dec 2, 2025
63edd06
Merge branch 'master' into nested
CascadingRadium Dec 2, 2025
f347198
fix merge
CascadingRadium Dec 2, 2025
933a97c
fix merge 2
CascadingRadium Dec 2, 2025
0edb0ad
hybrid search fix part 1
CascadingRadium Dec 2, 2025
35ba4ff
Fix duplicate results when performing KNN search
CascadingRadium Dec 3, 2025
234b4aa
fix duplicate issue
CascadingRadium Dec 3, 2025
3b5d30c
code review
CascadingRadium Dec 3, 2025
43a4845
Merge branch 'knnDup' into nested
CascadingRadium Dec 3, 2025
c2cc750
fix stat
CascadingRadium Dec 3, 2025
e6cd8ea
Fix vector field aliase validation
CascadingRadium Dec 3, 2025
fc13aca
unit tests
CascadingRadium Dec 3, 2025
56e46fa
Fix vector normalization to handle multi-vectors correctly
CascadingRadium Dec 4, 2025
781335b
Fix vector normalization to handle multi-vectors correctly
CascadingRadium Dec 4, 2025
4e3891f
UT
CascadingRadium Dec 4, 2025
9dae832
merge conflict
CascadingRadium Dec 4, 2025
d654a70
Fix duplicate results when performing KNN search
CascadingRadium Dec 3, 2025
7e65ecd
code review
CascadingRadium Dec 3, 2025
8838f89
fix dedup logic
CascadingRadium Dec 4, 2025
9850084
Merge branch 'knnDup' into nested
CascadingRadium Dec 4, 2025
42c98f1
unit test
CascadingRadium Dec 4, 2025
c4dd9d4
fix
CascadingRadium Dec 4, 2025
351d8be
Apply suggestions from code review
CascadingRadium Dec 4, 2025
2db8199
go fmt ./...
abhinavdangeti Dec 4, 2025
a5fd255
fix total calc
CascadingRadium Dec 4, 2025
b914204
fix edge case
CascadingRadium Dec 4, 2025
6b153a0
fix test
CascadingRadium Dec 4, 2025
9ac8392
Merge branch 'knnDup' into cosineFix
CascadingRadium Dec 5, 2025
68760c2
use normalizeVector for base64
CascadingRadium Dec 5, 2025
99e2120
fix merge conflict
CascadingRadium Dec 5, 2025
b1f596c
Merge branch 'cosineFix' into nested
CascadingRadium Dec 5, 2025
8721d16
Fix interface
CascadingRadium Dec 5, 2025
70798cc
Merge branch 'knnDup' into nested
CascadingRadium Dec 5, 2025
f3ed293
fix KNN case
CascadingRadium Dec 5, 2025
a233b67
MB-69655: Fix vector normalization to handle multi-vectors correctly …
CascadingRadium Dec 8, 2025
dd2422d
revert
CascadingRadium Dec 8, 2025
f3540a6
fix
CascadingRadium Dec 8, 2025
fcb0d76
fix
CascadingRadium Dec 8, 2025
fc32bb8
Revert "MB-69655: Fix vector normalization to handle multi-vectors co…
abhinavdangeti Dec 8, 2025
8a4e70e
MB-69655: Fix vector normalization to handle multi-vectors correctly …
CascadingRadium Dec 8, 2025
0250c8f
revert again
CascadingRadium Dec 10, 2025
d2faeb6
fix test
CascadingRadium Dec 10, 2025
dd7d1b2
remove newline
CascadingRadium Dec 10, 2025
2d00d0b
Merge branch 'master' into nested
CascadingRadium Dec 11, 2025
210416b
Merge remote-tracking branch 'origin/cosineFix' into nested
CascadingRadium Dec 11, 2025
281e784
Merge branch 'knnDup' into nested
CascadingRadium Dec 11, 2025
d8aafea
finally
CascadingRadium Dec 11, 2025
835b142
fix test
CascadingRadium Dec 12, 2025
db8ce7d
Merge branch 'master' into nested
CascadingRadium Jan 13, 2026
d006fed
fix test
CascadingRadium Jan 13, 2026
540dcad
go mod tidy
CascadingRadium Jan 13, 2026
57b6210
fix test
CascadingRadium Jan 13, 2026
7935953
code review
CascadingRadium Jan 14, 2026
89dcc43
Upgrade to zapx {v17.0.0, v16.3.0} + re-situate nested test(s)
abhinavdangeti Jan 15, 2026
472f152
Update docs/vectors.md with new faiss requirement
abhinavdangeti Jan 15, 2026
30470d7
Update README.md
abhinavdangeti Jan 15, 2026
f54d628
go fmt ./...
abhinavdangeti Jan 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ A modern indexing + search library in GO
* [geo spatial search](https://github.com/blevesearch/bleve/blob/master/geo/README.md)
* approximate k-nearest neighbors via [vector search](https://github.com/blevesearch/bleve/blob/master/docs/vectors.md)
* [synonym search](https://github.com/blevesearch/bleve/blob/master/docs/synonyms.md)
* [hierarchical nested search](https://github.com/blevesearch/bleve/blob/master/docs/hierarchy.md)
* [tf-idf](https://github.com/blevesearch/bleve/blob/master/docs/scoring.md#tf-idf) / [bm25](https://github.com/blevesearch/bleve/blob/master/docs/scoring.md#bm25) scoring models
* Hybrid search: exact + semantic
* Supports [RRF (Reciprocal Rank Fusion) and RSF (Relative Score Fusion)](docs/score_fusion.md)
Expand Down
376 changes: 376 additions & 0 deletions docs/hierarchy.md

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions docs/vectors.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
| `v2.5.0`, `v2.5.1` | [blevesearch/faiss@352484e](https://github.com/blevesearch/faiss/tree/352484e0fc9d1f8f46737841efe5f26e0f383f71) (modified v1.10.0) |
| `v2.5.2`, `v2.5.3`, `v2.5.4` | [blevesearch/faiss@b3d4e00](https://github.com/blevesearch/faiss/tree/b3d4e00a69425b95e0b283da7801efc9f66b580d) (modified v1.11.0) |
| `v2.5.5`, `v2.5.6`, `v2.5.7` | [blevesearch/faiss@8a59a0c](https://github.com/blevesearch/faiss/tree/8a59a0c552fa2d14fa871f6b6bc793de1d277f5e) (modified v1.12.0) |
| `v2.6.0` | [blevesearch/faiss@608356b](https://github.com/blevesearch/faiss/tree/608356b7c9630e891ff87cc49cc7bb460c3870d3) (modified v1.13.1) |

## Supported

Expand Down
37 changes: 35 additions & 2 deletions document/document.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"fmt"
"reflect"

"github.com/blevesearch/bleve/v2/search"
"github.com/blevesearch/bleve/v2/size"
index "github.com/blevesearch/bleve_index_api"
)
Expand All @@ -30,8 +31,9 @@ func init() {
}

type Document struct {
id string `json:"id"`
Fields []Field `json:"fields"`
id string
Fields []Field `json:"fields"`
NestedDocuments []*Document `json:"nested_documents"`
CompositeFields []*CompositeField
StoredFieldsSize uint64
indexed bool
Expand Down Expand Up @@ -157,3 +159,34 @@ func (d *Document) SetIndexed() {
func (d *Document) Indexed() bool {
return d.indexed
}

func (d *Document) AddNestedDocument(doc *Document) {
d.NestedDocuments = append(d.NestedDocuments, doc)
}

func (d *Document) NestedFields() search.FieldSet {
if len(d.NestedDocuments) == 0 {
return nil
}
fieldSet := search.NewFieldSet()
var collectFields func(index.Document)
collectFields = func(doc index.Document) {
// Add all field names from this nested document
doc.VisitFields(func(field index.Field) {
fieldSet.AddField(field.Name())
})
// Recursively collect from this document's nested documents
if nd, ok := doc.(index.NestedDocument); ok {
nd.VisitNestedDocuments(collectFields)
}
}
// Start collection from nested documents only (not root document)
d.VisitNestedDocuments(collectFields)
return fieldSet
}

func (d *Document) VisitNestedDocuments(visitor func(doc index.Document)) {
for _, doc := range d.NestedDocuments {
visitor(doc)
}
}
8 changes: 4 additions & 4 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ go 1.24
require (
github.com/RoaringBitmap/roaring/v2 v2.4.5
github.com/bits-and-blooms/bitset v1.22.0
github.com/blevesearch/bleve_index_api v1.2.12-0.20260109154621-f19a6d6af728
github.com/blevesearch/bleve_index_api v1.3.0
github.com/blevesearch/geo v0.2.4
github.com/blevesearch/go-faiss v1.0.27
github.com/blevesearch/go-metrics v0.0.0-20201227073835-cf1acfcdf475
github.com/blevesearch/go-porterstemmer v1.0.3
github.com/blevesearch/goleveldb v1.0.1
github.com/blevesearch/gtreap v0.1.1
github.com/blevesearch/scorch_segment_api/v2 v2.3.14-0.20260109154938-b56b54c737df
github.com/blevesearch/scorch_segment_api/v2 v2.4.0
github.com/blevesearch/segment v0.9.1
github.com/blevesearch/snowball v0.6.1
github.com/blevesearch/snowballstem v0.9.0
Expand All @@ -24,8 +24,8 @@ require (
github.com/blevesearch/zapx/v13 v13.4.2
github.com/blevesearch/zapx/v14 v14.4.2
github.com/blevesearch/zapx/v15 v15.4.2
github.com/blevesearch/zapx/v16 v16.2.8
github.com/blevesearch/zapx/v17 v17.0.0-20260112205515-7d8cac80436c
github.com/blevesearch/zapx/v16 v16.3.0
github.com/blevesearch/zapx/v17 v17.0.0
github.com/couchbase/moss v0.2.0
github.com/spf13/cobra v1.8.1
go.etcd.io/bbolt v1.4.0
Expand Down
16 changes: 8 additions & 8 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ github.com/RoaringBitmap/roaring/v2 v2.4.5/go.mod h1:FiJcsfkGje/nZBZgCu0ZxCPOKD/
github.com/bits-and-blooms/bitset v1.12.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4=
github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
github.com/blevesearch/bleve_index_api v1.2.12-0.20260109154621-f19a6d6af728 h1:qFnvr+SqVOCbhMl5sVynhuwVkv1yrc7Vhrn8lVdw1nU=
github.com/blevesearch/bleve_index_api v1.2.12-0.20260109154621-f19a6d6af728/go.mod h1:xvd48t5XMeeioWQ5/jZvgLrV98flT2rdvEJ3l/ki4Ko=
github.com/blevesearch/bleve_index_api v1.3.0 h1:DsMpWVjFNlBw9/6pyWf59XoqcAkhHj3H0UWiQsavb6E=
github.com/blevesearch/bleve_index_api v1.3.0/go.mod h1:xvd48t5XMeeioWQ5/jZvgLrV98flT2rdvEJ3l/ki4Ko=
github.com/blevesearch/geo v0.2.4 h1:ECIGQhw+QALCZaDcogRTNSJYQXRtC8/m8IKiA706cqk=
github.com/blevesearch/geo v0.2.4/go.mod h1:K56Q33AzXt2YExVHGObtmRSFYZKYGv0JEN5mdacJJR8=
github.com/blevesearch/go-faiss v1.0.27 h1:7cBImYDDQ82WJd5RUZ1ie6zXztCsC73W94ZzwOjkatk=
Expand All @@ -20,8 +20,8 @@ github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgY
github.com/blevesearch/mmap-go v1.0.2/go.mod h1:ol2qBqYaOUsGdm7aRMRrYGgPvnwLe6Y+7LMvAB5IbSA=
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/scorch_segment_api/v2 v2.3.14-0.20260109154938-b56b54c737df h1:gBuVkzZLUpGJGnCBRgY0ruZVjppD7WaQLeHZei7QQnU=
github.com/blevesearch/scorch_segment_api/v2 v2.3.14-0.20260109154938-b56b54c737df/go.mod h1:f8fXitmMpzgNziIMqUlpTrfPxVVDN8at9k7POEohvJU=
github.com/blevesearch/scorch_segment_api/v2 v2.4.0 h1:OtipwURRzZv6UFmHQnbEqOY90eotINQ2TtSSpWfYuWU=
github.com/blevesearch/scorch_segment_api/v2 v2.4.0/go.mod h1:JalWE/eyEgISwhqtKXoaHMKf5t+F4kXiYrgg0ds3ylw=
github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU=
github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw=
github.com/blevesearch/snowball v0.6.1 h1:cDYjn/NCH+wwt2UdehaLpr2e4BwLIjN4V/TdLsL+B5A=
Expand All @@ -44,10 +44,10 @@ github.com/blevesearch/zapx/v14 v14.4.2 h1:2SGHakVKd+TrtEqpfeq8X+So5PShQ5nW6GNxT
github.com/blevesearch/zapx/v14 v14.4.2/go.mod h1:rz0XNb/OZSMjNorufDGSpFpjoFKhXmppH9Hi7a877D8=
github.com/blevesearch/zapx/v15 v15.4.2 h1:sWxpDE0QQOTjyxYbAVjt3+0ieu8NCE0fDRaFxEsp31k=
github.com/blevesearch/zapx/v15 v15.4.2/go.mod h1:1pssev/59FsuWcgSnTa0OeEpOzmhtmr/0/11H0Z8+Nw=
github.com/blevesearch/zapx/v16 v16.2.8 h1:SlnzF0YGtSlrsOE3oE7EgEX6BIepGpeqxs1IjMbHLQI=
github.com/blevesearch/zapx/v16 v16.2.8/go.mod h1:murSoCJPCk25MqURrcJaBQ1RekuqSCSfMjXH4rHyA14=
github.com/blevesearch/zapx/v17 v17.0.0-20260112205515-7d8cac80436c h1:OfYh0noLbJmt6k2tqYlnSU3zMZEJbFfbSClSGG59A/M=
github.com/blevesearch/zapx/v17 v17.0.0-20260112205515-7d8cac80436c/go.mod h1:ybWwo00MGrNJuFDnl9smEBVUCZmNANf0+E/QVBmfBTs=
github.com/blevesearch/zapx/v16 v16.3.0 h1:hF6VlN15E9CB40RMPyqOIhlDw1OOo9RItumhKMQktxw=
github.com/blevesearch/zapx/v16 v16.3.0/go.mod h1:zCFjv7McXWm1C8rROL+3mUoD5WYe2RKsZP3ufqcYpLY=
github.com/blevesearch/zapx/v17 v17.0.0 h1:srLJFkv5ghz1Z8iVz5uoOK89G2NvI4KdMG7aF3Cx7rE=
github.com/blevesearch/zapx/v17 v17.0.0/go.mod h1:/pi9Gq7byQcduhNB6Vk08+ZXGVGPjZoNc5QnQY8lkOo=
github.com/couchbase/ghistogram v0.1.0 h1:b95QcQTCzjTUocDXp/uMgSNQi8oj1tGwnJ4bODWZnps=
github.com/couchbase/ghistogram v0.1.0/go.mod h1:s1Jhy76zqfEecpNWJfWUiKZookAFaiGOEoyzgHt9i7k=
github.com/couchbase/moss v0.2.0 h1:VCYrMzFwEryyhRSeI+/b3tRBSeTpi/8gn5Kf6dxqn+o=
Expand Down
5 changes: 5 additions & 0 deletions index/scorch/introducer.go
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,11 @@ func (s *Scorch) introduceSegment(next *segmentIntroduction) error {
newss.deleted = nil
}

// update the deleted bitmap to include any nested/sub-documents as well
// if the segment supports that
if ns, ok := newss.segment.(segment.NestedSegment); ok {
newss.deleted = ns.AddNestedDocuments(newss.deleted)
}
// check for live size before copying
if newss.LiveSize() > 0 {
newSnapshot.segment = append(newSnapshot.segment, newss)
Expand Down
6 changes: 6 additions & 0 deletions index/scorch/scorch.go
Original file line number Diff line number Diff line change
Expand Up @@ -799,6 +799,12 @@ func analyze(d index.Document, fn customAnalyzerPluginInitFunc) {
}
}
})
if nd, ok := d.(index.NestedDocument); ok {
nd.VisitNestedDocuments(func(doc index.Document) {
doc.AddIDField()
analyze(doc, fn)
})
}
}

func (s *Scorch) AddEligibleForRemoval(epoch uint64) {
Expand Down
59 changes: 29 additions & 30 deletions index/scorch/snapshot_index.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ package scorch
import (
"container/heap"
"context"
"encoding/binary"
"fmt"
"os"
"path/filepath"
Expand All @@ -42,9 +41,8 @@ type asynchSegmentResult struct {
dict segment.TermDictionary
dictItr segment.DictionaryIterator

cardinality int
index int
docs *roaring.Bitmap
index int
docs *roaring.Bitmap

thesItr segment.ThesaurusIterator

Expand All @@ -59,11 +57,11 @@ func init() {
var err error
lb1, err = lev.NewLevenshteinAutomatonBuilder(1, true)
if err != nil {
panic(fmt.Errorf("Levenshtein automaton ed1 builder err: %v", err))
panic(fmt.Errorf("levenshtein automaton ed1 builder err: %v", err))
}
lb2, err = lev.NewLevenshteinAutomatonBuilder(2, true)
if err != nil {
panic(fmt.Errorf("Levenshtein automaton ed2 builder err: %v", err))
panic(fmt.Errorf("levenshtein automaton ed2 builder err: %v", err))
}
}

Expand Down Expand Up @@ -474,7 +472,7 @@ func (is *IndexSnapshot) GetInternal(key []byte) ([]byte, error) {
func (is *IndexSnapshot) DocCount() (uint64, error) {
var rv uint64
for _, segment := range is.segment {
rv += segment.Count()
rv += segment.CountRoot()
}
return rv, nil
}
Expand All @@ -501,7 +499,7 @@ func (is *IndexSnapshot) Document(id string) (rv index.Document, err error) {
return nil, nil
}

docNum, err := docInternalToNumber(next.ID)
docNum, err := next.ID.Value()
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -571,7 +569,7 @@ func (is *IndexSnapshot) segmentIndexAndLocalDocNumFromGlobal(docNum uint64) (in
}

func (is *IndexSnapshot) ExternalID(id index.IndexInternalID) (string, error) {
docNum, err := docInternalToNumber(id)
docNum, err := id.Value()
if err != nil {
return "", err
}
Expand All @@ -589,7 +587,7 @@ func (is *IndexSnapshot) ExternalID(id index.IndexInternalID) (string, error) {
}

func (is *IndexSnapshot) segmentIndexAndLocalDocNum(id index.IndexInternalID) (int, uint64, error) {
docNum, err := docInternalToNumber(id)
docNum, err := id.Value()
if err != nil {
return 0, 0, err
}
Expand Down Expand Up @@ -778,25 +776,6 @@ func (is *IndexSnapshot) recycleTermFieldReader(tfr *IndexSnapshotTermFieldReade
is.m2.Unlock()
}

func docNumberToBytes(buf []byte, in uint64) []byte {
if len(buf) != 8 {
if cap(buf) >= 8 {
buf = buf[0:8]
} else {
buf = make([]byte, 8)
}
}
binary.BigEndian.PutUint64(buf, in)
return buf
}

func docInternalToNumber(in index.IndexInternalID) (uint64, error) {
if len(in) != 8 {
return 0, fmt.Errorf("wrong len for IndexInternalID: %q", in)
}
return binary.BigEndian.Uint64(in), nil
}

func (is *IndexSnapshot) documentVisitFieldTermsOnSegment(
segmentIndex int, localDocNum uint64, fields []string, cFields []string,
visitor index.DocValueVisitor, dvs segment.DocVisitState) (
Expand Down Expand Up @@ -899,7 +878,7 @@ func (dvr *DocValueReader) BytesRead() uint64 {
func (dvr *DocValueReader) VisitDocValues(id index.IndexInternalID,
visitor index.DocValueVisitor,
) (err error) {
docNum, err := docInternalToNumber(id)
docNum, err := id.Value()
if err != nil {
return err
}
Expand Down Expand Up @@ -1299,3 +1278,23 @@ func (is *IndexSnapshot) TermFrequencies(field string, limit int, descending boo

return termFreqs[:limit], nil
}

// Ancestors returns the ancestor IDs for the given document ID. The prealloc
// slice can be provided to avoid allocations downstream, and MUST be empty.
func (i *IndexSnapshot) Ancestors(ID index.IndexInternalID, prealloc []index.AncestorID) ([]index.AncestorID, error) {
// get segment and local doc num for the ID
seg, ldoc, err := i.segmentIndexAndLocalDocNum(ID)
if err != nil {
return nil, err
}
// get ancestors from the segment
prealloc = i.segment[seg].Ancestors(ldoc, prealloc)
// get global offset for the segment (correcting factor for multi-segment indexes)
globalOffset := i.offsets[seg]
// adjust ancestors to global doc numbers, not local to segment
for idx := range prealloc {
prealloc[idx] = prealloc[idx].Add(globalOffset)
}
// return adjusted ancestors
return prealloc, nil
}
5 changes: 2 additions & 3 deletions index/scorch/snapshot_index_doc.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
package scorch

import (
"bytes"
"reflect"

"github.com/RoaringBitmap/roaring/v2"
Expand Down Expand Up @@ -49,7 +48,7 @@ func (i *IndexSnapshotDocIDReader) Next() (index.IndexInternalID, error) {
next := i.iterators[i.segmentOffset].Next()
// make segment number into global number by adding offset
globalOffset := i.snapshot.offsets[i.segmentOffset]
return docNumberToBytes(nil, uint64(next)+globalOffset), nil
return index.NewIndexInternalID(nil, uint64(next)+globalOffset), nil
}
return nil, nil
}
Expand All @@ -63,7 +62,7 @@ func (i *IndexSnapshotDocIDReader) Advance(ID index.IndexInternalID) (index.Inde
if next == nil {
return nil, nil
}
for bytes.Compare(next, ID) < 0 {
for next.Compare(ID) < 0 {
next, err = i.Next()
if err != nil {
return nil, err
Expand Down
9 changes: 4 additions & 5 deletions index/scorch/snapshot_index_tfr.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
package scorch

import (
"bytes"
"context"
"fmt"
"reflect"
Expand Down Expand Up @@ -103,7 +102,7 @@ func (i *IndexSnapshotTermFieldReader) Next(preAlloced *index.TermFieldDoc) (*in
// make segment number into global number by adding offset
globalOffset := i.snapshot.offsets[i.segmentOffset]
nnum := next.Number()
rv.ID = docNumberToBytes(rv.ID, nnum+globalOffset)
rv.ID = index.NewIndexInternalID(rv.ID, nnum+globalOffset)
i.postingToTermFieldDoc(next, rv)

i.currID = rv.ID
Expand Down Expand Up @@ -157,7 +156,7 @@ func (i *IndexSnapshotTermFieldReader) postingToTermFieldDoc(next segment.Postin
func (i *IndexSnapshotTermFieldReader) Advance(ID index.IndexInternalID, preAlloced *index.TermFieldDoc) (*index.TermFieldDoc, error) {
// FIXME do something better
// for now, if we need to seek backwards, then restart from the beginning
if i.currPosting != nil && bytes.Compare(i.currID, ID) >= 0 {
if i.currPosting != nil && i.currID.Compare(ID) >= 0 {
// Check if the TFR is a special unadorned composite optimization.
// Such a TFR will NOT have a valid `term` or `field` set, making it
// impossible for the TFR to replace itself with a new one.
Expand All @@ -182,7 +181,7 @@ func (i *IndexSnapshotTermFieldReader) Advance(ID index.IndexInternalID, preAllo
}
}
}
num, err := docInternalToNumber(ID)
num, err := ID.Value()
if err != nil {
return nil, fmt.Errorf("error converting to doc number % x - %v", ID, err)
}
Expand All @@ -207,7 +206,7 @@ func (i *IndexSnapshotTermFieldReader) Advance(ID index.IndexInternalID, preAllo
if preAlloced == nil {
preAlloced = &index.TermFieldDoc{}
}
preAlloced.ID = docNumberToBytes(preAlloced.ID, next.Number()+
preAlloced.ID = index.NewIndexInternalID(preAlloced.ID, next.Number()+
i.snapshot.offsets[segIndex])
i.postingToTermFieldDoc(next, preAlloced)
i.currID = preAlloced.ID
Expand Down
Loading
Loading