Mythosia.VectorDb.InMemory 3.0.1

dotnet add package Mythosia.VectorDb.InMemory --version 3.0.1
                    
NuGet\Install-Package Mythosia.VectorDb.InMemory -Version 3.0.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Mythosia.VectorDb.InMemory" Version="3.0.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Mythosia.VectorDb.InMemory" Version="3.0.1" />
                    
Directory.Packages.props
<PackageReference Include="Mythosia.VectorDb.InMemory" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Mythosia.VectorDb.InMemory --version 3.0.1
                    
#r "nuget: Mythosia.VectorDb.InMemory, 3.0.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Mythosia.VectorDb.InMemory@3.0.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Mythosia.VectorDb.InMemory&version=3.0.1
                    
Install as a Cake Addin
#tool nuget:?package=Mythosia.VectorDb.InMemory&version=3.0.1
                    
Install as a Cake Tool

Mythosia.VectorDb.InMemory

Migration from v1.0.0

v2.0.0 renames logical separation units:

  • collectionnamespace (terminology update in public API/docs)
  • namespacescope (for second-tier logical isolation)

Package Summary

Provides InMemoryVectorStore, a thread-safe in-memory implementation of IVectorStore using cosine similarity search.
Suitable for development, testing, and small-scale workloads.

Usage

Automatically used as the default vector store in Mythosia.AI.Rag:

// Explicit selection (same as default)
.WithRag(rag => rag
    .AddDocument("docs.txt")
    .UseInMemoryStore()
)

Features

  • Thread-safe — Uses ConcurrentDictionary for safe concurrent access
  • Cosine similarity — TopK search with configurable result count
  • Hybrid search — BM25 + dense vector fusion via weighted RRF, scores normalized to [0, 1]
  • Namespace / scope isolation — ⚠ Deprecated. Use Metadata entries and VectorFilter.Where() for logical isolation instead. Legacy namespace/scope properties still function but will be removed in a future major version
  • Metadata filtering — Full VectorFilter operator set (Eq/Ne/In/NotIn/Gt/Gte/Lt/Lte/Like/Exists/NotExists, And/Or groups)
  • Minimum score — Discard results below a similarity threshold
  • Upsert — Single and batch upsert operations
  • CountAsync — Count records in a namespace/scope, optionally narrowed by additional filter criteria
  • DiagnosticsIRagDiagnosticsStore: ListAllRecordsAsync, ScoredListAsync, GetTotalRecordCount

Standalone Usage

using Mythosia.VectorDb;
using Mythosia.VectorDb.InMemory;

var store = new InMemoryVectorStore();

await store.UpsertAsync(new VectorRecord
{
    Id = "doc-1",
    Content = "Some text content",
    Vector = new float[] { 0.1f, 0.2f, 0.3f },
    Metadata =
    {
        ["source"] = "manual.txt",
        ["namespace"] = "my-namespace",
        ["scope"] = "tenant-1"
    }
});

var filter = new VectorFilter()
    .Where("namespace", "my-namespace")
    .Where("scope", "tenant-1");
var results = await store.SearchAsync(queryVector, topK: 5, filter: filter);

Fluent API (Deprecated)

InNamespace() / InScope() still work but produce compiler warnings and will be removed.

// Deprecated — use Metadata + Where() instead
var ns = store.InNamespace("my-namespace");
await ns.UpsertAsync(record);
var results = await ns.SearchAsync(queryVector, topK: 5);

BM25 Index

Bm25Index provides in-memory BM25 keyword search for hybrid retrieval. When UseHybridSearch() is called with InMemoryVectorStore, the RAG pipeline automatically builds a BM25 index alongside the vector store and merges results via RRF.

// Automatic — just enable hybrid search in the builder
var store = await RagStore.BuildAsync(config => config
    .AddText("환불은 14일 이내 가능합니다.", id: "refund")
    .UseLocalEmbedding(512)
    .UseInMemoryStore()
    .UseHybridSearch()     // BM25 index is built automatically
);

