<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: QuantumVoid</title>
    <description>The latest articles on DEV Community by QuantumVoid (@quantumvoid).</description>
    <link>https://dev.to/quantumvoid</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4234039%2Fefd0582c-1ac4-4e9d-abd1-a9384749e7b6.png</url>
      <title>DEV Community: QuantumVoid</title>
      <link>https://dev.to/quantumvoid</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/quantumvoid"/>
    <language>en</language>
    <item>
      <title>We benchmarked SQLite, ObjectBox, and ToStore for On-Device RAG in Flutter: 5-dimension results &amp; architecture comparison</title>
      <dc:creator>QuantumVoid</dc:creator>
      <pubDate>Sun, 08 Nov 2026 20:17:36 +0000</pubDate>
      <link>https://dev.to/quantumvoid/we-benchmarked-sqlite-objectbox-and-tostore-for-on-device-rag-in-flutter-5-dimension-results--1jhk</link>
      <guid>https://dev.to/quantumvoid/we-benchmarked-sqlite-objectbox-and-tostore-for-on-device-rag-in-flutter-5-dimension-results--1jhk</guid>
      <description>&lt;h1&gt;
  
  
  Flutter On-Device RAG and Vector Search Deep Dive: SQLite, ObjectBox, or ToStore? A 5-Dimension Benchmark and Selection Guide
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Executive Summary&lt;/strong&gt;: With the explosive maturation of On-Device Small Language Models (SLMs), building offline private knowledge bases, intelligent code copilots, and local Retrieval-Augmented Generation (RAG) pipelines has become a primary architecture initiative for Flutter applications in 2026. However, edge-constrained memory, strict low-latency expectations, and the engineering complexity of multi-modal hybrid retrieval push traditional local databases to their architectural breaking points.&lt;br&gt;&lt;br&gt;
Following months of rigorous benchmarking and production prototyping, our mobile architecture team evaluated the three most prominent local database solutions in the Flutter ecosystem: &lt;strong&gt;SQLite (sqflite/sqlite-vec)&lt;/strong&gt;, &lt;strong&gt;ObjectBox&lt;/strong&gt;, and &lt;strong&gt;ToStore&lt;/strong&gt;. Here is an objective, comprehensive 5-dimension benchmark and architectural deep dive to guide your on-device hybrid retrieval decisions.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  1. Why On-Device RAG in Flutter Became an Engineering Battlefield in 2026
&lt;/h2&gt;

&lt;p&gt;For a long time, building mobile and desktop AI applications followed a standard pattern: the client app only captured user prompts, dispatched them over the network to cloud LLMs and cloud vector databases, and waited for streaming responses.&lt;/p&gt;

&lt;p&gt;By 2026, advances in mobile NPU computing power and the maturity of on-device lightweight models have driven more and more business scenarios to require &lt;strong&gt;pushing both model inference and knowledge retrieval entirely to the client device&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Absolute Data Privacy and Compliance&lt;/strong&gt;: Healthcare follow-ups, enterprise collaboration, and personal journals strictly forbid uploading sensitive user data to the cloud;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weak-Network and Fully Offline Operation&lt;/strong&gt;: Automotive systems, outdoor field tablets, aviation, and subterranean facility management must guarantee zero network dependency;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-Millisecond Zero-Latency and Token Cost Savings&lt;/strong&gt;: As active users scale from tens of thousands to tens of millions, cloud vector storage and inference token overhead escalate rapidly. Offloading high-frequency private knowledge retrieval to client devices yields massive cost and latency dividends.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, moving RAG (Retrieval-Augmented Generation) directly to the Flutter edge immediately confronts three hard technical barriers:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Fatal Flaw of Single-Channel Dense Vectors: Semantic Drift
&lt;/h3&gt;

&lt;p&gt;A frequent first reaction among developers is: &lt;em&gt;“Let's compute 384-dimensional embeddings locally and run a cosine distance search in Dart.”&lt;/em&gt;&lt;br&gt;&lt;br&gt;
While this works in toy demos, it quickly triggers user complaints under real production workloads:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When a user searches for &lt;strong&gt;“iPhone 15 Pro Max battery capacity”&lt;/strong&gt;, embedding-based retrieval often pulls up chunks discussing “Huawei Mate 60 battery endurance” or “iPhone 14 chargers” because in high-dimensional vector space, their cosine similarity centers around the broad semantic topic of "high-end smartphone battery".&lt;/li&gt;
&lt;li&gt;When a user searches for specific &lt;strong&gt;error codes (e.g., &lt;code&gt;ERR_CONN_REFUSED_403&lt;/code&gt;)&lt;/strong&gt;, &lt;strong&gt;API class names&lt;/strong&gt;, or &lt;strong&gt;part numbers/SKUs&lt;/strong&gt;, dense vectors completely lose focus on the exact keywords, resulting in severe &lt;em&gt;semantic drift&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;: Industrial-grade edge RAG requires a &lt;strong&gt;multi-way hybrid recall pipeline&lt;/strong&gt;: &lt;strong&gt;Dense Vectors (semantic recall) + BM25 Full-Text Search (exact lexical recall) + Neural Sparse Vectors (SPLADE fine-grained features)&lt;/strong&gt;, fused and reranked on a single execution path.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Strict Edge Memory and Cold-Start Latency Requirements
&lt;/h3&gt;

