Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
fbd5e0c
Add post-filter support for VSIM vector search results
Feb 20, 2026
a57c6d5
fix format
Feb 20, 2026
9c883f7
Update libs/server/Resp/Vector/VectorManager.cs
hailangx Feb 20, 2026
faad189
Avoid per-result byte array allocation in EvaluateFilter (#1571)
Copilot Feb 20, 2026
c177265
VSIM FILTER works without WITHATTRIBS by fetching attributes internal…
Copilot Feb 20, 2026
97010ee
optimize code
Feb 24, 2026
7aa8b13
add Supported vector filter syntax
Feb 24, 2026
95ba208
update doc with syntac
Feb 24, 2026
54064a0
fix build
Feb 24, 2026
aa07eb0
update test with ELE style syntax
Feb 24, 2026
1e5cd34
split the filter engine tests
Feb 24, 2026
c939609
remove object value type
Feb 24, 2026
54dfc42
remove object-returning property
Feb 24, 2026
b65dc7c
fix format error
Feb 24, 2026
513be50
resove comments
Feb 26, 2026
6770b05
refactor to stack-based postfix
Feb 26, 2026
6dd6501
Merge branch 'main' into haixu/vector-filter-postprocessing
hailangx Feb 26, 2026
e09603d
remove hot path allocate
Feb 26, 2026
8d6a90b
Fix formatting: remove trailing newlines per editorconfig
Feb 27, 2026
c5fd1f9
optimize allocate
Feb 27, 2026
a036951
fix test
Feb 28, 2026
f14b6d5
reusable evaluation stack with default capacity (16)
Mar 3, 2026
891bed2
use stack with default 16 capacity to minimize the allocation as most…
Mar 3, 2026
331adeb
add more tests for attribute extractor
Mar 3, 2026
e0bad92
add benchmark
Mar 3, 2026
8b2cbb2
optimize the allocate
Mar 3, 2026
cbef783
orgnize the benchmarks and ordered by real-world frequency
Mar 3, 2026
ee0ed58
refactor
Mar 3, 2026
bc3f414
Merge branch 'main' into haixu/vector-filter-postprocessing
hailangx Mar 4, 2026
187cd2e
Merge branch 'main' into haixu/vector-filter-postprocessing
hailangx Mar 5, 2026
5c9e144
avoid memory copy for final results output
Mar 5, 2026
b3ef884
Merge branch 'haixu/vector-filter-postprocessing' of https://github.c…
Mar 5, 2026
e1ce83c
refactor to all use slicing for josn extraction
Mar 6, 2026
91c62cf
Single-pass extraction for all fields
Mar 6, 2026
b05fe8f
with filed index
Mar 6, 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
326 changes: 326 additions & 0 deletions benchmark/BDN.benchmark/Filter/FilterExpressionBenchmarks.cs

Large diffs are not rendered by default.

8 changes: 4 additions & 4 deletions libs/server/API/GarnetApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -520,12 +520,12 @@ public unsafe GarnetStatus VectorSetRemove(ArgSlice key, ArgSlice element)
=> storageSession.VectorSetRemove(SpanByte.FromPinnedPointer(key.ptr, key.length), SpanByte.FromPinnedPointer(element.ptr, element.length));

/// <inheritdoc />
public unsafe GarnetStatus VectorSetValueSimilarity(ArgSlice key, VectorValueType valueType, ArgSlice values, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result)
=> storageSession.VectorSetValueSimilarity(SpanByte.FromPinnedPointer(key.ptr, key.length), valueType, values, count, delta, searchExplorationFactor, filter.ReadOnlySpan, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result);
public unsafe GarnetStatus VectorSetValueSimilarity(ArgSlice key, VectorValueType valueType, ArgSlice values, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result, ref SpanByteAndMemory filterBitmap)
=> storageSession.VectorSetValueSimilarity(SpanByte.FromPinnedPointer(key.ptr, key.length), valueType, values, count, delta, searchExplorationFactor, filter.ReadOnlySpan, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result, ref filterBitmap);

/// <inheritdoc />
public unsafe GarnetStatus VectorSetElementSimilarity(ArgSlice key, ArgSlice element, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result)
=> storageSession.VectorSetElementSimilarity(SpanByte.FromPinnedPointer(key.ptr, key.length), element.ReadOnlySpan, count, delta, searchExplorationFactor, filter.ReadOnlySpan, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result);
public unsafe GarnetStatus VectorSetElementSimilarity(ArgSlice key, ArgSlice element, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result, ref SpanByteAndMemory filterBitmap)
=> storageSession.VectorSetElementSimilarity(SpanByte.FromPinnedPointer(key.ptr, key.length), element.ReadOnlySpan, count, delta, searchExplorationFactor, filter.ReadOnlySpan, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result, ref filterBitmap);

/// <inheritdoc/>
public unsafe GarnetStatus VectorSetEmbedding(ArgSlice key, ArgSlice element, ref SpanByteAndMemory outputDistances)
Expand Down
8 changes: 4 additions & 4 deletions libs/server/API/GarnetWatchApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -650,17 +650,17 @@ public bool ResetScratchBuffer(int offset)

#region Vector Sets
/// <inheritdoc/>
public GarnetStatus VectorSetValueSimilarity(ArgSlice key, VectorValueType valueType, ArgSlice value, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result)
public GarnetStatus VectorSetValueSimilarity(ArgSlice key, VectorValueType valueType, ArgSlice value, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result, ref SpanByteAndMemory filterBitmap)
{
garnetApi.WATCH(key, StoreType.Main);
return garnetApi.VectorSetValueSimilarity(key, valueType, value, count, delta, searchExplorationFactor, filter, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result);
return garnetApi.VectorSetValueSimilarity(key, valueType, value, count, delta, searchExplorationFactor, filter, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result, ref filterBitmap);
}

/// <inheritdoc/>
public GarnetStatus VectorSetElementSimilarity(ArgSlice key, ArgSlice element, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result)
public GarnetStatus VectorSetElementSimilarity(ArgSlice key, ArgSlice element, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result, ref SpanByteAndMemory filterBitmap)
{
garnetApi.WATCH(key, StoreType.Main);
return garnetApi.VectorSetElementSimilarity(key, element, count, delta, searchExplorationFactor, filter, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result);
return garnetApi.VectorSetElementSimilarity(key, element, count, delta, searchExplorationFactor, filter, maxFilteringEffort, includeAttributes, ref outputIds, out outputIdFormat, ref outputDistances, ref outputAttributes, out result, ref filterBitmap);
}

/// <inheritdoc/>
Expand Down
4 changes: 2 additions & 2 deletions libs/server/API/IGarnetApi.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2041,15 +2041,15 @@ public bool IterateObjectStore<TScanFunctions>(ref TScanFunctions scanFunctions,
/// Ids are encoded in <paramref name="outputIds"/> as length prefixed blobs of bytes.
/// Attributes are encoded in <paramref name="outputAttributes"/> as length prefixed blobs of bytes.
/// </summary>
GarnetStatus VectorSetValueSimilarity(ArgSlice key, VectorValueType valueType, ArgSlice value, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result);
GarnetStatus VectorSetValueSimilarity(ArgSlice key, VectorValueType valueType, ArgSlice value, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result, ref SpanByteAndMemory filterBitmap);

/// <summary>
/// Perform a similarity search given an element already in the vector set and these parameters.
///
/// Ids are encoded in <paramref name="outputIds"/> as length prefixed blobs of bytes.
/// Attributes are encoded in <paramref name="outputAttributes"/> as length prefixed blobs of bytes.
/// </summary>
GarnetStatus VectorSetElementSimilarity(ArgSlice key, ArgSlice element, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result);
GarnetStatus VectorSetElementSimilarity(ArgSlice key, ArgSlice element, int count, float delta, int searchExplorationFactor, ArgSlice filter, int maxFilteringEffort, bool includeAttributes, ref SpanByteAndMemory outputIds, out VectorIdFormat outputIdFormat, ref SpanByteAndMemory outputDistances, ref SpanByteAndMemory outputAttributes, out VectorManagerResult result, ref SpanByteAndMemory filterBitmap);

/// <summary>
/// Fetch the embedding of a given element in a Vector set.
Expand Down
Loading