From 9ea96e93b7a210af51190e12bc7a341d994be201 Mon Sep 17 00:00:00 2001 From: Danielle9897 Date: Wed, 14 Jan 2026 14:34:37 +0200 Subject: [PATCH] RDoc-3605 [Node.js] Data types for vector search --- .../assets/json-document-nodejs.png | Bin 0 -> 42288 bytes .../_data-types-for-vector-search-csharp.mdx | 10 +- .../_data-types-for-vector-search-nodejs.mdx | 156 ++++++++++++++++++ ...ctor-search-using-dynamic-query-nodejs.mdx | 4 +- .../data-types-for-vector-search.mdx | 6 +- .../assets/json-document-nodejs.png | Bin 0 -> 42288 bytes .../_data-types-for-vector-search-csharp.mdx | 10 +- .../_data-types-for-vector-search-nodejs.mdx | 156 ++++++++++++++++++ ...ctor-search-using-dynamic-query-nodejs.mdx | 4 +- .../data-types-for-vector-search.mdx | 6 +- 10 files changed, 342 insertions(+), 10 deletions(-) create mode 100644 docs/ai-integration/vector-search/assets/json-document-nodejs.png create mode 100644 docs/ai-integration/vector-search/content/_data-types-for-vector-search-nodejs.mdx create mode 100644 versioned_docs/version-7.1/ai-integration/vector-search/assets/json-document-nodejs.png create mode 100644 versioned_docs/version-7.1/ai-integration/vector-search/content/_data-types-for-vector-search-nodejs.mdx diff --git a/docs/ai-integration/vector-search/assets/json-document-nodejs.png b/docs/ai-integration/vector-search/assets/json-document-nodejs.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae5cf31467250ebaee15f023fc899960af97fae GIT binary patch literal 42288 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 @@ -19,7 +21,7 @@ import CodeBlock from '@theme/CodeBlock'; -## Supported data types for vector search + ### Textual data @@ -83,7 +85,9 @@ you can also use lists (for example, `List` or `List`) for dynam -## RavenVector + + + RavenVector is RavenDB's dedicated data type for storing and querying **numerical embeddings**. It is highly optimized to minimize storage space and improve the speed of reading arrays from disk, @@ -126,3 +130,5 @@ For example: ![json document](../assets/json-document.png) + + \ No newline at end of file diff --git a/docs/ai-integration/vector-search/content/_data-types-for-vector-search-nodejs.mdx b/docs/ai-integration/vector-search/content/_data-types-for-vector-search-nodejs.mdx new file mode 100644 index 0000000000..af637aa673 --- /dev/null +++ b/docs/ai-integration/vector-search/content/_data-types-for-vector-search-nodejs.mdx @@ -0,0 +1,156 @@ +import Admonition from '@theme/Admonition'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import CodeBlock from '@theme/CodeBlock'; +import ContentFrame from '@site/src/components/ContentFrame'; +import Panel from '@site/src/components/Panel'; + + + +* Data for vector search can be stored in **raw** or **pre-quantized** formats using several data types, + as outlined below. + +* Text and numerical data that is not pre-quantized can be further quantized in the generated embeddings. + Learn more in [Quantization options](../../../ai-integration/vector-search/vector-search-using-dynamic-query.mdx#quantization-options). + +* In this article: + * [Supported data types for vector search](../../../ai-integration/vector-search/data-types-for-vector-search.mdx#supported-data-types-for-vector-search) + * [Textual data](../../../ai-integration/vector-search/data-types-for-vector-search.mdx#textual-data) + * [Numerical data](../../../ai-integration/vector-search/data-types-for-vector-search.mdx#numerical-data) + * [RavenVector](../../../ai-integration/vector-search/data-types-for-vector-search.mdx#ravenvector) + + + + + +### Textual data + + + +`string` - A single text entry. +`string[]` - An array of text entries. + + + +### Numerical data + +* You can store **pre-generated** embedding vectors in your documents, + typically created by machine-learning models from text, images, or other sources. + +* When storing numerical embeddings in a document field: + * Ensure that all vectors within this field across all documents in the collection are generated by the **same model** and model version and have the **same dimensions**. + * Consistency in both dimensionality and model source is crucial for meaningful comparisons in the vector space. + +* In addition to the native types described below, we highly recommended using [RavenVector](../../../ai-integration/vector-search/data-types-for-vector-search.mdx#ravenvector) + for efficient storage and fast queries when working with numerical embeddings. + + + +**Raw embedding data**: +Use when precision is critical. + +`number[]` - A single vector of numerical values representing raw embedding data. +`number[][]`- An array of vectors, where each entry is a separate embedding vector. + + + + + +**Pre-quantized data**: +Use when you prioritize storage efficiency and query speed. + +`number[]` - A single pre-quantized embedding vector in the _Int8_ or _Binary_ quantization format. +`number[][]` - An array of pre-quantized embedding vectors. + +When storing data in these formats in your documents, you should use [RavenDB’s vector quantizer methods](../../../ai-integration/vector-search/vector-search-using-dynamic-query.mdx#section-1). + + + + + +**Base64-encoded data**: +Use when embedding data needs to be represented as a compact and easily serializable string format. + +`string` - A single vector encoded as a Base64 string. +`string[]` - An array of Base64-encoded vectors. + + + + + + + +* `RavenVector` is a helper function that wraps a numerical array into a dedicated `@vector` object in RavenDB. + This structure is highly efficient - it minimizes disk space usage and improves read performance, + making it ideal for both storing and querying embeddings. + +* `RavenVector` is purely structural - it does not apply any transformation or validation to the vector, + it simply ensures that the vector is stored under the `@vector` field in the JSON document. + All vector processing and comparisons are handled entirely by the server. + +--- + +#### Example: storing a vector using RavenVector + + + +```js +const session = documentStore.openSession(); + +const user = new User(); + +// Store embedding in a 'RavenVector' format +user.EmbeddingRavenVector = RavenVector([ + 6.599999904632568, + 7.699999809265137 + ]); + +// Store embedding in a raw numerical array +// This won’t take advantage of RavenDB’s optimized storage format +user.EmbeddingVector = [ + 6.599999904632568, + 7.699999809265137 + ]; + +await session.store(user, "users/1"); +await session.saveChanges(); +``` + + +```js +class User { + constructor(embeddingRavenVector, embeddingVector) { + this.embeddingRavenVector = embeddingRavenVector; + this.embeddingVector = embeddingVector; + } +} +``` + + + +When stored, the vector's content created with the `RavenVector` function will appear under the `@vector` field in the JSON document: + +![json document](../assets/json-document-nodejs.png) + +To query the `embeddingRavenVector field`, use: + + +```js +const similarUsers = await session.query({ collection: "Users" }) + .vectorSearch( + field => field.withEmbedding("embeddingRavenVector"), + + queryVector => queryVector.byEmbedding( + // Use 'RavenVector' to wrap the query vector + RavenVector([ + 6.599999904632568, + 7.699999809265137 + ]) + ) + ) + .all(); +``` + + + + diff --git a/docs/ai-integration/vector-search/content/_vector-search-using-dynamic-query-nodejs.mdx b/docs/ai-integration/vector-search/content/_vector-search-using-dynamic-query-nodejs.mdx index f2357f7b32..e8f1df0d56 100644 --- a/docs/ai-integration/vector-search/content/_vector-search-using-dynamic-query-nodejs.mdx +++ b/docs/ai-integration/vector-search/content/_vector-search-using-dynamic-query-nodejs.mdx @@ -1247,7 +1247,7 @@ factory.byBase64(base64Embedding); #### `RavenVector`: -RavenVector is RavenDB’s dedicated representation for storing and querying numerical embeddings. +RavenVector is RavenDB’s dedicated representation for storing and querying numerical embeddings. Learn more in [RavenVector](../../../ai-integration/vector-search/data-types-for-vector-search.mdx#ravenvector). @@ -1255,7 +1255,7 @@ Learn more in [RavenVector](../../../ai-integration/vector-search/data-types-for // representation of a RavenVector: { "@vector": number[] } -// Helper to create this wrapper: +// Helper function to create this wrapper: RavenVector(numberArray) // => { "@vector": numberArray } ``` diff --git a/docs/ai-integration/vector-search/data-types-for-vector-search.mdx b/docs/ai-integration/vector-search/data-types-for-vector-search.mdx index c8023243b6..f54d6feba7 100644 --- a/docs/ai-integration/vector-search/data-types-for-vector-search.mdx +++ b/docs/ai-integration/vector-search/data-types-for-vector-search.mdx @@ -8,8 +8,9 @@ import LanguageSwitcher from "@site/src/components/LanguageSwitcher"; import LanguageContent from "@site/src/components/LanguageContent"; import DataTypesForVectorSearchCsharp from './content/_data-types-for-vector-search-csharp.mdx'; +import DataTypesForVectorSearchNodejs from './content/_data-types-for-vector-search-nodejs.mdx'; -export const supportedLanguages = ["csharp"]; +export const supportedLanguages = ["csharp", "nodejs"]; @@ -17,6 +18,9 @@ export const supportedLanguages = ["csharp"]; + + +