&lt;p&gt;Cloud servers boast hundreds of gigabytes of RAM where vector indexes can sit comfortably, but mobile operating systems (iOS / Android) enforce strict process resident memory thresholds. A memory-heavy HNSW index can easily breach system limits when loading 500,000 vectors, triggering an Out-Of-Memory (OOM) termination in the background.&lt;br&gt;&lt;br&gt;
Even more critical is &lt;strong&gt;cold-start latency&lt;/strong&gt;: users expect apps to become interactive within 1 to 2 seconds. If a local database takes tens of seconds or half a minute to load indexes or restore states, the OS will flag an ANR (Application Not Responding) crash or forcefully terminate the app.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. The Fragmentation and Stitching Overhead of Multi-Modal Data
&lt;/h3&gt;

&lt;p&gt;Edge knowledge base chunks always carry rich operational metadata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;“Only search vector semantics within chunks where &lt;code&gt;user_id = 9527&lt;/code&gt; AND &lt;code&gt;category = 'finance'&lt;/code&gt;”&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;If the database does not support a &lt;strong&gt;unified pipeline combining structured predicate filtering with vector and text retrieval&lt;/strong&gt;, developers are forced to query IDs via SQL first, deserialize tens of thousands of rows into Dart memory, and manually iterate through vector arrays. This bloats code and causes severe performance drops.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2. Cross-Sectional Architectural Overview: How the Contenders Stack Up
&lt;/h2&gt;