Standalone usage:

using Mythosia.VectorDb.InMemory;

var bm25 = new Bm25Index();
bm25.Index("doc1", "machine learning neural network");
bm25.Index("doc2", "cooking recipe pasta");

var results = bm25.Search("machine learning", topK: 5);
// results[0].Id == "doc1", results[0].Score > 0

When hybrid search is used, fused RRF scores are normalized to the [0, 1] range so VectorFilter.MinScore is applied consistently to the final merged score.

VectorFilter

For the full operator reference and fluent API examples (Where, WhereNot, WhereIn, WhereLike, WhereExists, Or, And, WithMinScore, etc.), see the Mythosia.VectorDb.Abstractions README.

InMemory-specific note: Range operators (WhereGreaterThan, WhereLessThan, etc.) use string.Compare (ordinal). Store numeric values zero-padded (e.g. "0042") for correct ordering.

Batch Get & Count

// Fetch multiple records by ID in one call
var filter = new VectorFilter().Where("namespace", "docs");
var records = await store.GetBatchAsync(new[] { "id-1", "id-2", "id-3" }, filter);

// Count all records matching a filter
long count = await store.CountAsync(new VectorFilter().Where("namespace", "docs"));

// Count with additional metadata filter
long filtered = await store.CountAsync(
    new VectorFilter().Where("namespace", "docs").Where("storage_id", storageId));

GetBatchAsync performs O(1)-per-ID lookups via ConcurrentDictionary.TryGetValue — no vector scoring, just direct key access. Records not found or not matching the filter are omitted.

Resource Disposal

InMemoryVectorStore implements IDisposable. A Bm25Index (Lucene writer, analyzer, RAMDirectory) is created per namespace on first upsert and is always maintained alongside the vector store. Dispose the store when it is no longer needed to release these resources:

using var store = new InMemoryVectorStore();
// ... use store
// Lucene resources released on Dispose

Vector Replacement

ReplaceByFilterAsync is available via the IVectorStore default interface method. It performs sequential DeleteByFilterAsyncUpsertBatchAsync (non-transactional, suitable for in-memory usage):

IVectorStore store = new InMemoryVectorStore();

var filter = new VectorFilter()
    .Where("full_path", "/docs/file.md");

await store.ReplaceByFilterAsync(filter, newRecords);

For transactional guarantees (zero query gap), use PostgresStore which wraps both operations in a single database transaction.

Limitations

  • Data is not persisted — lost when the process exits
  • Not suitable for large-scale production workloads (millions of vectors)
  • For persistence or scale, implement a custom IVectorStore (e.g., Qdrant, Chroma, Pinecone)
Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Mythosia.VectorDb.InMemory:

Package Downloads
Mythosia.AI.Rag

RAG (Retrieval Augmented Generation) orchestration for Mythosia.AI. Implements Mythosia.AI.Rag.Abstractions v5.x. Includes RagPipeline, text splitters, context builder, OpenAI/vLLM embedding providers, hybrid search (BM25 + Vector + RRF), re-ranking (Cohere, LLM, vLLM), search gate, keyword extraction, weighted-blend final selection, progress reporting, DoclingDocument-to-RagDocument conversion, and per-query VectorFilter passthrough (StoreFilter). Depends on Mythosia.AI.Abstractions (IAIService) instead of the full Mythosia.AI implementation.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
3.0.1 63 4/1/2026
3.0.0 90 3/30/2026
2.3.0 86 3/29/2026
2.2.0 90 3/28/2026
2.1.0 244 3/11/2026
2.0.0 124 3/6/2026
1.0.0 126 3/5/2026

v3.0.1: Namespace filtering is now optional — null namespace queries across all namespaces. Deprecated: VectorRecord.Namespace/Scope, VectorFilter.Namespace/Scope/WithNamespace, INamespaceContext, IScopeContext, InNamespace()/InScope() — use Metadata and VectorFilter.Where() for logical isolation instead.