&lt;p&gt;To solve these bottlenecks, we conducted an empirical selection across the three most representative database options in the Flutter ecosystem:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evaluation Dimension / Core Capability&lt;/th&gt;
&lt;th&gt;SQLite (sqflite)&lt;/th&gt;
&lt;th&gt;ObjectBox&lt;/th&gt;
&lt;th&gt;ToStore&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Architectural Model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Traditional single-node relational database&lt;/td&gt;
&lt;td&gt;Lightweight object NoSQL database&lt;/td&gt;
&lt;td&gt;Edge-distributed multi-modal engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dense Vector ANN Search&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No native index (CPU-bound scans cause jank)&lt;/td&gt;
&lt;td&gt;⚠️ Native HNSW (Heavy indexing / High RAM overhead)&lt;/td&gt;
&lt;td&gt;✅ Native proprietary NGH index (High QPS / Low latency)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Full-Text Search (BM25/FTS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Supports FTS5 (Collapses under high concurrent load)&lt;/td&gt;
&lt;td&gt;❌ Not supported natively&lt;/td&gt;
&lt;td&gt;✅ Built-in BM25 full-text search (Stable at scale)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neural Sparse Vector (SPLADE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;✅ Native support (Crucial for technical terms and entities)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Way Hybrid Fusion&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Requires complex manual stitching&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;✅ Chained 1-line multi-way weighted fusion (Weighted/RRF)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;High-Performance KV Store&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manual table emulation required (Heavy, no TTL)&lt;/td&gt;
&lt;td&gt;Supported (No lifecycle eviction mechanism)&lt;/td&gt;
&lt;td&gt;✅ Native built-in (Supports relative/absolute TTL, Multi-Space)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Schema Evolution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Painful manual &lt;code&gt;ALTER TABLE&lt;/code&gt; scripts (Prone to crashes)&lt;/td&gt;
&lt;td&gt;Basic object property mapping&lt;/td&gt;
&lt;td&gt;✅ Proprietary: Declarative zero-downtime online evolution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-Space Data Isolation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ Requires maintaining multiple DB files&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;✅ Native support (1-line switching and global sharing)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Systematic Data Governance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational constraints / No built-in eviction&lt;/td&gt;
&lt;td&gt;❌ Weak constraints / No built-in eviction policies&lt;/td&gt;
&lt;td&gt;✅ Complete constraints + Cascading FK + TTL/LRU eviction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ultra-Large Scale &amp;amp; Cold Start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ 10M cold start exceeds 30s&lt;/td&gt;
&lt;td&gt;❌ OOM crash above 5M records (27s cold start)&lt;/td&gt;
&lt;td&gt;✅ 1 Billion scale verified (Constant ~35ms cold start)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  Contender A: SQLite / sqflite (The Traditional Relational Veteran)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Background&lt;/strong&gt;: Written in C, SQLite is the perennial mobile standard, commanding the largest Flutter user base via the &lt;code&gt;sqflite&lt;/code&gt; plugin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-Device RAG Bottlenecks&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Native SQLite does not support vectors. Existing workarounds rely on FFI wrappers like &lt;code&gt;sqlite-vec&lt;/code&gt; (which add brittle cross-compilation hurdles across iOS, Android, Windows, and macOS) or manual Dart loops calculating cosine distance.&lt;/li&gt;
&lt;li&gt;Once vector collections reach tens of thousands of items, brute-force Dart loops pin CPU cores and cause severe thermal throttling and UI stutter.&lt;/li&gt;
&lt;li&gt;While SQLite supports FTS5 full-text search, unifying lexical scores with vector distance metrics requires bespoke SQL and complex normalization glue code.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Contender B: ObjectBox (The High-Speed NoSQL Store)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Background&lt;/strong&gt;: Powered by a C++ core, ObjectBox uses FlatBuffers serialization to achieve rapid read and write speeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-Device RAG Bottlenecks&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;ObjectBox introduced HNSW-based vector search, which performs reliably on small datasets. However, as edge application complexity rises, its architectural limits become apparent:&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Native Full-Text Search&lt;/strong&gt;: ObjectBox lacks built-in inverted text indexing or BM25 search. Lexical keyword recall requires an external search component;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;In-Memory Graph Overhead and Capacity Bottlenecks&lt;/strong&gt;: HNSW graphs must remain fully resident in RAM. As data expands, memory consumption triggers OOM crashes and degrades cold-start times;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lack of Advanced Governance and Complex Querying&lt;/strong&gt;: Being a lightweight object store optimized for single-object persistence, it lacks complex relational join queries (JOIN), built-in eviction policies (TTL / LRU), and cascading foreign key checks;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No Support for Neural Sparse Vectors&lt;/strong&gt;, with no mechanism to execute multi-way weighted recall and fusion in a unified query chain.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Contender C: ToStore (The Unified Multi-Modal Engine)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Background&lt;/strong&gt;: ToStore has been publicly published and continuously evolved in the Flutter / Dart community for 3 years, earning widespread adoption and active community support through its robust architecture and outstanding performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Strengths&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All-in-One Multi-Modal Engine&lt;/strong&gt;: Natively supports relational columns, dense vector fields (Dense Vector), BM25 full-text search fields (Text), and neural sparse vector fields (Sparse Vector) within the same table schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete Enterprise Data Governance&lt;/strong&gt;: Natively supports non-null constraints (&lt;code&gt;nullable: false&lt;/code&gt;), range validations, unique indexes, cascading foreign keys (&lt;code&gt;ForeignKeySchema&lt;/code&gt;), complex multi-table joins (JOIN), and aggregations, enforcing data integrity at the engine level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chained Hybrid Retrieval Out of the Box&lt;/strong&gt;: Chained APIs (&lt;code&gt;matchVector&lt;/code&gt;, &lt;code&gt;matchText&lt;/code&gt;, &lt;code&gt;matchSparse&lt;/code&gt;, &lt;code&gt;whereEqual&lt;/code&gt;) handle attribute filtering, multi-way recall, and score fusion (supporting normalized &lt;code&gt;weightedScore&lt;/code&gt; and reciprocal rank fusion &lt;code&gt;rrf&lt;/code&gt;) in one call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Online Schema Evolution&lt;/strong&gt;: Eliminates the nightmare of manual &lt;code&gt;ALTER TABLE&lt;/code&gt; migrations and database version increments (Version 1-&amp;gt;2-&amp;gt;3). ToStore updates declarative schemas online in the background without service interruption.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native Multi-Space Data Isolation&lt;/strong&gt;: A single database instance supports seamless tenant and user switching (&lt;code&gt;db.switchSpace(spaceName: 'user_123')&lt;/code&gt;) while allowing global data sharing (&lt;code&gt;isGlobal: true&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-Performance KV Store with Built-in Eviction&lt;/strong&gt;: Eliminates the need for external packages like &lt;code&gt;shared_preferences&lt;/code&gt;. ToStore includes a high-throughput KV engine with relative/absolute TTL expiration and table-level capacity eviction.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  3. Hardcore Benchmarks: By the Numbers
&lt;/h2&gt;

&lt;p&gt;To remove all guesswork, we evaluated the three databases across multiple rounds under strictly controlled testing environments.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Benchmark Environment and Methodology
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hardware&lt;/strong&gt;: High-performance Apple Silicon;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compilation&lt;/strong&gt;: Dart / Flutter &lt;strong&gt;Release Mode&lt;/strong&gt; (strictly disabling Debug mode, assertions, and JIT overhead);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measurement Runs&lt;/strong&gt;: Each test was executed across 3 independent rounds; numbers represent strict mathematical averages;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Core Metrics&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Write Throughput: &lt;code&gt;OPS&lt;/code&gt; (Operations Per Second)&lt;/li&gt;
&lt;li&gt;Search Throughput: &lt;code&gt;QPS&lt;/code&gt; (Queries Per Second)&lt;/li&gt;
&lt;li&gt;Latency: Average latency (microseconds/milliseconds)&lt;/li&gt;
&lt;li&gt;Cold-Start Latency: Time from process spawn to fully responsive queries (milliseconds/seconds)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  2. Dimension 1: Structured Data Throughput (100K Records)
&lt;/h3&gt;

&lt;p&gt;Before assessing vector metrics, we established a baseline on standard structured tables across 100,000 records:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Database Engine&lt;/th&gt;
&lt;th&gt;Batch Insert (OPS)&lt;/th&gt;
&lt;th&gt;Single Insert (OPS)&lt;/th&gt;
&lt;th&gt;Point/Filter Query (QPS)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ToStore&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;525,801&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31,839&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;492,832&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ObjectBox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;395,961&lt;/td&gt;
&lt;td&gt;2,404&lt;/td&gt;
&lt;td&gt;245,586&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SQLite (sqflite)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;330,288&lt;/td&gt;
&lt;td&gt;7,472&lt;/td&gt;
&lt;td&gt;44,002&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  In-Depth Analysis:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Batch Writes&lt;/strong&gt;: ToStore clocked over &lt;strong&gt;525,000 OPS&lt;/strong&gt;, outperforming ObjectBox by ~33% and SQLite by nearly 60%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single-Item Writes&lt;/strong&gt;: In realistic mobile workloads (such as incremental log writes or chat message arrivals), ObjectBox dropped to 2,404 OPS due to transaction boundary overhead. ToStore maintained &lt;strong&gt;31,839 OPS&lt;/strong&gt;, exceeding ObjectBox by &lt;strong&gt;over 13x&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval Concurrency&lt;/strong&gt;: ToStore achieved &lt;strong&gt;492,832 QPS&lt;/strong&gt;, 11x faster than SQLite and doubling ObjectBox (245,586 QPS).&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  3. Dimension 2: Dense Vector ANN Retrieval
&lt;/h3&gt;

&lt;p&gt;We measured write throughput and Top-10 Approximate Nearest Neighbor (ANN) search throughput using &lt;strong&gt;384-dimensional dense vectors&lt;/strong&gt; (matching mainstream on-device embedding models) across &lt;strong&gt;10,000&lt;/strong&gt; and &lt;strong&gt;100,000&lt;/strong&gt; records.&lt;/p&gt;
&lt;h4&gt;
  
  
  Benchmark Metrics:
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset Size&lt;/th&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;ToStore&lt;/th&gt;
&lt;th&gt;ObjectBox&lt;/th&gt;
&lt;th&gt;SQLite (sqflite)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10,000 Vectors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write Throughput (OPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;97,382&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;348&lt;/td&gt;
&lt;td&gt;27,453&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ANN Search (QPS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;32,859&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2,789&lt;/td&gt;
&lt;td&gt;827&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100,000 Vectors&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write Throughput (OPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;72,839&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;137&lt;/td&gt;
&lt;td&gt;25,856&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;ANN Search (QPS)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;17,652&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,358&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Why Are the Differences So Significant?
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ingestion &amp;amp; Indexing Overhead (OPS)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;When inserting vectors into ObjectBox, throughput dropped to &lt;strong&gt;137 ~ 348 OPS&lt;/strong&gt; because its in-memory HNSW graph rebuilds edges synchronously for every inserted node, generating substantial thermal load during bulk imports.&lt;/li&gt;
&lt;li&gt;ToStore sustained &lt;strong&gt;72,839 OPS&lt;/strong&gt; at 100K scale—&lt;strong&gt;over 530x faster than ObjectBox&lt;/strong&gt;!&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Concurrency (QPS)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;At 10,000 records, ToStore achieved &lt;strong&gt;32,859 QPS&lt;/strong&gt;, compared to 2,789 QPS in ObjectBox and 827 QPS in SQLite.&lt;/li&gt;
&lt;li&gt;At 100,000 records, SQLite’s lack of specialized vector indexing collapsed its throughput to &lt;strong&gt;85 QPS&lt;/strong&gt; (completely unusable for production). ObjectBox reached 1,358 QPS, while ToStore sustained &lt;strong&gt;17,652 QPS&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In vector search throughput, ToStore leads ObjectBox by 13x and outperforms SQLite by more than 200x!&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: ToStore provides a granular &lt;code&gt;searchDepth&lt;/code&gt; tuning parameter (&lt;code&gt;50&lt;/code&gt; defaults to ~95% Recall@K, and &lt;code&gt;100&lt;/code&gt; achieves ~98% recall), balancing latency and semantic precision.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h3&gt;
  
  
  4. Dimension 3: Full-Text Search (BM25) and Neural Sparse Vectors
&lt;/h3&gt;

&lt;p&gt;In production RAG systems, relying solely on dense vectors leads to semantic drift. We tested keyword retrieval across 10,000 and 100,000 document chunks:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dataset Scale&lt;/th&gt;
&lt;th&gt;Test Scenario&lt;/th&gt;
&lt;th&gt;ToStore (Text/BM25)&lt;/th&gt;
&lt;th&gt;SQLite (FTS)&lt;/th&gt;
&lt;th&gt;ObjectBox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10K Chunks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write Throughput (OPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;28,038&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;27,378&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Not Supported&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Search Throughput (QPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,837&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;883&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Not Supported&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100K Chunks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Write Throughput (OPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27,282&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;25,897&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Not Supported&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;Search Throughput (QPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4,691&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;126 (Collapses)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Not Supported&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sparse Vector (SPLADE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search Throughput (QPS)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~4,500&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Not Supported&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Not Supported&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Deep Insights:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;ObjectBox Lacks Full-Text Search&lt;/strong&gt;: ObjectBox provides no native inverted text index, forcing developers to look elsewhere when lexical keyword recall is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite FTS Concurrency Collapse&lt;/strong&gt;: At 10,000 items, SQLite FTS reached 883 QPS, but collapsed to &lt;strong&gt;126 QPS&lt;/strong&gt; at 100,000 records. ToStore remained rock-solid at &lt;strong&gt;4,691 QPS&lt;/strong&gt; with zero throughput degradation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neural Sparse Vectors (SPLADE / BGE-M3)&lt;/strong&gt;: Modern retrieval techniques output sparse weights across high-dimensional vocabularies, capturing technical terms and long-tail entities. ToStore provides native &lt;code&gt;DataType.sparse&lt;/code&gt; fields, matching BM25 query speeds (~4,500 QPS). Neither SQLite nor ObjectBox supports sparse vectors.&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  5. Dimension 4: Extreme Scalability and Cold-Start Latency
&lt;/h3&gt;

&lt;p&gt;The most easily overlooked edge risk is &lt;strong&gt;cold-start latency and memory crashes&lt;/strong&gt;. As users accumulate local logs or hundreds of thousands of document chunks, can the database remain responsi&lt;/p&gt;
&lt;h4&gt;
  
  
  Stress Benchmark Metrics:
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Evaluation Dimension&lt;/th&gt;
&lt;th&gt;ToStore&lt;/th&gt;
&lt;th&gt;SQLite&lt;/th&gt;
&lt;th&gt;ObjectBox&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Verified Test Scale &amp;amp; State&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1 Billion Records (1e9 Scale Verified, No Degradation)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~50M (Query &amp;amp; launch heavily degraded)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~5M (Hard RAM limit, OOM Crash)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;100K Scale Cold Start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~35 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~45 ms&lt;/td&gt;
&lt;td&gt;~80 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5M Scale Cold Start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~35 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;16 seconds&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;27 seconds (Danger Zone)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;10M Scale Cold Start&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~35 ms&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30+ seconds (Unusable)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Failed (Direct OOM)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h4&gt;
  
  
  Why Did ObjectBox and SQLite Struggle at Scale?
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ObjectBox's 5-Million Ceiling&lt;/strong&gt;: Because HNSW requires index structures to remain resident in memory, ObjectBox encountered an unrecoverable &lt;strong&gt;OOM abort&lt;/strong&gt; once data surpassed 5 million records, and its launch time reached &lt;strong&gt;27 seconds&lt;/strong&gt; before crashing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite's Cold-Start Lag&lt;/strong&gt;: While SQLite can physically store tens of millions of records, root-page validation and file fragmentation stretched cold starts to 16 seconds at 5M records and over 30 seconds at 10M records, frequently triggering OS ANR terminations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ToStore's Instant Startup&lt;/strong&gt;: ToStore highlights an advanced architecture designed to support server-grade scales! It keeps memory usage low and completely eliminates mobile ANR hazards.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  4. Production Implementation: Building a Multi-Way Hybrid Knowledge Base
&lt;/h2&gt;

&lt;p&gt;Building a hybrid RAG pipeline (Dense Vectors + BM25 Full-Text + Neural Sparse Vectors) often requires hundreds of lines of coordination code. With ToStore's unified query chain, the implementation is remarkably concise.&lt;/p&gt;

&lt;p&gt;The following code is built entirely on ToStore's official public APIs and is ready for production use:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Adding the Dependency
&lt;/h3&gt;

&lt;p&gt;In your Flutter project's &lt;code&gt;pubspec.yaml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;dependencies&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;flutter&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;sdk&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;flutter&lt;/span&gt;
  &lt;span class="na"&gt;tostore&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;^3.6.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Handling Global KV and Multi-Space Isolation (Retiring &lt;code&gt;shared_preferences&lt;/code&gt;)
&lt;/h3&gt;

&lt;p&gt;Before implementing RAG, many projects import &lt;code&gt;shared_preferences&lt;/code&gt; for basic settings and tokens. In practice, &lt;code&gt;shared_preferences&lt;/code&gt; deserializes entire files into memory, easily causing UI frame drops when handling large key spaces or frequent writes.&lt;/p&gt;

&lt;p&gt;ToStore includes an enterprise-grade Key-Value engine out of the box, complete with TTL eviction and multi-space isolation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// 1. High-throughput KV operations (sub-millisecond indexed response, handles large datasets easily)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'theme_mode'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'dark'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 2. Session caching with automatic TTL expiration (no manual cleanup loops required)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'session_token'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'jwt_token_xyz'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;ttl:&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;Duration&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;hours:&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;// 3. Multi-space data isolation (switch active user smoothly without separate DB files)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;switchSpace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;spaceName:&lt;/span&gt; &lt;span class="s"&gt;'user_9527'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// 4. Cross-space global persistence (accessible across all isolated spaces)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'global_device_id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'dev_8888'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;isGlobal:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With ToStore, projects no longer need to stitch together peripheral key-value packages, unifying the underlying storage layer.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Declaring the Multi-Modal Table Schema (Schema with Online Evolution)
&lt;/h3&gt;

&lt;p&gt;Traditional mobile databases require cumbersome version upgrades (&lt;code&gt;version: 2&lt;/code&gt;) and error-prone &lt;code&gt;ALTER TABLE&lt;/code&gt; scripts. ToStore uses &lt;strong&gt;Online Schema Evolution&lt;/strong&gt;: simply declare the updated &lt;code&gt;TableSchema&lt;/code&gt;, and the engine handles structural migrations and index rebuilds in the background.&lt;/p&gt;

&lt;p&gt;In a single table, we declare structured attributes, BM25 text fields, 384-dimensional dense vectors, and sparse vectors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="s"&gt;'package:tostore/tostore.dart'&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="n"&gt;TableSchema&lt;/span&gt; &lt;span class="nf"&gt;buildKnowledgeBaseSchema&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="n"&gt;TableSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'kb_documents'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;primaryKeyConfig:&lt;/span&gt; &lt;span class="n"&gt;PrimaryKeyConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;PrimaryKeyType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sequential&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Auto-incrementing primary key&lt;/span&gt;
    &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="nl"&gt;fields:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="n"&gt;FieldSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;DataType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;FieldSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;DataType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Structured category&lt;/span&gt;
      &lt;span class="n"&gt;FieldSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;DataType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;   &lt;span class="c1"&gt;// BM25 full-text field&lt;/span&gt;
      &lt;span class="n"&gt;FieldSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'embedding'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;DataType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;vectorConfig:&lt;/span&gt; &lt;span class="n"&gt;VectorFieldConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;dimensions:&lt;/span&gt; &lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Dimensions of on-device embedding model&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="n"&gt;FieldSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;name:&lt;/span&gt; &lt;span class="s"&gt;'sparse_features'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;DataType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sparse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Neural sparse vector field (SPLADE)&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="nl"&gt;indexes:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="c1"&gt;// Structured category index&lt;/span&gt;
      &lt;span class="n"&gt;IndexSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fields:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;IndexType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;btree&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="c1"&gt;// BM25 full-text search index&lt;/span&gt;
      &lt;span class="n"&gt;IndexSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fields:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;IndexType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="c1"&gt;// High-performance NGH dense vector index (cosine distance)&lt;/span&gt;
      &lt;span class="n"&gt;IndexSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nl"&gt;fields:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'embedding'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;IndexType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;vector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;vectorConfig:&lt;/span&gt; &lt;span class="n"&gt;VectorIndexConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
          &lt;span class="nl"&gt;indexType:&lt;/span&gt; &lt;span class="n"&gt;VectorIndexType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;ngh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="nl"&gt;distanceMetric:&lt;/span&gt; &lt;span class="n"&gt;VectorDistanceMetric&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;cosine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="c1"&gt;// Neural sparse vector index&lt;/span&gt;
      &lt;span class="n"&gt;IndexSchema&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;fields:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;'sparse_features'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nl"&gt;type:&lt;/span&gt; &lt;span class="n"&gt;IndexType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;sparse&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Opening the Database and Batch Ingesting Knowledge Chunks
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;initAndSeedDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;appDir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// 1. Initialize persistent instance with declarative schema evolution&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;ToStore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nl"&gt;dbPath:&lt;/span&gt; &lt;span class="n"&gt;appDir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;dbName:&lt;/span&gt; &lt;span class="s"&gt;'rag_knowledge_base'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nl"&gt;schemas:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;buildKnowledgeBaseSchema&lt;/span&gt;&lt;span class="p"&gt;()],&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// 2. Seed real-world edge diagnostics knowledge chunks&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'kb_documents'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;batchInsert&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'title'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'Edge Gateway Handshake Timeout Guide (ERR_GW_1004)'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'category'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'troubleshooting'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'content'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'When an edge gateway node reports an ERR_GW_1004 handshake timeout, verify the local TLS certificate validity and inspect heartbeat packets over the physical route.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'embedding'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;VectorData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt; &lt;span class="c1"&gt;// 384-dimensional dense vector&lt;/span&gt;
      &lt;span class="s"&gt;'sparse_features'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SparseVectorData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromMap&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;'gateway'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.88&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'1004'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.95&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'timeout'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.72&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="s"&gt;'title'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'Offline Multi-Tier Graceful Degradation Protocol'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'category'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'troubleshooting'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'content'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;'In degraded network conditions, client nodes must trigger local fallback mechanisms, prioritizing edge knowledge retrieval to maintain uninterrupted offline assistant capabilities.'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'embedding'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;VectorData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;filled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;384&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.08&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
      &lt;span class="s"&gt;'sparse_features'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SparseVectorData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromMap&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;'offline'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.92&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'fallback'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.84&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'degrade'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.79&lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;flush&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Knowledge chunks imported and indexed successfully!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Executing Multi-Way Hybrid Retrieval in One Chain
&lt;/h3&gt;

&lt;p&gt;In an edge RAG query, the pipeline must:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Apply Predicate Filters&lt;/strong&gt;: Restrict results to &lt;code&gt;category == 'troubleshooting'&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lexical BM25 Recall&lt;/strong&gt;: Match precise keywords like &lt;code&gt;ERR_GW_1004&lt;/code&gt; (weight: 0.3);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neural Sparse Recall&lt;/strong&gt;: Query SPLADE feature weights (weight: 0.3);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dense Vector Recall&lt;/strong&gt;: Query semantic similarity with &lt;code&gt;minScore: 0.40&lt;/code&gt; to filter baseline hallucination noise (weight: 0.4);&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score Fusion&lt;/strong&gt;: Use &lt;code&gt;RetrievalFusionMethod.weightedScore&lt;/code&gt; to produce a single, unified normalized relevance score.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Code requires just one chained call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="n"&gt;Future&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;queryHybridRAG&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="n"&gt;ToStore&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;queryText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;queryDenseVector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kd"&gt;required&lt;/span&gt; &lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;querySparseWeights&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Chained execution: Predicate filter + Text + Sparse + Dense Vector + Weighted Fusion&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;queryResult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'kb_documents'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;whereEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'category'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'troubleshooting'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Structured metadata filter&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;matchText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;'content'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;TextQuery&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queryText&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="c1"&gt;// Tokenized BM25 search (targets ERR_GW_1004)&lt;/span&gt;
        &lt;span class="nl"&gt;weight:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;matchSparse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;'sparse_features'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;SparseVectorData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromMap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;querySparseWeights&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;weight:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;minScore:&lt;/span&gt; &lt;span class="mf"&gt;0.20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;matchVector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;'embedding'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;VectorData&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fromList&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queryDenseVector&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nl"&gt;weight:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nl"&gt;minScore:&lt;/span&gt; &lt;span class="mf"&gt;0.40&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Drops background semantic noise&lt;/span&gt;
        &lt;span class="nl"&gt;searchDepth:&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Ensures ~95% Recall@K&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;fusionMethod&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RetrievalFusionMethod&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;weightedScore&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Unified fusion&lt;/span&gt;
      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;dynamic&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;finalHits&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queryResult&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;retrievalEntries&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;queryResult&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;retrieval&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="na"&gt;entries&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;records&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;retrievalEntries&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;isNotEmpty&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="n"&gt;retrievalEntries&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;score&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Doc: &lt;/span&gt;&lt;span class="si"&gt;${record['title']}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; Normalized Relevance Score: &lt;/span&gt;&lt;span class="si"&gt;${score.toStringAsFixed(4)}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;finalHits&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="s"&gt;'record'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;record&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s"&gt;'score'&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;finalHits&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Architectural Highlights&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All retrieval channels automatically map to a unified &lt;strong&gt;&lt;code&gt;0.0 ~ 1.0&lt;/code&gt; Normalized Relevance Score&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Developers no longer need to write custom Min-Max normalizers in Dart. The underlying &lt;code&gt;weightedScore&lt;/code&gt; algorithm guarantees that a dominant hit on an exact keyword or error code is never diluted by a weaker score on another channel.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  5. Architectural Decision Matrix and Selection Summary
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Through this deep benchmark evaluation, the evolution of modern edge data architectures has become clear: converging entirely into a unified engine!&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart TD
    Start["What are your Flutter data requirements?"] --&amp;gt; K1["High-throughput KV, config &amp;amp; session tokens"]
    Start --&amp;gt; K2["Structured business tables with frequent migrations"]
    Start --&amp;gt; K3["Multi-tenant user switching with global sharing"]
    Start --&amp;gt; K4["On-Device AI, offline RAG &amp;amp; multi-modal retrieval"]

    K1 --&amp;gt; V1["ToStore High-Performance KV Mode&amp;lt;br/&amp;gt;(Replaces fragile shared_preferences, native TTL &amp;amp; LRU eviction)"]
    K2 --&amp;gt; V2["ToStore Relational Tables&amp;lt;br/&amp;gt;(Declarative online schema evolution, eliminates manual ALTER TABLE)"]
    K3 --&amp;gt; V3["ToStore Multi-Space Isolation&amp;lt;br/&amp;gt;(Zero multi-file overhead, instant switchSpace)"]
    K4 --&amp;gt; V4["ToStore Multi-Way Hybrid Retrieval Pipeline&amp;lt;br/&amp;gt;(Dense NGH + BM25 + SPLADE Sparse, 35ms cold starts)"]

    V1 &amp;amp; V2 &amp;amp; V3 &amp;amp; V4 --&amp;gt; Final["Clear First Choice: ToStore&amp;lt;br/&amp;gt;(Unified architecture, single engine solves all edge storage needs)"]&lt;/code&gt;&lt;/pre&gt;



&lt;h3&gt;
  
  
  Final Selection Summary: Why ToStore is the Decisive Winner
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Key-Value and Caching Layer (Outperforming &lt;code&gt;shared_preferences&lt;/code&gt;)&lt;/strong&gt;:
&lt;code&gt;shared_preferences&lt;/code&gt; is suitable only for a handful of settings; once data reaches hundreds of thousands of keys, it becomes virtually unusable (loading entire files into memory easily causes UI frame drops, and it lacks TTL or eviction mechanisms). ToStore's built-in KV mode delivers massive advantages in throughput, scale, and lifecycle management (TTL / LRU eviction), directly replacing &lt;code&gt;shared_preferences&lt;/code&gt; and standalone caching packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Tables and Maintenance (Leading Traditional Solutions)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;SQLite schema upgrades remain fragile, and hand-written migration scripts frequently trigger production crashes;&lt;/li&gt;
&lt;li&gt;ObjectBox leans toward lightweight object persistence, with natural limitations in complex joins, complete constraint validation, and built-in lifecycle eviction (TTL/LRU);&lt;/li&gt;
&lt;li&gt;ToStore pairs complete enterprise data governance with zero-downtime &lt;strong&gt;Online Schema Evolution&lt;/strong&gt;, working seamlessly in the background alongside native &lt;strong&gt;Multi-Space isolation&lt;/strong&gt; to significantly reduce mobile development and maintenance overhead.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-Device Vector and RAG Retrieval (Dominating SQLite and ObjectBox)&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; lacks native high-performance vector indexing, saturating CPUs and suffering severe concurrency drops on full-text queries;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ObjectBox&lt;/strong&gt; lacks native full-text indexing (FTS), imposes heavy vector indexing overhead, and triggers &lt;strong&gt;OOM crashes above 5 million records&lt;/strong&gt; with 27-second launch delays;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ToStore&lt;/strong&gt; delivers &lt;strong&gt;13x to 200x higher vector throughput&lt;/strong&gt; (sustaining 17,652 QPS at 100K scale), zero degradation on concurrent BM25 text queries, and stands as the ecosystem's &lt;strong&gt;only engine natively supporting neural sparse vectors (SPLADE) and multi-way score fusion&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In an era where on-device AI and edge intelligence are becoming universal, &lt;strong&gt;adopting ToStore as a unified edge data foundation has become the most dependable, robust, and forward-looking choice for Flutter architecture in 2026.&lt;/strong&gt;&lt;/p&gt;




</description>
      <category>ai</category>
      <category>rag</category>
      <category>flutter</category>
      <category>database</category>
    </item>
  </channel>
</rss>
