From eb01ddfeccbe252829139f400da48f075475616d Mon Sep 17 00:00:00 2001 From: Sarah Emmett Date: Thu, 10 Jul 2025 15:53:13 -0400 Subject: [PATCH 01/80] [NO ISSUE] Vector Search Index -> FTS Vector Index --- .../search/pages/search-request-params.adoc | 2 +- modules/search/pages/search.adoc | 2 +- .../vector-search-field-descriptions.adoc | 10 +++---- .../pages/create-vector-search-index-ui.adoc | 24 ++++++++-------- .../pages/fine-tune-vector-search.adoc | 8 +++--- .../pages/pre-filtering-vector-search.adoc | 10 +++---- .../pages/run-vector-search-sdk.adoc | 28 +++++++++---------- .../pages/run-vector-search-ui.adoc | 10 +++---- .../vector-search/pages/vector-search.adoc | 10 +++---- 9 files changed, 52 insertions(+), 52 deletions(-) diff --git a/modules/search/pages/search-request-params.adoc b/modules/search/pages/search-request-params.adoc index d83b2a995..1713e39c7 100644 --- a/modules/search/pages/search-request-params.adoc +++ b/modules/search/pages/search-request-params.adoc @@ -251,7 +251,7 @@ The `params` object can contain the following properties: Set the `ivf_nprobe_pct` value to control the percentage of probes, or the percentage of clusters, that the Search Service searches during a single Vector Search query. -The Search Service automatically calculates a default `nprobe` percentage based on the vectors in a given partition of your Vector Search index. +The Search Service automatically calculates a default `nprobe` percentage based on the vectors in a given partition of your FTS Vector Index. For more information about this calculation, see xref:vector-search:fine-tune-vector-search.adoc[]. If you set the value of `ivf_nprobe_pct` higher than this default calculated value, the Search Service will search a higher percentage of clusters in your processed vectors. diff --git a/modules/search/pages/search.adoc b/modules/search/pages/search.adoc index e5c13008a..e34de3785 100644 --- a/modules/search/pages/search.adoc +++ b/modules/search/pages/search.adoc @@ -64,7 +64,7 @@ include::partial$sdks-fts-links.adoc[] Vector Search builds on {page-product-name}'s Search Service to provide vector index support for Retrieval Augmented Generation (RAG) with an existing Large Language Model (LLM). -Vector Search adds a new index type to the Search Service to support AI application development, known as a Vector Search index. +Vector Search adds a new index type to the Search Service to support AI application development, known as an FTS Vector Index. Using Vector Search and Couchbase {page-product-name}, you can develop applications with an existing LLM while giving context and up-to-date information from your own data. For more information about Vector Search, see xref:vector-search:vector-search.adoc[]. diff --git a/modules/search/partials/vector-search-field-descriptions.adoc b/modules/search/partials/vector-search-field-descriptions.adoc index c44680162..6c0a12a47 100644 --- a/modules/search/partials/vector-search-field-descriptions.adoc +++ b/modules/search/partials/vector-search-field-descriptions.adoc @@ -17,10 +17,10 @@ This may reduce both accuracy (recall) and latency. + The Search Service uses either an inverted file index with scalar quantization, or a directly mapped index with exact vector comparisons, depending on the number of vectors in your data. -For more information about Vector Search indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. +For more information about FTS Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. // end::optimized_for[] // tag::similarity_metric[] -For a `vector` child field, choose the method to calculate the similarity between the vector embedding in a Vector Search index and the vector embedding in a Vector Search query. +For a `vector` child field, choose the method to calculate the similarity between the vector embedding in an FTS Vector Index and the vector embedding in a Vector Search query. NOTE: It's recommended to choose the same similarity metric for your Search index as the one used in your embedding model. @@ -46,13 +46,13 @@ The Search Service will normalize any vectors in your documents before indexing It will also normalize any vectors in your queries if the field for those queries uses cosine similarity. Use *dot_product* similarity if your vectors are already normalized. -For more information about Vector Search indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. +For more information about FTS Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. // end::similarity_metric[] // tag::dimension[] For a `vector` child field, enter the total number of elements in the vector embedding array. -From Couchbase Server version 7.6.2 and later, Vector Search indexes can support arrays with up to 4096 elements. +From Couchbase Server version 7.6.2 and later, FTS Vector Indexes can support arrays with up to 4096 elements. Arrays can be an array of arrays. -For more information about Vector Search indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. +For more information about FTS Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. // end::dimension[] \ No newline at end of file diff --git a/modules/vector-search/pages/create-vector-search-index-ui.adoc b/modules/vector-search/pages/create-vector-search-index-ui.adoc index ebbf3a42b..e600d5a5f 100644 --- a/modules/vector-search/pages/create-vector-search-index-ui.adoc +++ b/modules/vector-search/pages/create-vector-search-index-ui.adoc @@ -1,9 +1,9 @@ -= Create a Vector Search Index in Quick Mode += Create an FTS Vector Index in Quick Mode :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} :page-toclevels: 2 -:description: Use Quick Mode to create a Vector Search index in Couchbase Capella. +:description: Use Quick Mode to create an FTS Vector Index in Couchbase Capella. [abstract] {description} @@ -13,10 +13,10 @@ You must use Advanced Mode to have greater control over how the Search Service r For more information about how to create a Search index in Advanced Mode, see xref:search:create-search-index-ui.adoc[]. -TIP: Vector Search indexes can include all the same features and settings as a Search index. +TIP: FTS Vector Indexes can include all the same features and settings as a Search index. For more information about Search indexes, see the xref:search:search.adoc[Search documentation]. -You must create a Vector Search index before you can xref:run-vector-search-ui.adoc[run a search] that supports vector comparisons. +You must create an FTS Vector Index before you can xref:run-vector-search-ui.adoc[run a search] that supports vector comparisons. == Prerequisites @@ -38,12 +38,12 @@ include::partial$download-sample-partial.adoc[] == Procedure -To create a Vector Search index with Quick Mode in Capella: +To create an FTS Vector Index with Quick Mode in Capella: . On the *Operational Clusters* page, select the operational cluster where you want to create a Search index. . Go to menu:Data Tools[Search]. . Click btn:[Create Search Index]. -. In the *Index Name* field, enter a name for the Vector Search index. +. In the *Index Name* field, enter a name for the FTS Vector Index. + [NOTE] ==== @@ -82,7 +82,7 @@ For more information, see xref:search:create-search-index-ui.adoc#add-mapping[Ad . Click btn:[Create Index]. [#example] -=== Example: Creating a Vector Search Index for Vector Search Query Examples +=== Example: Creating an FTS Vector Index for Vector Search Query Examples If you want to use the sample dataset for the examples in xref:run-vector-search-ui.adoc[] and xref:run-vector-search-sdk.adoc[], then you can xref:search:import-search-index.adoc[import] the following Search index definition into {page-ui-name}: @@ -93,7 +93,7 @@ include::example$sample-vector-search-index-payload.json[] NOTE: Make sure you imported the sample dataset with the recommended settings. -This Vector Search index has a type mapping for a `color.rgb` collection and includes the following fields: +This FTS Vector Index has a type mapping for a `color.rgb` collection and includes the following fields: * The *brightness number* field, which is included in search results and supports sorting and faceting. * The *color string* and *description string* fields, which are included in search results, support highlighting, phrase matching, and sorting and faceting. @@ -102,16 +102,16 @@ This Vector Search index has a type mapping for a `color.rgb` collection and inc == Next Steps -This basic Vector Search index includes the vector embeddings from the child field you specified in your type mapping. +This basic FTS Vector Index includes the vector embeddings from the child field you specified in your type mapping. If you chose to add additional child fields and enabled *Include in search results*, the Search Service can also return data from those fields when you run a Vector Search query. -For example, if you used the Vector Search sample data, you might want to add another child field for the *color* string field to your Vector Search index, to return color names with your Search query. +For example, if you used the Vector Search sample data, you might want to add another child field for the *color* string field to your FTS Vector Index, to return color names with your Search query. For more information about how to add additional child fields to your index, see xref:search:create-search-index-ui.adoc#add-mapping[Add Type Mappings and Mappings]. -You can customize your Vector Search index like any other Search index to add additional data and improve search results. +You can customize your FTS Vector Index like any other Search index to add additional data and improve search results. For more information about how to customize an index, see xref:search:customize-index.adoc[]. CAUTION: Some Search index features are only available in Advanced Mode. If you edit your Search index in Advanced Mode, you cannot make any additional edits in Quick Mode without losing all Advanced Mode settings. -For more information about how to run a search against a Vector Search index, see xref:run-vector-search-ui.adoc[]. \ No newline at end of file +For more information about how to run a search against an FTS Vector Index, see xref:run-vector-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/vector-search/pages/fine-tune-vector-search.adoc b/modules/vector-search/pages/fine-tune-vector-search.adoc index 235784d17..992da9b2c 100644 --- a/modules/vector-search/pages/fine-tune-vector-search.adoc +++ b/modules/vector-search/pages/fine-tune-vector-search.adoc @@ -9,7 +9,7 @@ -The Search Service automatically tunes your Vector Search indexes to achieve a balance between: +The Search Service automatically tunes your FTS Vector Indexes to achieve a balance between: * Recall, or the quality of your search results * Latency, or your search response time @@ -22,7 +22,7 @@ Specifically, the Search Service dynamically adjusts two critical vector paramet `nlist`, also known as `Centroid` count:: The number of clusters used for indexing. -Centroids are used to quickly find the surrounding closest matches in the Vector Search index. +Centroids are used to quickly find the surrounding closest matches in the FTS Vector Index. Increasing the number of centroids will increase accuracy but will decrease the speed of the search. + The `nlist` is determined dynamically based on the size of the dataset, or the number of vectors in a partition: @@ -74,7 +74,7 @@ For more information on the `vector_index_optimized_for` setting, see xref:sear |=== -== Default `nlist` and `nprobe` calculations on a Vector Search Index +== Default `nlist` and `nprobe` calculations on an FTS Vector Index The cluster maintains two dynamically adjusted parameters that will affect the speed, accuracy, and resources used during a search: @@ -90,7 +90,7 @@ Reducing the value reduces the number of centroids visited, which will decrease .Default calculation ==== -If you have a Vector Search index with `vector_index_optimized_for` set to `"recall"` and `indexPartitions` set to `5`, then the `centroid count` (`nlist`) and `nprobe` are determined based on the current vector count in a given partition. +If you have an FTS Vector Index with `vector_index_optimized_for` set to `"recall"` and `indexPartitions` set to `5`, then the `centroid count` (`nlist`) and `nprobe` are determined based on the current vector count in a given partition. [options="noheader", frame="none", grid="none" cols="1,1"] |=== diff --git a/modules/vector-search/pages/pre-filtering-vector-search.adoc b/modules/vector-search/pages/pre-filtering-vector-search.adoc index f259fcf06..936e96aea 100644 --- a/modules/vector-search/pages/pre-filtering-vector-search.adoc +++ b/modules/vector-search/pages/pre-filtering-vector-search.adoc @@ -24,15 +24,15 @@ For more information about how to change Services on your operational cluster, s * You have a bucket with scopes and collections in your operational cluster. For more information, see xref:cloud:clusters:data-service/manage-buckets.adoc[]. -* You have created a Vector Search index. +* You have created an FTS Vector Index. + -For more information about how to create a Vector Search index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample Vector Search index from xref:create-vector-search-index-ui.adoc#example[Create a Vector Search Index with the {page-ui-name}]. +For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index with the {page-ui-name}]. -- == Procedure @@ -41,7 +41,7 @@ To add pre-filtering to a Vector Search query: . On the *Operational Clusters* page, select the operational cluster where you created your Search index. . Go to menu:Data Tools[Search]. -. Next to your Vector Search index, click btn:[Search]. +. Next to your FTS Vector Index, click btn:[Search]. . In the *Search* field, enter a search query that includes a `filter` object with your `knn` object. + For more information about the `filter` object, see xref:search:search-request-params.adoc#filter[filter]. @@ -51,7 +51,7 @@ For more information about the `filter` object, see xref:search:search-request-p === Example: Pre-Filter A Vector Search Query For The Color "Navy" For example, the following Vector Search query tries to find matches to a color with an RGB value of `[176, 0, 176]` with a minimum brightness of `70` and a maximum of `80`. -A pre-filter on the query will narrow the documents searched inside the Vector Search index to documents that have a `color` field value that closely matches `navy`: +A pre-filter on the query will narrow the documents searched inside the FTS Vector Index to documents that have a `color` field value that closely matches `navy`: [source, json] ---- diff --git a/modules/vector-search/pages/run-vector-search-sdk.adoc b/modules/vector-search/pages/run-vector-search-sdk.adoc index 64a16553f..31e0ac3bc 100644 --- a/modules/vector-search/pages/run-vector-search-sdk.adoc +++ b/modules/vector-search/pages/run-vector-search-sdk.adoc @@ -2,7 +2,7 @@ :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} -:description: Using a Couchbase SDK, you can run a simple or more complex vector search against a Vector Search index. +:description: Using a Couchbase SDK, you can run a simple or more complex vector search against an FTS Vector Index. :tabs: :tabs-sync-option: @@ -36,15 +36,15 @@ For more information about how to change Services on your operational cluster, s + Go to your operational cluster settings and click btn:[Nodes] to view node hostnames. -* You have created a Vector Search index. +* You have created an FTS Vector Index. + -For more information about how to create a Vector Search index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample Vector Search index from xref:create-vector-search-index-ui.adoc#example[Create a Vector Search Index in Quick Mode]. +For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. -- * You have installed the Couchbase Go SDK. @@ -60,15 +60,15 @@ For more information about how to change Services on your operational cluster, s + Go to your operational cluster settings and click btn:[Nodes] to view node hostnames. -* You have created a Vector Search index. +* You have created an FTS Vector Index. + -For more information about how to create a Vector Search index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample Vector Search index from xref:create-vector-search-index-ui.adoc#example[Create a Vector Search Index in Quick Mode]. +For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. -- * You have installed the Couchbase Java SDK. @@ -84,15 +84,15 @@ For more information about how to change Services on your operational cluster, s + Go to your operational cluster settings and click btn:[Nodes] to view node hostnames. -* You have created a Vector Search index. +* You have created an FTS Vector Index. + -For more information about how to create a Vector Search index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample Vector Search index from xref:create-vector-search-index-ui.adoc#example[Create a Vector Search Index in Quick Mode]. +For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. -- * You have installed the Couchbase Python SDK. @@ -193,11 +193,11 @@ include::example$run-vector-search-generate-embed.py[] == Next Steps -You can xref:search:create-search-index-ui.adoc#add-mapping[create an additional mapping] to update your Vector Search index to include the `description` field with your search results. +You can xref:search:create-search-index-ui.adoc#add-mapping[create an additional mapping] to update your FTS Vector Index to include the `description` field with your search results. -For example, you could use the following JSON Vector Search index payload to create your Search index. +For example, you could use the following JSON FTS Vector Index payload to create your Search index. It includes two child field mappings, `colorvect_l2` and `embedding_vector_dot` on two different vector fields in the keyspace's documents. -It also adds 3 normal Search index fields (`brightness`, `color`, and `description`) to add more usable data to the Vector Search index: +It also adds 3 normal Search index fields (`brightness`, `color`, and `description`) to add more usable data to the FTS Vector Index: [source,json] ---- @@ -206,5 +206,5 @@ include::example$vector-search-index-payload.jsonc[] Run the example in <> again to see the `description` paragraphs in your results. -Vector Search indexes can use the same settings and features as regular Search indexes. +FTS Vector Indexes can use the same settings and features as regular Search indexes. If you want to add additional fields and features to your index, see xref:search:customize-index.adoc[]. \ No newline at end of file diff --git a/modules/vector-search/pages/run-vector-search-ui.adoc b/modules/vector-search/pages/run-vector-search-ui.adoc index d42342608..dccdf5ba0 100644 --- a/modules/vector-search/pages/run-vector-search-ui.adoc +++ b/modules/vector-search/pages/run-vector-search-ui.adoc @@ -2,7 +2,7 @@ :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} -:description: Run a Vector Search query from the Couchbase {page-ui-name} to preview and test the search results from a Vector Search index. +:description: Run a Vector Search query from the Couchbase {page-ui-name} to preview and test the search results from an FTS Vector Index. [abstract] {description} @@ -14,15 +14,15 @@ For more information about how the Search Service scores documents in search res * You have the Search Service enabled on a node in your operational cluster. For more information about how to change Services on your operational cluster, see xref:cloud:clusters:modify-database.adoc[]. -* You have created a Vector Search index. +* You have created an FTS Vector Index. + -For more information about how to create a Vector Search index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample Vector Search index from xref:create-vector-search-index-ui.adoc#example[Create a Vector Search Index in Quick Mode]. +For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. -- * You have logged in to the Couchbase {page-ui-name}. @@ -33,7 +33,7 @@ To run a Vector Search with the {page-ui-name}: . On the *Operational Clusters* page, select the operational cluster where you created your Search index. . Go to menu:Data Tools[Search]. -. Next to your Vector Search index, click btn:[Search]. +. Next to your FTS Vector Index, click btn:[Search]. . In the *Search* field, enter a search query. . Press kbd:[Enter] or click btn:[Search]. . (Optional) To view a document and its source collection, click a document name in the search results list. diff --git a/modules/vector-search/pages/vector-search.adoc b/modules/vector-search/pages/vector-search.adoc index e64100ba0..afebe509f 100644 --- a/modules/vector-search/pages/vector-search.adoc +++ b/modules/vector-search/pages/vector-search.adoc @@ -10,7 +10,7 @@ == About Vector Search Vector Search builds on Couchbase {page-product-name}'s xref:search:search.adoc[Search Service] to provide vector index support. -You can use these new Vector Search indexes for Retrieval Augmented Generation (RAG) with an existing Large Language Model (LLM). +You can use these new FTS Vector Indexes for Retrieval Augmented Generation (RAG) with an existing Large Language Model (LLM). Using {page-product-name}'s Vector Search, an embedding model, and your chosen LLM, you can develop AI applications while giving context and up-to-date information from your own data. @@ -27,24 +27,24 @@ Use generative AI to get tailored and dynamic responses across your applications Vector Search supports integrations with frameworks like https://python.langchain.com/docs/get_started/introduction[LangChain^] to support AI application development. For more information about all frameworks and integrations supported by Vector Search and {page-product-name}, see xref:third-party:integrations.adoc[]. -== Using Vector Search Indexes +== Using FTS Vector Indexes To get started using Vector Search in {page-product-name}: . *Store data*: Store the data you want to use for your search or AI project in a {page-product-name} operational cluster. . *Generate embeddings*: Generate vector embeddings from your data with your preferred embedding model. . *Store your embeddings*: Store your vector embeddings in an array inside the documents in your {page-product-name} operational cluster. -. *Create a Vector Search index*: Create an index to use your embeddings and identify similar documents with vector similarity. +. *Create an FTS Vector Index*: Create an index to use your embeddings and identify similar documents with vector similarity. In addition to supporting integrations with frameworks like LangChain and LlamaIndex, you can also use the API for an existing LLM and one of their embedding models to generate vector embeddings for your data. For example, the OpenAI `embeddings` endpoint can generate embeddings for a text string using a specified embedding model. You can then store that embedding as a new field in your documents. For more information about how to generate and obtain embeddings for text strings using the OpenAI API, see the https://platform.openai.com/docs/guides/embeddings/what-are-embeddings[Embeddings documentation]. -NOTE: When you create a Vector Search index, the xref:search:type-mapping-options.adoc#dimension[dimension] of your data vector embeddings must match the dimension for any search query vectors. +NOTE: When you create an FTS Vector Index, the xref:search:type-mapping-options.adoc#dimension[dimension] of your data vector embeddings must match the dimension for any search query vectors. Otherwise, a Vector Search query fails to return any results. -For more information about how to create a Vector Search index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. For information about how to run a Vector Search query, see xref:run-vector-search-ui.adoc[]. From e8b0da3ccc80aee9c430d4acb0eedcbee5f90159 Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:49:33 -0400 Subject: [PATCH 02/80] [AV-105751] 8.0 on Capella - Document Search Index `Store` Object (#396) * [AV-105751] First draft of additional store params documentation on Capella * [AV-104690] Add HEAD.yml for previews --- .../simple-search-index-payload.jsonc | 15 +- modules/search/pages/search-index-params.adoc | 147 +++++++++++++++++- preview/HEAD.yml | 6 + 3 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 preview/HEAD.yml diff --git a/modules/search/examples/simple-search-index-payload.jsonc b/modules/search/examples/simple-search-index-payload.jsonc index d52642edd..aa5037fb2 100644 --- a/modules/search/examples/simple-search-index-payload.jsonc +++ b/modules/search/examples/simple-search-index-payload.jsonc @@ -185,9 +185,22 @@ } // end::types[] }, + // tag::store[] "store": { "indexType": "scorch", - "segmentVersion": 15 + // tag::scorch_persister[] + "scorchPersisterOptions": { + "maxSizeInMemoryMergePerWorker": 20971520, + "numPersisterWorkers": 4 + }, + // end::scorch_persister[] + // tag::scorch_merge[] + "scorchMergePlanOptions":{ + "floorSegmentFileSize": 3495253 + }, + // end::scorch_merge[] + "segmentVersion": 16 } + // end::store[] } } diff --git a/modules/search/pages/search-index-params.adoc b/modules/search/pages/search-index-params.adoc index 3c3e40021..86decc5ac 100644 --- a/modules/search/pages/search-index-params.adoc +++ b/modules/search/pages/search-index-params.adoc @@ -4,6 +4,7 @@ :page-product-name: {product-name} :description: Use a JSON payload to control the settings for a Search index. :page-toclevels: 2 +:stem: [abstract] {description} @@ -89,6 +90,14 @@ For more information, see <>. For a xref:index-aliases.adoc[Search index alias], this object contains the <>. +|store |Object |No a| + +An object that controls merge policy, concurrent persister behavior, and file format version for the Search index. + +The Search Service can automatically set these to reasonable default values, based on the other settings in your Search index definition. + +For more information, see <>. + |==== [#planparams] @@ -112,13 +121,13 @@ The `planParams` object contains the following properties: |Property |Type |Required? |Description |maxPartitionsPerPIndex |n/a |No |This setting is deprecated. Use `indexPartitions`, instead. -|indexPartitions |Number |Yes a|The number of partitions to split the Search index into, across the nodes you have available in your cluster with the Search Service enabled. +|indexPartitions |Integer |Yes a|The number of partitions to split the Search index into, across the nodes you have available in your cluster with the Search Service enabled. Use index partitions to increase index and query performance on large datasets. NOTE: The scoring calculation for regular Search queries can be affected by the number of partitions in your Search index, and how the Search Service distributes documents across partitions. This is a limitation of the https://en.wikipedia.org/wiki/Tf%E2%80%93idf[tf-idf^] weighting scheme. -|numReplicas |Number |Yes a| +|numReplicas |Integer |Yes a| For high-availability, set the number of replicas the Search Service creates for the Search index. @@ -1041,7 +1050,7 @@ If the document field's `type` is `text`, set the analyzer to use for the docume NOTE: If you want to use the default analyzer for the content of this document field, you do not need to include an `analyzer` property. -|[[dims]]dims |Number |Vector Only a| +|[[dims]]dims |Integer |Vector Only a| include::partial$vector-search-field-descriptions.adoc[tag=dimension] @@ -1109,3 +1118,135 @@ For more information about the available field data types, see xref:field-data-t include::partial$vector-search-field-descriptions.adoc[tag=optimized_for] |==== + +[#store] +== Store Object + +The `store` object can change settings for merge policy, concurrent persister behavior, and file format version on your Search index. +Depending on your performance needs and specific Search use case, you may want to adjust these values, or leave them as default. + +You do not need to provide this object when creating a Search index. + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=store] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +The `store` object contains the following properties: + +[cols="1,1,1,2"] +|==== +|Property |Type |Required? |Description + +|indexType |String |No |The `indexType` is always `scorch`. + +|scorchPersisterOptions |Object |No a| + +[.status]#Couchbase Server 8.0# + +An object that contains settings for in-memory buffer processing in your Search index. + +For more information, see <>. + +|scorchMergePlanOptions |Object |No a| + +[.status]#Couchbase Server 8.0# + +An object that contains settings for background merging behavior in your Search index. + +For more information, see <>. + +|segmentVersion |Integer |No |The `segmentVersion` is always `16`. + +|==== + +[#scorch-persister] +=== ScorchPersisterOptions Object + +[.status]#Couchbase Server 8.0# + +The `scorchPersisterOptions` object controls in-memory buffer processing on your Search index. + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=scorch_persister] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +The `scorchPersisterOptions` object contains the following properties: + +[cols="1,1,1,2"] +|==== +|Property |Type |Required? |Description + +|[[max_size_memory_merge]]maxSizeInMemoryMergePerWorker |Integer |No | + +Set a value, in bytes, for how much data from the in-memory buffers each worker should process and flush to disk. + +A higher value means healthier data flushing from memory to disk, but longer flushing times for each worker, because of the higher data volume. + +For a FTS Vector Index, set `maxSizeInMemoryMergePerWorker` to 400 MB. + +For a regular Search index, set `maxSizeInMemoryMergePerWorker` to 20 MB. + +You may want to change these recommended values based on your specific use case. + +|numPersisterWorkers |Integer |No | + +Set a value for the total number of workers you want to use to process data from in-memory buffers. + +More workers increases the rate of memory being flushed to disk, but increases the number of files on disk and your disk I/O. + +For a FTS Vector Index, set `numPersisterWorkers` to `4`. + +For a regular Search index, set `numPersisterWorkers` to `4`. + +You may want to change these recommended values based on your specific use case. +If you increase your workers, make sure to increase the <>, to keep your number of segment files low. + +|==== + +[#scorch-merge] +=== ScorchMergePlanOptions Object + +[.status]#Couchbase Server 8.0# + +The `scorchMergePlanOptions` object controls the background merging behavior for segment files in your Search index. + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=scorch_merge] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +The `scorchMergePlanOptions` object contains the following properties: + +[cols="1,1,1,2"] +|==== +|Property |Type |Required? |Description + +|[[floor_segment_size]]floorSegmentFileSize |Integer |No a| + +Set a value, in bytes, for the Search Service's minimum segment file size. +The Search Service merges segments to improve query performance and storage. +If a segment is smaller than this minimum file size, the Search Service will merge it during its background merging. + +A higher value for the minimum segment file size means more aggressive merging behavior and better query performance, at the cost of increased disk I/O and longer merge cycles, with more resource usage. + +For a FTS Vector Index, set `floorSegmentFileSize` to: + +stem:[(\m\a\x\SizeInMem\o\r\yMer\g\ePerW\o\r\ker)/3] + +If you want to improve I/O and indexing performance at the cost of query performance, set `floorSegmentFileSize` to: + +stem:[(\m\a\x\SizeInMem\o\r\yMer\g\ePerW\o\r\ker)/6] + +For a regular Search index, set `floorSegmentFileSize` to the same value as <>. + +You may want to change these recommended values based on your specific use case. + +|==== diff --git a/preview/HEAD.yml b/preview/HEAD.yml new file mode 100644 index 000000000..8d2d1d2da --- /dev/null +++ b/preview/HEAD.yml @@ -0,0 +1,6 @@ +sources: + docs-capella: + branches: [8-0-docs-uptake] +override: + site: + startPage: cloud:get-started:intro.adoc \ No newline at end of file From afcae1f8e4c1775e477d60ead7e581a3db8b2419 Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:01:00 -0400 Subject: [PATCH 03/80] [AV-104690] 8.0 on Capella - FTS Document Filters (#393) * [AV-104690] First draft of Capella version of synonym search updates, adapted from DOC-12754 * [AV-104690] Applicable comment from peer review on DOC-12754 * [AV-104690] Adjust set-type-identifier based on actual state of Capella UI * [AV-104690] Add HEAD.yml for previews * [AV-104690] Fix UI inconsistency * [AV-104690] Address peer review comments --- .../simple-search-index-payload.jsonc | 94 ++++- modules/search/pages/create-type-mapping.adoc | 8 + modules/search/pages/customize-index.adoc | 11 +- modules/search/pages/search-index-params.adoc | 386 +++++++++++++++++- modules/search/pages/set-type-identifier.adoc | 81 +++- .../order-doc-filter-description.adoc | 11 + preview/HEAD.yml | 2 +- 7 files changed, 568 insertions(+), 25 deletions(-) create mode 100644 modules/search/partials/order-doc-filter-description.adoc diff --git a/modules/search/examples/simple-search-index-payload.jsonc b/modules/search/examples/simple-search-index-payload.jsonc index aa5037fb2..6f3213d5f 100644 --- a/modules/search/examples/simple-search-index-payload.jsonc +++ b/modules/search/examples/simple-search-index-payload.jsonc @@ -20,8 +20,78 @@ "doc_config": { "docid_prefix_delim": "", "docid_regexp": "", - "mode": "scope.collection.type_field", - "type_field": "type" + "mode": "scope.collection.custom", + "type_field": "type", + // tag::doc_filter[] + "doc_filter": { + // tag::boolean_filter[] + "free_breakfast_true": { + "bool": true, + "field": "free_breakfast", + "order": 1 + }, + // end::boolean_filter[] + // tag::date_range_filter[] + "review_date_range": { + "start": "2015-01-01", + "end": "2019-01-01", + "inclusive_end": true, + "inclusive_start": false, + "field": "reviews.date", + "order": 2, + "datetime_parser": "My_Date_Time_Parser" + }, + // end::date_range_filter[] + // tag::numeric_range_filter[] + "cleanliness_range": { + "min": 3, + "max": 5, + "inclusive_min": true, + "inclusive_max": true, + "field": "reviews.ratings.Cleanliness", + "order": 3 + }, + // end::numeric_range_filter[] + // tag::conjunct_filter[] + "free_parking_AND_vacancy": { + "conjuncts": [ + { + "bool": true, + "field": "vacancy" + }, + { + "bool": true, + "field": "free_parking" + } + ], + "order": 4 + }, + // end::conjunct_filter[] + // tag::disjunct_filter[] + "location_OR_service": { + "disjuncts": [ + { + "min": 5, + "field": "reviews.ratings.Service" + }, + { + "min": 5, + "field": "reviews.ratings.Location" + } + ], + "order": 6 + }, + // end::disjunct_filter[] + // tag::term_filter[] + "name_hotel": { + "term": "Hotel", + "order": 5, + "field": "name" + } + // end::term_filter[] + + } + // end::doc_filter[] }, // end::doc_config[] // tag::mapping[] @@ -178,6 +248,26 @@ "type": "text" } ] + }, + "inventory.hotel.free_breakfast_true": { + "dynamic": true, + "enabled": true, + "properties": { + "free_breakfast": { + "dynamic": false, + "enabled": true, + "fields": [ + { + "docvalues": true, + "include_in_all": true, + "index": true, + "name": "free_breakfast", + "store": true, + "type": "boolean" + } + ] + } + } } } } diff --git a/modules/search/pages/create-type-mapping.adoc b/modules/search/pages/create-type-mapping.adoc index 20a04a46b..0b63efed5 100644 --- a/modules/search/pages/create-type-mapping.adoc +++ b/modules/search/pages/create-type-mapping.adoc @@ -55,6 +55,14 @@ To add an entire collection as a new type mapping: . xref:type-mapping-options.adoc#collection[Configure your type mapping options]. . Click btn:[Add To Index]. +[#filter-mapping] +==== Add a Document Filter to a Collection Type Mapping + +You can add a xref:customize-index.adoc#type-identifiers[document filter] to any collection type mapping on your Search index. +A document filter adds or removes documents from a collection type mapping in your Search index. + +To add a document filter to a mapping, see xref:set-type-identifier.adoc[]. + [#xattrs] === Add an XATTRs Mapping diff --git a/modules/search/pages/customize-index.adoc b/modules/search/pages/customize-index.adoc index 659733056..7a71304dd 100644 --- a/modules/search/pages/customize-index.adoc +++ b/modules/search/pages/customize-index.adoc @@ -53,20 +53,27 @@ In Advanced Mode, you can also choose and configure an additional document filte * *JSON Type Field*: Selects only documents that contain a specific field with a specified string value. * *Doc ID up to Separator*: Selects only documents with an ID or key up to a specific substring. * *Doc ID with Regex*: Selects only documents with an ID or key that matches a regular expression. +* [.status]#Couchbase Server 8.0# *Custom*: As of Couchbase Server version 8.0, custom document filters select only documents that match a custom filter, based on the values of specific fields. -For more information about how to configure a document filter, see xref:set-type-identifier.adoc[]. +Document filters add a more granular filter to the documents in a collection <>. +If a collection mapping has a document filter, only documents that pass the filter can be included in the Search index under that collection. + +For more information about how to create a document filter, see xref:set-type-identifier.adoc[]. [#type-mappings] == Type Mappings and Mappings Use a type mapping to include or exclude specific documents in a collection from an index. -Type mappings can also set a field's data type and other settings. +Type mappings can also set a document field's data type and other settings. Type mappings start at the collection level. Create additional mappings for document fields or JSON objects under a collection's type mapping to restrict the documents added to your index. This can improve Search index performance over indexing entire collections. +For a type mapping defined on a scope and collection, you can create an additional <> to restrict the documents added under that type mapping. +Only documents from your specified scope and collection that also pass the document filter can be included in your Search index, and potentially returned in search results. + If your operational cluster is running Couchbase Server version 7.6.2 and later, you can also choose to include document metadata inside your Search index by creating an XATTRs mapping. For more information about how to configure settings for the different types of mappings and type mappings, see xref:type-mapping-options.adoc[]. diff --git a/modules/search/pages/search-index-params.adoc b/modules/search/pages/search-index-params.adoc index 86decc5ac..6f41d9422 100644 --- a/modules/search/pages/search-index-params.adoc +++ b/modules/search/pages/search-index-params.adoc @@ -191,13 +191,15 @@ The `doc_config` object is a child object of the <>. It contains the fo |mode |String |Yes a| -Set a xref:customize-index.adoc#type-identifiers[type identifier] for the Search index to filter documents from search results: +Set a xref:customize-index.adoc#type-identifiers[type identifier] for the Search index to filter documents. +Set the mode for your type identifier by setting this property to `"scope.collection.\{mode\}"` +You can choose from one of the following mode values: * `type_field`: Use the value from a specific field in the documents. * `docid_prefix_delim`: Use the leading characters in the documents' ID values, up to but not including a specified separator. * `docid_regexp`: Use a regular expression on the documents' ID values. - -NOTE: If you want your Search index to only include documents from a specific collection, the `mode` value must be `"scope.collection.\{mode\}"`. +* `custom`: Use a custom document filter expression to filter documents based on specific values. +See <>. |docid_prefix_delim |String |Yes a| @@ -205,18 +207,396 @@ If `mode` is `docid_prefix_delim`, set the separator character to use on a docum For example, to filter documents based on the characters before a `\_` in their ID values, set `docid_prefix_delim` to `_`. +To use this filter later, you need to modify the name of the type mapping where you want to use the filter. + +For example, you could set a specific filter value of `hotel` on a type mapping. +If `docid_prefix_delim` is set to `\_`, a document would have to have the string `hotel` before the character `_` in its ID value to pass the filter. +To use the filter, set the <> name to `\{scope\}.\{collection\}.hotel`. +If the document passes the filter, it's included in the type mapping, and your Search index. + |docid_regexp |String |Yes a| If `mode` is `docid_regexp`, set the regular expression to use on a document's ID value to determine its type. For example, to filter documents that contain the characters `\_40` in their ID value, set `docid_regexp` to `_[3-5]0`. +To use this filter later, you need to modify the name of the type mapping where you want to use the filter. + +For example, you could set a specific filter value of `_40` on a type mapping. +A document with the characters `_40` in its ID value would pass the filter. +To use the filter, set the <> name to `\{scope\}.\{collection\}._40`. +If the document passes the filter, it's included in the type mapping, and your Search index. + |type_field |String |Yes a| If `mode` is `type_field`, set the name of the field to use to filter documents. For example, to filter documents based on the value of their `type` field, set `type_field` to `type`. +To use this filter later, you need to modify the name of the type mapping where you want to use the filter. + +For example, you could use a field called `type` as your `type_field`. +To use the filter, set your <> name to `\{scope\}.\{collection\}.landmark`. +With `type` as the `type_field` and `landmark` as the configured filter, a document would have to have `landmark` in its `type` field to pass the filter. + +|[[doc_filter]]doc_filter |Object |Yes a| + +[.status]#Couchbase Server 8.0# + +If `mode` is `custom`, provide an object that sets a custom document filter for a scope and collection in your Search index. + +You can filter documents with custom filters based on the value of: + +* <>. +* <>. +* <>. +* <>. +* A <> or <> object that combines 2 or more of the available filters. +You can add up to a maximum of 100 document filters on a single Search index. + +For more information about how to define each type of filter in your Search index definition, see <>. + +|==== + +[#doc_filter_obj] +==== Doc_filter Object + +[.status]#Couchbase Server 8.0# + +The `doc_filter` object contains JSON objects for each document filter you want to apply to a type mapping in your Search index: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=doc_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +You can add up to a maximum of 100 document filters on a single Search index. + +You can define the following types of document filters: + +* <> +* <> +* <> +* <> +* <> +* <> + +[#boolean_filter] +===== Boolean Document Filters + +[.status]#Couchbase Server 8.0# + +A boolean document filter adds or removes documents from a type mapping based on the value of a boolean field: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=boolean_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +Set the name of your boolean document filter object to the name you want for your filter. +Use this name to use the filter on a <>. +For example, `\{scope\}.\{collection\}.free_breakfast_true`. + +A boolean document filter can have the following properties: + +[cols="2,1,1,4"] +|==== +|Property |Type |Required? |Description + +|bool |Boolean |Yes a| + +Set `bool` to the value a document must have in your chosen boolean field for a document to pass the filter. + +`bool` can be `true` or `false`. + +|field |String |Yes a| + +Enter the name of the field that contains a boolean value you want to use as a filter. + +|order |Number |Yes a| + +include::partial$order-doc-filter-description.adoc[] + +|==== + +[#date_range_filter] +===== Date Range Document Filters + +[.status]#Couchbase Server 8.0# + +A date range document filter adds or removes documents from a type mapping based on the value of a date field and a specified range: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=date_range_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +Set the name of your date range document filter object to the name you want for your filter. +Use this name to use the filter on a <>. +For example, `\{scope\}.\{collection\}.review_date_range`. + +A date range document filter can have the following properties: + +[cols="2,1,1,4"] +|==== +|Property |Type |Required? |Description + +|start |Date and Time String |No a| + +Set the start date for the range you want to use as a filter. +Dates occurring before your `start` value do not pass the filter. + +You can choose to set only a `start` value or only an `end` value for the filter. + +By default, the value for `start` is included in your date range filter. + +|end |Date and Time String |No a| + +Set the end date for the range you want to use as a filter. +Dates occurring after your `end` value do not pass the filter. + +You can choose to set only a `start` value or only an `end` value for the filter. + +By default, the value for `end` is excluded from your date range filter. + +|inclusive_start |Boolean |No a| + +Set whether the value of `start` should be included or excluded from the range: + +* If `inclusive_start` is `true`, documents with the same date and time string as `start` pass the filter. +* If `inclusive_start` is `false`, documents must have a date and time string that's later than the value of `start` to pass the filter. +If you do not set a value for `inclusive_start`, by default, `start` is inclusive to your date range. + +|inclusive_end |Boolean |No a| + +Set whether the value of `end` should be included or excluded from the range: + +* If `inclusive_end` is `true`, documents with the same date and time string as `end` pass the filter. +* If `inclusive_end` is `false`, documents must have a date and time string that's earlier than the value of `end` to pass the filter. +If you do not set a value for `inclusive_end`, by default, `end` is not included in your date range. + +|field |String |Yes a| + +Enter the name of the field that contains a date value you want to use as a filter. + +|order |Number |Yes a| + +include::partial$order-doc-filter-description.adoc[] + +|datetime_parser |String |No a| + +Enter the name of the date/time parser you want to use to interpret your date and time strings. + +You can use a xref:default-date-time-parsers-reference.adoc[default date/time parser] or reference a date/time parser from the <>. + +|==== + +[#numeric_range_filter] +===== Numeric Range Document Filters + +[.status]#Couchbase Server 8.0# + +A numeric range document filter adds or removes documents from a type mapping based on the value of a numeric field and a specified range: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=numeric_range_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +Set the name of your numeric range document filter object to the name you want for your filter. +Use this name to use the filter on a <>. +For example, `\{scope\}.\{collection\}.cleanliness_range`. + +A numeric range document filter can have the following properties: + +[cols="2,1,1,4"] +|==== +|Property |Type |Required? |Description + +|min |Number |No a| + +Set the minimum value for the range you want to use as a filter. +Values smaller than your `min` value do not pass the filter. + +You can choose to set only a `min` value or only a `max` value for the filter. + +By default, the value for `min` is included in your numeric range filter. + +|max |Number |No a| + +Set the maximum value for the range you want to use as a filter. +Values larger than your `max` value do not pass the filter. + +You can choose to set only a `min` value or only a `max` value for the filter. + +By default, the value for `max` is excluded from your numeric range filter. + +|inclusive_min |Boolean |No a| + +Set whether the value of `min` should be included or excluded from the range: + +* If `inclusive_min` is `true`, documents with the same value as `min` pass the filter. +* If `inclusive_min` is `false`, documents must have a value that's larger than the value of `min` to pass the filter. +If you do not set a value for `inclusive_min`, by default, `min` is inclusive to your numeric range. + +|inclusive_max |Boolean |No a| + +Set whether the value of `max` should be included or excluded from the range: + +* If `inclusive_max` is `true`, documents with the same value as `max` pass the filter. +* If `inclusive_max` is `false`, documents must have a value that's smaller than the value of `max` to pass the filter. +If you do not set a value for `inclusive_max`, by default, `max` is not included in your numeric range. + +|field |String |Yes a| + +Enter the name of the field that contains a numeric value you want to use as a filter. + +|order |Number |Yes a| + +include::partial$order-doc-filter-description.adoc[] + +|==== + +[#term_filter] +===== Term Document Filters + +[.status]#Couchbase Server 8.0# + +A term document filter adds or removes documents from a type mapping based on the existence of a term in a specified document field: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=term_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +Set the name of your term document filter object to the name you want for your filter. +Use this name to use the filter on a <>. +For example, `\{scope\}.\{collection\}.name_hotel`. + +A term document filter can have the following properties: + +[cols="2,1,1,4"] +|==== +|Property |Type |Required? |Description + +|term |String |Yes a| + +Enter a string that must exist inside `field` for a document to pass the filter. + +The string must be an exact match for a document to pass. + +|field |String |Yes a| + +Enter the name of the field where you want to search for the value of `term`. + +|order |Number |Yes a| + +include::partial$order-doc-filter-description.adoc[] + +|==== + +[#conjunct_filter] +===== Conjunct Document Filter + +[.status]#Couchbase Server 8.0# + +A conjunct document filter can contain any number of the other document filter types: + +* <> +* <> +* <> +* <> +* <> +* <> +A document must pass every filter inside the `conjuncts` array to pass a conjunct document filter and be included in a type mapping: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=conjunct_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +Set the name of your conjunct document filter object to the name you want for your filter. +Use this name to use the filter on a <>. +For example, `\{scope\}.\{collection\}.free_parking_AND_vacancy`. + +A conjunct document filter can have the following properties: + +[cols="2,1,1,4"] +|==== +|Property |Type |Required? |Description + +|conjuncts |Array of Objects |Yes a| + +Add an object to define each filter you want a document to pass before a document can be included in a type mapping. + +The `conjuncts` array can contain any other document filter type, including additional conjunct and disjunct document filters. +You cannot nest more than 5 conjunct or disjunct document filters inside a single filter. + +|order |Number |Yes a| + +include::partial$order-doc-filter-description.adoc[] + +|==== + +[#disjunct_filter] +===== Disjunct Document Filter + +[.status]#Couchbase Server 8.0# + +A disjunct document filter can contain any number of the other document filter types: + +* <> +* <> +* <> +* <> +* <> +* <> +A document must pass at least the number of filters you specify as `min` from the `disjuncts` array to pass the filter and be included in a type mapping: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=disjunct_filter] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +Set the name of your disjunct document filter object to the name you want for your filter. +Use this name to use the filter on a <>. +For example, `\{scope\}.\{collection\}.location_OR_service`. + +A disjunct document filter can have the following properties: + +[cols="2,1,1,4"] +|==== +|Property |Type |Required? |Description + +|disjuncts |Array of Objects |Yes a| + +Add an object to define each filter you want to run against a document for this disjunct document filter. + +The `disjuncts` array can contain any other document filter type, including additional conjunct and disjunct document filters. +You cannot nest more than 5 conjunct or disjunct document filters inside a single filter. + +|min |Number |Yes a| + +Set `min` to the minimum number of filters from `disjuncts` that a document must pass to be included in a type mapping. + +|order |Number |Yes a| + +include::partial$order-doc-filter-description.adoc[] + |==== [#mapping] diff --git a/modules/search/pages/set-type-identifier.adoc b/modules/search/pages/set-type-identifier.adoc index e2e7c182e..b9b9732a0 100644 --- a/modules/search/pages/set-type-identifier.adoc +++ b/modules/search/pages/set-type-identifier.adoc @@ -8,6 +8,20 @@ [abstract] {description} +For example, if you added a filter to your type mapping that checked if the value of a field was `true`, only documents with the value `true` for that field would be included in your Search index under that type mapping. +Based on your settings, xref:create-type-mapping.adoc#field[child fields] or xref:create-type-mapping.adoc#object[child mappings] that you define for documents that pass the filter on this type mapping will be returned in search results. + +You can filter based on the value of a field, or part of the value of your document IDs. + +As of Couchbase Server version 8.0, you can filter documents with custom filters based on the value of: + +* xref:search-index-params.adoc#boolean_filter[A boolean field]. +* xref:search-index-params.adoc#date_range_filter[A date field, within a specific range]. +* xref:search-index-params.adoc#numeric_range_filter[A numeric field, within a specific range]. +* xref:search-index-params.adoc#term_filter[A term in a text field]. +* A xref:search-index-params.adoc#conjunct_filter[conjunct] or xref:search-index-params.adoc#disjunct_filter[disjunct] object that combines 2 or more of the available filters. +You can add up to a maximum of 100 custom document filters on a single Search index. + For more information about document filters and type mappings, see xref:customize-index.adoc#type-identifiers[Search Index Features]. == Prerequisites @@ -20,8 +34,8 @@ For more information, see xref:cloud:clusters:data-service/manage-buckets.adoc[] * You have started to create or already created an index in xref:create-search-indexes.adoc#advanced-mode[Advanced Mode Editing]. -* You have created at least one type mapping in your Search index. -For more information, see xref:create-search-index-ui.adoc[]. +* You have created at least 1 type mapping in your Search index. +For more information, see xref:create-type-mapping.adoc[]. * You have logged in to the Couchbase {page-ui-name}. @@ -31,15 +45,19 @@ To set a document filter for a Search index with the {page-ui-name}: . On the *Operational Clusters* page, select the operational cluster where you want to work with the Search Service. . Go to menu:Data Tools[Search]. -. Do one of the following: +. Do 1 of the following: .. To work with an existing Search index, click the name of the index where you want to create a document filter. .. To create a new Search index, click btn:[Create Search Index]. . Make sure to select *Enable Advanced Options*. . Expand *Global Index Settings*. -. Do one of the following: +. Do 1 of the following: .. <> .. <> .. <> +.. <> + +WARNING: You cannot use custom document filters with another type of type identifier on your Search index. +If you select an option other than *Custom* after you have defined custom document filters, you'll lose any defined custom filters on your Search index. [#json-type] === Create a JSON Type Field Document Filter @@ -51,12 +69,11 @@ To only add documents to your Search index that contain a specific field with a + For example, if your documents include a `type` field, you could enter `type` in the *JSON Type Field* field. + -NOTE: You cannot use a field as a document filter if the field name contains a period (.). -. Under *Type Mappings*, next to the type mapping where you want to add the document filter, go to menu:More Options (⋮)[Edit]. -. In the *Name* field, add a period (.) to the end of the current type mapping name. -. After the period, add the exact string from the document field that you want to use as a filter. +NOTE: You cannot use a field as a document filter if the field name contains a period (.). +. Under *Type Mappings*, next to the type mapping where you want to add the document filter, click btn:[Edit]. +. In the *Enter Document Filter* field, enter the exact string from the document field that you want to use as a filter. + -For example, if you wanted your Search index to only return documents that had a `type` value of `hotel`, you could enter `hotel`. +For example, if you wanted your type mapping to only include documents that had a value of `hotel` in the `type` field, you could enter `hotel` in the filter field. . Click btn:[Submit]. . Click btn:[Update Index]. @@ -69,11 +86,10 @@ To only add documents to your Search index that have IDs that match a specified . In the *Doc ID up to Separator* field, enter the separator character from the ID prefix in your document ID values. + For example, if you know all of your document ID values are prefixed by a string and an underscore (\_), enter `_`. -. Under *Type Mappings*, next to the type mapping where you want to add the document filter, go to menu:More Options (⋮)[Edit]. -. In the *Name* field, add a period (.) to the end of the current type mapping name. -. After the period, add the exact prefix from the document's ID value that you want to use as a filter. +. Under *Type Mappings*, next to the type mapping where you want to add the document filter, click btn:[Edit]. +. In the *Enter Document Filter* field, enter the exact prefix from the document's ID value that you want to use as a filter. + -For example, if you wanted your Search index to only return documents that have an prefix of `landmark_`, you could enter `landmark`. +For example, if you wanted your type mapping to only include documents that have an prefix of `landmark_` in their ID values, you could enter `landmark` in the filter field. . Click btn:[Submit]. . Click btn:[Update Index]. @@ -86,11 +102,42 @@ To only add documents to your Search index that have IDs that match a specified . In the *Doc ID with Regex* field, enter the regular expression that you want to use to filter documents in your Search index. + For example, if you wanted documents with ID values that contained `\_40`, you could enter `_[3-5]0` as your regular expression. -. Under *Type Mappings*, next to the type mapping where you want to add the document filter, go to menu:More Options (⋮)[Edit]. -. In the *Name* field, add a period (.) to the end of the current type mapping name. -. After the period, add a match for the regular expression from the document's ID value that you want to use as a filter. +. Under *Type Mappings*, next to the type mapping where you want to add the document filter, click btn:[Edit]. +. In the *Enter Document Filter* field, enter a match for the regular expression from the document's ID value that you want to use as a filter. ++ +For example, if you wanted your type mapping to only include documents with ID values that contained `_40`, you could enter `_40` in the filter field. +. Click btn:[Submit]. +. Click btn:[Update Index]. + +[#custom] +=== Create a Custom Document Filter + +[.status]#Couchbase Server 8.0# + +To create a new custom document filter on a Search index with the Couchbase {page-ui-name}: + +. Under *Choose Document Filter*, click btn:[Custom]. +. Click btn:[Add Document Filter]. +. In the *Label* field, enter a name for your new document filter. +. In the *Filter* code editor, enter a JSON object to define your document filter. ++ +For more information about the properties for each document filter type, see: ++ +* xref:search-index-params.adoc#boolean_filter[Boolean Document Filters] +* xref:search-index-params.adoc#date_range_filter[Date Range Document Filters] +* xref:search-index-params.adoc#numeric_range_filter[Numeric Range Document Filters] +* xref:search-index-params.adoc#term_filter[Term Document Filters] +* xref:search-index-params.adoc#conjunct_filter[Conjunct Document Filters] +* xref:search-index-params.adoc#disjunct_filter[Disjunct Document Filters] + ++ +TIP: Do not add the name of your document filter to your filter definition when defining a custom document filter through the {page-ui-name}. +Define the document filter as an unnamed object with the specific properties you need for your document filter type. + + -For example, if you wanted your Search index to only return documents with ID values that contained `_40`, you could enter `_40`. +. Click btn:[Save]. +. Under *Type Mappings*, next to the type mapping where you want to add the document filter, click btn:[Edit]. +. In the *Select Document Filter* list, select the name of the custom document filter that you want to use to filter documents on this type mapping. . Click btn:[Submit]. . Click btn:[Update Index]. diff --git a/modules/search/partials/order-doc-filter-description.adoc b/modules/search/partials/order-doc-filter-description.adoc new file mode 100644 index 000000000..3eb9cd3ec --- /dev/null +++ b/modules/search/partials/order-doc-filter-description.adoc @@ -0,0 +1,11 @@ +Set the filtering order for this document filter, compared to the other document filters in use on the Search index. + +The Search Service applies document filters on type mappings in the order you specify. +For example, if a document does not pass a type mapping filter where `"order": 1`, the Search Service checks the document against the filter with `"order": 2`. + +The Search Service continues checking documents against any filters defined on type mappings in your Search index until a document passes a filter, or there are no more defined type mapping filters. + +If a document does not pass any defined filters, it's not included in your Search index. + +TIP: If you're defining a document filter inside a `conjuncts` or `disjuncts` array, you do not need to include the `order` property for each filter object. +Add the `order` property to the `conjuncts` or `disjuncts` filter object, instead. \ No newline at end of file diff --git a/preview/HEAD.yml b/preview/HEAD.yml index 76edc982a..8d2d1d2da 100644 --- a/preview/HEAD.yml +++ b/preview/HEAD.yml @@ -3,4 +3,4 @@ sources: branches: [8-0-docs-uptake] override: site: - startPage: cloud:get-started:intro.adoc + startPage: cloud:get-started:intro.adoc \ No newline at end of file From b15413aadb78eebbfd4c993d1bfa0f5193e9982c Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Mon, 8 Sep 2025 16:04:53 -0400 Subject: [PATCH 04/80] [AV-104691] 8.0 on Capella - FTS Synonyms Support (#394) * [AV-104691] First draft of synonym sources documentation for Capella * [AV-104690] Add HEAD.yml for previews * [AV-104691] Update to remove inconsistencies in procedure for add-synonym-source * [AV-104691] Change highlight style in synonym search example query to better show in Capella * [AV-104691] Fix typos * Update modules/search/pages/run-searches.adoc Co-authored-by: Daniel Nicholson <6208288+dgnicholson@users.noreply.github.com> * Update modules/search/pages/synonyms/add-synonym-source.adoc Co-authored-by: Daniel Nicholson <6208288+dgnicholson@users.noreply.github.com> * Update modules/search/pages/synonyms/create-synonym-collection-docs.adoc Co-authored-by: Daniel Nicholson <6208288+dgnicholson@users.noreply.github.com> --------- Co-authored-by: Daniel Nicholson <6208288+dgnicholson@users.noreply.github.com> --- .../simple-search-index-payload.jsonc | 15 +- .../synonyms/bidirectional-synonym.jsonc | 12 ++ .../synonyms/synonym-document-cheap.json | 10 ++ .../synonyms/synonym-document-comfy.json | 10 ++ .../examples/synonyms/synonym-index.json | 112 +++++++++++++++ .../synonyms/synonym-query-example.json | 16 +++ .../synonyms/unidirectional-synonym.jsonc | 14 ++ .../search/pages/create-custom-analyzer.adoc | 1 + .../pages/create-custom-character-filter.adoc | 1 + .../pages/create-custom-date-time-parser.adoc | 1 + .../pages/create-custom-token-filter.adoc | 1 + .../search/pages/create-custom-tokenizer.adoc | 1 + .../search/pages/create-search-indexes.adoc | 1 + modules/search/pages/customize-index.adoc | 15 ++ modules/search/pages/run-searches.adoc | 3 + modules/search/pages/search-index-params.adoc | 128 +++++++++++++++++- modules/search/pages/search.adoc | 3 + modules/search/pages/set-type-identifier.adoc | 1 + .../pages/synonyms/add-synonym-source.adoc | 91 +++++++++++++ .../create-synonym-collection-docs.adoc | 91 +++++++++++++ .../pages/synonyms/synonyms-search.adoc | 78 +++++++++++ .../search/pages/type-mapping-options.adoc | 13 ++ modules/search/partials/nav.adoc | 3 + 23 files changed, 618 insertions(+), 3 deletions(-) create mode 100644 modules/search/examples/synonyms/bidirectional-synonym.jsonc create mode 100644 modules/search/examples/synonyms/synonym-document-cheap.json create mode 100644 modules/search/examples/synonyms/synonym-document-comfy.json create mode 100644 modules/search/examples/synonyms/synonym-index.json create mode 100644 modules/search/examples/synonyms/synonym-query-example.json create mode 100644 modules/search/examples/synonyms/unidirectional-synonym.jsonc create mode 100644 modules/search/pages/synonyms/add-synonym-source.adoc create mode 100644 modules/search/pages/synonyms/create-synonym-collection-docs.adoc create mode 100644 modules/search/pages/synonyms/synonyms-search.adoc diff --git a/modules/search/examples/simple-search-index-payload.jsonc b/modules/search/examples/simple-search-index-payload.jsonc index 6f3213d5f..180f5aa77 100644 --- a/modules/search/examples/simple-search-index-payload.jsonc +++ b/modules/search/examples/simple-search-index-payload.jsonc @@ -146,7 +146,6 @@ // end::tokenizers[] // tag::token_filters[] "token_filters": { - // end::mapping[] // tag::token_filter_name[] "My_Token_Filter": { "min": 3, @@ -180,8 +179,18 @@ ] } // end::date_time_parser_name[] - } + }, // end::date_time_parsers[] + // tag::synonym_sources[] + "synonym_sources": { + // tag::synonym_name[] + "synonyms_en": { + "analyzer": "My_Analyzer", + "collection": "synonyms_en" + } + // end::synonym_name[] + } + // end::synonym_sources[] }, "default_analyzer": "standard", "default_datetime_parser": "dateTimeOptional", @@ -199,6 +208,7 @@ "type_field": "_type", // tag::types[] "types": { + // end::mapping[] // tag::scope_collection[] "inventory.hotel": { "dynamic": false, @@ -225,6 +235,7 @@ "index": true, "name": "content", "store": true, + "synonym_source": "synonyms_en", "type": "text", "analyzer": "My_Analyzer" } diff --git a/modules/search/examples/synonyms/bidirectional-synonym.jsonc b/modules/search/examples/synonyms/bidirectional-synonym.jsonc new file mode 100644 index 000000000..be35ad38e --- /dev/null +++ b/modules/search/examples/synonyms/bidirectional-synonym.jsonc @@ -0,0 +1,12 @@ +{ + "synonyms": [ + "cheerful", + "content", + "delighted", + "elated", + "glad", + "happy", + "joyful", + "pleased" + ] +} \ No newline at end of file diff --git a/modules/search/examples/synonyms/synonym-document-cheap.json b/modules/search/examples/synonyms/synonym-document-cheap.json new file mode 100644 index 000000000..4034894f7 --- /dev/null +++ b/modules/search/examples/synonyms/synonym-document-cheap.json @@ -0,0 +1,10 @@ +{ + "synonyms": [ + "cheap", + "inexpensive", + "affordable", + "budget-friendly", + "low-cost", + "economical" + ] +} \ No newline at end of file diff --git a/modules/search/examples/synonyms/synonym-document-comfy.json b/modules/search/examples/synonyms/synonym-document-comfy.json new file mode 100644 index 000000000..0f62ff649 --- /dev/null +++ b/modules/search/examples/synonyms/synonym-document-comfy.json @@ -0,0 +1,10 @@ +{ + "synonyms": [ + "comfortable", + "cozy", + "relaxing", + "snug", + "pleasant", + "restful" + ] +} \ No newline at end of file diff --git a/modules/search/examples/synonyms/synonym-index.json b/modules/search/examples/synonyms/synonym-index.json new file mode 100644 index 000000000..251b14a0e --- /dev/null +++ b/modules/search/examples/synonyms/synonym-index.json @@ -0,0 +1,112 @@ +{ + "type": "fulltext-index", + "name": "travel-sample.inventory.travel-sample-index", + "uuid": "519b7bfa6d2bdeea", + "sourceType": "gocbcore", + "sourceName": "travel-sample", + "sourceUUID": "aa069135219cb1d45923b36ca8239e28", + "planParams": { + "maxPartitionsPerPIndex": 128, + "indexPartitions": 1 + }, + "params": { + "doc_config": { + "docid_prefix_delim": "", + "docid_regexp": "", + "mode": "scope.collection.type_field", + "type_field": "type" + }, + "mapping": { + "analysis": { + "synonym_sources": { + "synonyms_en": { + "analyzer": "en", + "collection": "synonyms" + } + } + }, + "default_analyzer": "en", + "default_datetime_parser": "dateTimeOptional", + "default_field": "_all", + "default_mapping": { + "dynamic": true, + "enabled": false + }, + "default_type": "_default", + "docvalues_dynamic": false, + "index_dynamic": true, + "scoring_model": "tfidf", + "store_dynamic": false, + "type_field": "_type", + "types": { + "inventory.hotel": { + "dynamic": false, + "enabled": true, + "properties": { + "description": { + "dynamic": false, + "enabled": true, + "fields": [ + { + "analyzer": "en", + "docvalues": true, + "include_in_all": true, + "include_term_vectors": true, + "index": true, + "name": "description", + "store": true, + "synonym_source": "synonyms_en", + "type": "text" + } + ] + }, + "name": { + "dynamic": false, + "enabled": true, + "fields": [ + { + "docvalues": true, + "include_in_all": true, + "include_term_vectors": true, + "index": true, + "name": "name", + "store": true, + "type": "text" + } + ] + }, + "reviews": { + "default_analyzer": "en", + "dynamic": false, + "enabled": true, + "properties": { + "content": { + "dynamic": false, + "enabled": true, + "fields": [ + { + "analyzer": "en", + "docvalues": true, + "include_in_all": true, + "include_term_vectors": true, + "index": true, + "name": "content", + "store": true, + "synonym_source": "synonyms_en", + "type": "text" + } + ] + } + } + } + } + } + } + }, + "store": { + "indexType": "scorch", + "segmentVersion": 16 + } + }, + "sourceParams": {} +} \ No newline at end of file diff --git a/modules/search/examples/synonyms/synonym-query-example.json b/modules/search/examples/synonyms/synonym-query-example.json new file mode 100644 index 000000000..b866d0614 --- /dev/null +++ b/modules/search/examples/synonyms/synonym-query-example.json @@ -0,0 +1,16 @@ +{ + "explain": true, + "fields": [ + "*" + ], + "highlight": { + "style": "html" + }, + "query": { + "match": "cheap comfortable", + "operator": "and", + "field": "description" + }, + "size": 40, + "from": 0 +} \ No newline at end of file diff --git a/modules/search/examples/synonyms/unidirectional-synonym.jsonc b/modules/search/examples/synonyms/unidirectional-synonym.jsonc new file mode 100644 index 000000000..4055c990f --- /dev/null +++ b/modules/search/examples/synonyms/unidirectional-synonym.jsonc @@ -0,0 +1,14 @@ +{ + "input": [ + "happy", + "joyful", + "cheerful" + ], + "synonyms": [ + "content", + "delighted", + "elated", + "glad", + "pleased" + ] +} \ No newline at end of file diff --git a/modules/search/pages/create-custom-analyzer.adoc b/modules/search/pages/create-custom-analyzer.adoc index 7a722da84..65eed8405 100644 --- a/modules/search/pages/create-custom-analyzer.adoc +++ b/modules/search/pages/create-custom-analyzer.adoc @@ -96,5 +96,6 @@ To continue customizing your Search index, you can also: * xref:create-custom-character-filter.adoc[] * xref:create-custom-tokenizer.adoc[] * xref:create-custom-token-filter.adoc[] +* xref:synonyms/synonyms-search.adoc[] To run a search and test the contents of your Search index, see xref:simple-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/create-custom-character-filter.adoc b/modules/search/pages/create-custom-character-filter.adoc index 99b3378e8..5e2e27b67 100644 --- a/modules/search/pages/create-custom-character-filter.adoc +++ b/modules/search/pages/create-custom-character-filter.adoc @@ -53,5 +53,6 @@ To continue customizing your Search index, you can also: * xref:set-type-identifier.adoc[] * xref:create-custom-tokenizer.adoc[] * xref:create-custom-token-filter.adoc[] +* xref:synonyms/synonyms-search.adoc[] To run a search and test the contents of your Search index, see xref:simple-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/create-custom-date-time-parser.adoc b/modules/search/pages/create-custom-date-time-parser.adoc index bae4ead58..a70d39038 100644 --- a/modules/search/pages/create-custom-date-time-parser.adoc +++ b/modules/search/pages/create-custom-date-time-parser.adoc @@ -48,5 +48,6 @@ To continue customizing your Search index, you can also: * xref:create-custom-character-filter.adoc[] * xref:create-custom-tokenizer.adoc[] * xref:create-custom-token-filter.adoc[] +* xref:synonyms/synonyms-search.adoc[] To run a search and test the contents of your Search index, see xref:simple-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/create-custom-token-filter.adoc b/modules/search/pages/create-custom-token-filter.adoc index 9ac387a68..9135dc130 100644 --- a/modules/search/pages/create-custom-token-filter.adoc +++ b/modules/search/pages/create-custom-token-filter.adoc @@ -235,5 +235,6 @@ To continue customizing your Search index, you can also: * xref:create-custom-analyzer.adoc[] * xref:create-custom-character-filter.adoc[] * xref:create-custom-tokenizer.adoc[] +* xref:synonyms/synonyms-search.adoc[] To run a search and test the contents of your Search index, see xref:simple-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/create-custom-tokenizer.adoc b/modules/search/pages/create-custom-tokenizer.adoc index 0c56b11ff..d56708dc2 100644 --- a/modules/search/pages/create-custom-tokenizer.adoc +++ b/modules/search/pages/create-custom-tokenizer.adoc @@ -84,5 +84,6 @@ To continue customizing your Search index, you can also: * xref:set-type-identifier.adoc[] * xref:create-custom-character-filter.adoc[] * xref:create-custom-token-filter.adoc[] +* xref:synonyms/synonyms-search.adoc[] To run a search and test the contents of your Search index, see xref:simple-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/create-search-indexes.adoc b/modules/search/pages/create-search-indexes.adoc index d596e9b36..b4413a5ac 100644 --- a/modules/search/pages/create-search-indexes.adoc +++ b/modules/search/pages/create-search-indexes.adoc @@ -43,6 +43,7 @@ If you select *Enable Advanced Options* to enable Advanced Mode in the Search in * Creating xref:customize-index.adoc#type-mappings[mappings] for Extended Attributes (XATTRs) data in documents * Creating xref:customize-index.adoc#type-mappings[mappings] for objects and fields that do not yet exist in your document schema * Configuring a xref:customize-index.adoc#type-identifiers[document filter] +* As of Couchbase Server version 8.0, configuring a xref:synonyms/synonyms-search.adoc[synonym source] All initial editing options remain available in Advanced Mode editing. diff --git a/modules/search/pages/customize-index.adoc b/modules/search/pages/customize-index.adoc index 7a71304dd..e5b2fe5e1 100644 --- a/modules/search/pages/customize-index.adoc +++ b/modules/search/pages/customize-index.adoc @@ -15,6 +15,7 @@ You can add the following components and configure the following options for a S * <> * <> * <> +* <> * <> * <> @@ -100,6 +101,19 @@ For example, you could create a static type mapping to only include the contents Configure this type of mapping by selecting a field in your document schema in the Search index editor when you xref:create-type-mapping.adoc[]. +[#synonyms] +== Synonym Sources + +[.status]#Couchbase Server 8.0# + +As of Couchbase Server version 8.0 and later, you can add a Synonym Source to a Search index to use synonym searches on text fields. + +After you xref:synonyms/create-synonym-collection-docs.adoc[create a synonym collection and synonym documents], and xref:synonyms/add-synonym-source.adoc[add a synonym source], you can run a search for a term and return results that include terms with similar meanings. + +For example, you could run a search for `happy` and get results for `joyful`, `cheerful`, or `delighted`. + +For more information about synonym search for the Search Service, see xref:synonyms/synonyms-search.adoc[]. + [#replica] == Replica and Partition Settings @@ -204,5 +218,6 @@ For more information about how to create your own word list, see xref:create-cus * xref:create-custom-character-filter.adoc[] * xref:create-custom-tokenizer.adoc[] * xref:create-custom-token-filter.adoc[] +* xref:synonyms/synonyms-search.adoc[] * xref:run-searches.adoc[] * xref:index-aliases.adoc[] \ No newline at end of file diff --git a/modules/search/pages/run-searches.adoc b/modules/search/pages/run-searches.adoc index 117a14886..2efa18a3f 100644 --- a/modules/search/pages/run-searches.adoc +++ b/modules/search/pages/run-searches.adoc @@ -50,6 +50,9 @@ TIP: When running a hybrid Search query, you should add a `boost` value to your Otherwise, you might see unexpected search results. This is because of the differences in the scoring algorithms between the 2 query types. +Scoring can also change based on whether you're using synonyms in your Search index. +For more information, see xref:synonyms/synonyms-search.adoc#run-synonym-search[Running a Search for Synonyms]. + [#ui] == Run a Search with the {page-ui-name} diff --git a/modules/search/pages/search-index-params.adoc b/modules/search/pages/search-index-params.adoc index 6f41d9422..2573d902b 100644 --- a/modules/search/pages/search-index-params.adoc +++ b/modules/search/pages/search-index-params.adoc @@ -628,6 +628,7 @@ An object that contains the following child objects: * <> * <> * <> +* <> |default_analyzer |String |Yes a| @@ -655,6 +656,16 @@ This type mapping is included for compatibility only. For more information about the properties inside the `default_mapping` object, see <>. +|default_synonym_source |String |No a| + +[.status]#Couchbase Server 8.0# + +The name of the default synonym source to use for the Search index. + +The value of `default_synonym_source` must match a defined <> in your Search index definition. + +For more information about using synonyms with the Search Service, see xref:synonyms/synonyms-search.adoc[]. + |default_type |String |No |This setting is included for compatibility with earlier indexes only. |docvalues_dynamic |Boolean |Yes a| @@ -1234,6 +1245,79 @@ Use a layout from the https://pkg.go.dev/time#pkg-constants[Go Programming Langu |==== +[#synonym_sources] +== Synonym_sources Object + +[.status]#Couchbase Server 8.0# + +The `synonym_sources` object contains any synonym collections defined for a Search index: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=synonym_sources] +---- + +TIP: To view the entire JSON payload, click btn:[View]. + +For more information about synonym searches, see xref:synonyms/synonyms-search.adoc[]. + +The `synonym_sources` object is a child object of the <>. +It contains any number of <>: + +[cols="2,1,1,2"] +|==== +|Property |Type |Required? |Description + +|\{synonym_collection_name\} |Object |Yes a| + +Set the name of this object to the name you want to use to identify your synonym collection in your Search index. + +Reference the `\{synonym_collection_name\}` object in a text field definition to use synonym searches with that text field. + +For more information about the properties in an `\{synonym_collection_name\}` object, see <>. + +|==== + +[#synonym_name] +=== \{synonym_collection_name\} Object + +[.status]#Couchbase Server 8.0# + +The `\{synonym_collection_name\}` object defines a synonym collection on a Search index: + +[source,json] +---- +include::example$simple-search-index-payload.jsonc[tag=synonym_name] +---- + +For more information about synonym searches, see xref:synonyms/synonyms-search.adoc[]. + +A `\{synonym_collection_name\}` object is a child object of the <>. +It contains the following properties: + +[cols="1,1,1,2"] +|==== +|Property |Type |Required? |Description + +|analyzer |String |Yes a| + +Enter the name of the analyzer to use for the synonym documents stored in this collection. + +Set the analyzer for a synonym collection to the same analyzer you set in the <> for a text field. +You cannot use synonym searches on a field unless the <> is set and the analyzers match. + +|collection |String |Yes a| + +Enter the name of the collection where your synonym documents are stored on your cluster. +The synonym collection must be in the same bucket and scope as where you want to define your Search index. + +Synonym documents must have the proper syntax to be used by the Search Service. +For more information, see xref:synonyms/create-synonym-collection-docs.adoc[]. + +Do not add your synonym collections as a <> in your Search index. + +|==== + [#default-mapping] == Default_mapping Object @@ -1348,8 +1432,10 @@ For more information, see xref:clusters:data-service/manage-documents.adoc[]. |dynamic |Boolean |Yes a| To index all fields under the specified scope and collection, JSON object, or all fields inside XATTRs, set `dynamic` to `true`. +This creates a xref:customize-index.adoc#dynamic[dynamic type mapping]. -To only index the fields you specify and enable the `properties` block, set `dynamic` to `false`. +To only index the fields you specify and enable the `properties` block, set `dynamic` to `false`. +This creates a xref:customize-index.adoc#static[static type mapping]. |enabled |Boolean |Yes a| @@ -1357,6 +1443,33 @@ To enable the mapping and include any documents that match it in the Search inde To remove any documents that match this mapping from the Search index, set `enabled` to `false`. + +|default_analyzer |String |No a| + +The name of the default analyzer to use for any text field defined under this type mapping. + +If the type mapping is dynamic, this analyzer applies to every text field for documents that match the type mapping. + +If the type mapping is static, this analyzer only applies to the text fields you add in the `properties` object that do not have a defined analyzer. + +The value of `default_analyzer` must match a defined <> in your Search index definition, or xref:default-analyzers-reference.adoc[a default analyzer]. + +For more information about analyzers, see xref:customize-index.adoc#analyzers[Analyzers]. + +|default_synonym_source |String |No a| + +[.status]#Couchbase Server 8.0# + +The name of the default synonym source to use for any text fields defined under this type mapping. + +If the type mapping is dynamic, this synonym source applies to every text field for documents that match the type mapping. + +If the type mapping is static, this synonym source only applies to the text fields you add in the `properties` object that do not have a defined synonym source. + +The value of `default_synonym_source` must match a defined <> in your Search index definition. + +For more information about using synonyms with the Search Service, see xref:synonyms/synonyms-search.adoc[]. + |[[properties]]properties |Object |No a| The `properties` object is only enabled if `dynamic` is set to `false`. @@ -1476,6 +1589,19 @@ To include the content of the document field in the Search index and allow its c To exclude the content of the document field from the index, set `store` to `false`. +|[[synonym_source_field]]synonym_source |String |No a| + +[.status]#Couchbase Server 8.0# + +Enter the name of the <> you want to use for synonym searches on this field. +The Search Service uses any synonym documents stored in this synonym collection for synonym searches on this field. + +You can only use synonym searches on a field with a `type` of `text`. + +The `analyzer` set on this field must match the `analyzer` set on the \{synonym_collection_name\} object. + +For more information about synonym searches, see xref:synonyms/synonyms-search.adoc[]. + |type |String |Yes a| The document field's type. Can be one of: diff --git a/modules/search/pages/search.adoc b/modules/search/pages/search.adoc index e34de3785..5dea1e42f 100644 --- a/modules/search/pages/search.adoc +++ b/modules/search/pages/search.adoc @@ -42,6 +42,9 @@ You can create a Search index: //* With the Couchbase SDKs //* xref:create-search-index-rest-api.adoc[From the REST API] +As of Couchbase Server version 8.0, you can also add synonym collections to your cluster and Search index to run synonym searches on text fields. +For more information about synonym searches, see xref:synonyms/synonyms-search.adoc[]. + [#queries] == Search Queries diff --git a/modules/search/pages/set-type-identifier.adoc b/modules/search/pages/set-type-identifier.adoc index b9b9732a0..0a940bc48 100644 --- a/modules/search/pages/set-type-identifier.adoc +++ b/modules/search/pages/set-type-identifier.adoc @@ -149,5 +149,6 @@ After you set the document filter for your Search index, you can continue to cus * xref:create-custom-character-filter.adoc[] * xref:create-custom-token-filter.adoc[] * xref:create-custom-tokenizer.adoc[] +* xref:synonyms/synonyms-search.adoc[] To run a search and test the contents of your Search index, see xref:simple-search-ui.adoc[]. diff --git a/modules/search/pages/synonyms/add-synonym-source.adoc b/modules/search/pages/synonyms/add-synonym-source.adoc new file mode 100644 index 000000000..a306757bb --- /dev/null +++ b/modules/search/pages/synonyms/add-synonym-source.adoc @@ -0,0 +1,91 @@ += Add a Synonym Source +:page-topic-type: guide +:page-status: Couchbase Server 8.0 +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: Add a Synonym Source to set the collection where your synonym documents are stored. + +[abstract] +{description} +After you have set the synonym source for your Search index and any child fields, you can run any type of text-based Search query to return results with synonyms. + +For more information about synonym searches with the Search Service, see xref:synonyms/synonyms-search.adoc[]. + +== Prerequisites + +* You have the Search Service enabled on a node in your operational cluster. +For more information about how to change Services on your operational cluster, see xref:cloud:clusters:modify-database.adoc[]. + +* You have created an index. +For more information, see xref:create-search-index-ui.adoc[]. + +* You have created a type mapping. +For more information about how to create a type mapping on an index, see xref:create-type-mapping.adoc[]. + +* You have created a text child field where you want to run synonym searches. +For more information about how to create a child field on an index, see xref:create-child-field.adoc[]. + +* You have logged in to the Couchbase {page-ui-name}. + +== Procedure + +To add a synonym source to a Search index with the {page-ui-name} in Advanced Mode: + +. On the *Operational Clusters* page, select the operational cluster where you want to work with the Search Service. +. Go to menu:Data Tools[Search]. +. Click the name of the index where you want to add synonym support. +. Make sure to select *Enable Advanced Options*. +. Click btn:[+ Add Synonym Source]. +. In the *Name* field, enter a name for your new synonym source. +For example, you could call the source for a collection of English synonyms `synonyms_en`. +. In the *Collection* list, select the collection where you stored your synonym documents for this specific synonym source. +. In the *Analyzer* list, select the appropriate analyzer to use with your synonyms. +Choose the same analyzer as the text fields where you want to use synonym searches. ++ +For more information about how to set the analyzer for a child field, see xref:type-mapping-options.adoc#field[Field Type Mapping Options]. +. Click btn:[Save]. +. Under *Configured Type Mappings*, next to the child field where you want to use your new synonym source, click btn:[Edit]. +. In the *Synonym Source* list, select the synonym source you added in the previous step. +. Click btn:[Save]. +. To finish editing your index, click btn:[Update Index]. + +== Example: Search Index Definition with Synonyms + +For example, the following index definition defines a Search index using the `travel-sample` sample dataset. +It uses non-default scopes and collections to index the `name`, `description`, and `reviews.content` fields from the `inventory.hotel` collection. + +It uses synonyms from the `synonyms_en` synonym source for the `description` and `reviews.content` fields: + +[source,json] +---- +include::example$synonyms/synonym-index.json[] +---- + +TIP: To use this index definition on your own cluster, remove the `uuid` parameter and replace the `sourceUUID` parameter with the appropriate UUID for your own `travel-sample` bucket. +For more information about how to import a Search index definition, see xref:search:import-search-index.adoc[]. + +For this example, the `synonyms` collection inside the `travel-sample` bucket has the following 2 synonym documents: + +[source,json] +---- +include::example$synonyms/synonym-document-cheap.json[] +---- + +[source,json] +---- +include::example$synonyms/synonym-document-comfy.json[] +---- + +With the defined synonym documents and Search index definition, you could run the following Search query with the {page-ui-name}: + +[source,json] +---- +include::example$synonyms/synonym-query-example.json[] +---- + +The query would return results for hotels that include both `cheap` and `comfortable`, or 1 of their defined synonyms, like `affordable` in the `description` field. +Results could include `hotel_18843` and `hotel_27821`. + +== Next Steps + +For more information about other features you can add to your Search index, see xref:customize-index.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/synonyms/create-synonym-collection-docs.adoc b/modules/search/pages/synonyms/create-synonym-collection-docs.adoc new file mode 100644 index 000000000..52e26550c --- /dev/null +++ b/modules/search/pages/synonyms/create-synonym-collection-docs.adoc @@ -0,0 +1,91 @@ += Create a Synonym Collection and Documents +:page-topic-type: guide +:page-status: Couchbase Server 8.0 +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: Create a synonym collection and documents to define synonym mappings for search terms in a Search index. +:page-toclevels: 3 + +[abstract] +{description} + +== Prerequisites + +* Your user account has the xref:projects:project-roles.adoc#project-owner-role[`Project Owner`] or xref:projects:project-roles.adoc#project-cluster-manager-role[`Cluster Manager`] role for the project that contains your cluster. + +* You have created a bucket and scope where you want to store your Search index and its synonym collections. +For more information, see xref:clusters:data-service/manage-buckets.adoc[] and xref:clusters:data-service/scopes-collections.adoc[]. + +== Procedure + +To define the synonym mappings for a Search index, you must: + +. <> +. <> + +[#create-collection] +=== Create a Synonym Collection + +You can create a synonym collection like any other collection in {page-product-name}. +Create synonym collections to divide your synonyms based on language or other sorting criteria. + +NOTE: You must create your synonym collections in the same bucket and scope where you want to create your Search index. + +For more information about how to create a new collection, see xref:clusters:data-service/scopes-collections.adoc#create-collection[Create a Collection]. + +[#create-documents] +=== Create Synonym Documents + +You can create the following types of synonym documents for use with the Search Service: + +* <> +* <> + +[#uni] +==== Create a Unidirectional Synonym Document + +Unidirectional synonym documents define a one-way synonym relationship. + +A unidirectional synonym document contains an `input` array and a `synonyms` array. +Any search for a term in `input` can return any term in `synonyms`. + +For example, a unidirectional synonym document for synonyms of the terms `happy`, `joyful`, and `cheerful` can be defined as: + +[source,json] +---- +include::example$synonyms/unidirectional-synonym.jsonc[] +---- + +A search for `happy` could return results for `content`, `delighted`, `elated`, `glad`, or `pleased`. +A search for `cheerful` would not return results for `happy`. + +NOTE: You can only include a single `input` and `synonyms` array per unidirectional synonym document. + +To insert a new document into your cluster with a command line tool or SDK, see xref:guides:creating-data.adoc[]. + +To import multiple documents into your cluster at one time with the Couchbase {page-ui-name}, command line tools, or an SDK, see xref:guides:load.adoc[]. + +[#bi] +==== Create a Bidirectional Synonym Document + +Bidirectional synonym documents define a two-way synonym relationship. +All terms are contained in a single `synonyms` array. +Any search for a term in the `synonyms` array can return any other term in the array. + +For example, a bidirectional synonym document for synonyms of the word `happy` could be defined as: + +[source,json] +---- +include::example$synonyms/bidirectional-synonym.jsonc[] +---- + +A search for `cheerful`, `happy`, or 1 of the other terms in the array could return results for any other term. + +NOTE: You can only include a single `synonyms` array per bidirectional synonym document. + +To insert a new document into your cluster with a command line tool or SDK, see xref:guides:creating-data.adoc[]. + +To import multiple documents into your cluster at one time with the Couchbase {page-ui-name}, command line tools, or an SDK, see xref:guides:load.adoc[]. + +== Next Steps +To use your defined synonyms in a Search index, see xref:synonyms/add-synonym-source.adoc[]. \ No newline at end of file diff --git a/modules/search/pages/synonyms/synonyms-search.adoc b/modules/search/pages/synonyms/synonyms-search.adoc new file mode 100644 index 000000000..e55b50e7f --- /dev/null +++ b/modules/search/pages/synonyms/synonyms-search.adoc @@ -0,0 +1,78 @@ += Add Synonyms to a Search Index +:page-topic-type: concept +:page-status: Couchbase Server 8.0 +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: Add synonyms to a Search index to return matches for words with similar meanings when running a Search with the Search Service. +:stem: +:page-partial: + +[abstract] +{description} +A synonym is a word or phrase that has an exact or near similar definition to another word or phrase in the same language. + +As of Couchbase Server version 8.0 and later, the Search Service supports a user-defined thesaurus on each Search index. +A thesaurus is divided into synonym collections that contain synonym documents. +You can use a thesaurus to define what words function as synonyms inside your documents. + +For example, you could create a synonym document that defines `cat` as a synonym for `feline`. +A Search query that contains the term `cat` would also return matches for `feline`. +Based on your specific synonym document configuration, a Search query for `feline` could also return results for `cat`. + +== Defining Synonyms + +You can define synonyms for multiple languages in a single thesaurus, divided by synonym collections. +For example, you could have a separate synonym collection for English words, Spanish words, and German words. + +If your Search index is partitioned, the Search Service distributes synonym collections across your index partitions. +The synonym collections are gathered together to create a single thesaurus, which the Search Service uses in Search queries. + +NOTE: To use synonyms in a Search index, your synonym documents and collections must not be included as fields in your Search index definition. +Synonym documents and indexed fields in a Search index must use the same analyzer to return the correct matches in search results. +Synonym documents also must follow the correct syntax. + +For more information, see xref:synonyms/create-synonym-collection-docs.adoc[]. + +[#run-synonym-search] +== Running a Search for Synonyms + +Synonym searches do not run recursively. +If you run a Search query for a single term, the Search Service will not run cascading searches for synonyms of that term's synonyms. + +For example, if you defined `fast` with the synonyms `quick` and `swift`, a search for `fast` returns results for `quick` and `swift`. +It does not return results for synonyms of `quick` or `swift`, like `speedy` or `rapid`. + +Exact matches to Search query terms will always score higher than synonym term matches. +For fuzzy queries specifically: + +* Exact term matches have a full score of stem:[x] +* Synonyms for the exact term have a score of stem:[x/2] +* Fuzzy match terms have the score stem:[x * (1/(1+fuzz\i\n\ess))] +* Synonyms of a fuzzy term have the score stem:[x/2 * (1/(1+fuzz\i\n\ess))] + +You cannot use synonyms in a xref:vector-search:vector-search.adoc[Vector Search] query. +Any synonyms in a Search index do not affect or contribute to the results of a Vector Search query. +Synonyms cannot be used in xref:vector-search:pre-filtering-vector-search.adoc[pre-filtered Vector Search queries]. + +You can return results from a synonym search when running a Search query through {sqlpp}. +For example, if a Search index had a defined thesaurus with entries for `quality`, the following search would return any documents that contain the word `quality` or its synonyms: + +[source, sqlpp] +---- +select meta().id from `travel-sample`.`inventory`.`landmark` as t WHERE SEARCH(t, "quality"); +---- + +=== Synonym Search Processing + +If you run a hybrid Search query, the Search Service executes your Vector Search query and accumulates synonyms before combining the results. +For more information about the process for scoring results with the Search Service, see xref:run-searches.adoc#scoring[Scoring for Search Queries]. + +For xref:search-request-params.adoc#fuzziness[fuzzy queries], xref:search-request-params.adoc#prefix[prefix queries], and xref:search-request-params.adoc#wildcard[wildcard queries], the Search Service: + +. Collects synonyms to form the thesaurus +. Generates the terms to search for in your Search index by consulting the appropriate dictionary +. Runs the search + +== See Also +* xref:synonyms/create-synonym-collection-docs.adoc[] +* xref:synonyms/add-synonym-source.adoc[] \ No newline at end of file diff --git a/modules/search/pages/type-mapping-options.adoc b/modules/search/pages/type-mapping-options.adoc index d7f64f11f..5dff2a213 100644 --- a/modules/search/pages/type-mapping-options.adoc +++ b/modules/search/pages/type-mapping-options.adoc @@ -209,6 +209,19 @@ In the previous version of the Search Service UI, this option was named *Analyze In Advanced Mode, it was named *Default Analyzer*. +|Synonym Source (Text Fields Only) a| + +[.status]#Couchbase Server 8.0# + +Choose a synonym source to use for synonym searches on text in this field. + +Adding a synonym source supports running a search for a single term, and returning matches for other terms that share a similar meaning. +You can define your own thesaurus for synonym relationships across terms, using synonym documents. + +For more information about how to create synonym documents, see xref:synonyms/create-synonym-collection-docs.adoc[]. + +For more information about how to add a new synonym source for your text field type mappings, see xref:synonyms/add-synonym-source.adoc[]. + |[[dimension]]Dimension (Vector Fields Only) a| include::partial$vector-search-field-descriptions.adoc[tag=dimension] diff --git a/modules/search/partials/nav.adoc b/modules/search/partials/nav.adoc index 8bc7ab468..c781a9059 100644 --- a/modules/search/partials/nav.adoc +++ b/modules/search/partials/nav.adoc @@ -16,6 +16,9 @@ ***** xref:cloud:search:default-wordlists-reference.adoc[] **** xref:cloud:search:create-custom-date-time-parser.adoc[] ***** xref:cloud:search:default-date-time-parsers-reference.adoc[] + **** xref:cloud:search:synonyms/synonyms-search.adoc[] + ***** xref:cloud:search:synonyms/create-synonym-collection-docs.adoc[] + ***** xref:cloud:search:synonyms/add-synonym-source.adoc[] *** xref:cloud:search:import-search-index.adoc[] *** xref:cloud:search:search-index-params.adoc[] ** xref:cloud:search:run-searches.adoc[] From 253d1e7d49427679aa5a4522a84983424352a548 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Tue, 20 Aug 2024 20:14:51 +0100 Subject: [PATCH 05/80] DOC-12443: Reorganize GSI documents (#261) * Move pages to Indexes * Move diagrams to Indexes * Move examples to Indexes * Move images to Indexes * Move indexes concept doc back to docs-server * Remove unused image files * Update page aliases * Update links to GSI pages * Update coordinates of example files * Update GSI image coordinates * Update GSI diagram coordinates * Driveby fix unsupported icons * Minor changes to indexing overview and content order * Move covering indexes, group agg pushdown * Update links to covering indexes, grouping and agg pushdown * Driveby fix broken link --- modules/guides/pages/create-index.adoc | 14 +- modules/guides/pages/defer-index.adoc | 2 +- modules/guides/pages/drop-index.adoc | 2 +- modules/guides/pages/index-advisor.adoc | 2 +- modules/guides/pages/place-index.adoc | 8 +- modules/guides/pages/select-index.adoc | 2 +- .../examples}/create-idx-array.n1ql | 0 .../examples}/create-idx-composite.n1ql | 0 .../examples}/create-idx-expr.n1ql | 0 .../examples}/create-idx-partial.n1ql | 0 .../examples}/early-filter-1.jsonc | 0 .../examples}/early-filter-1.n1ql | 0 .../examples}/early-filter-2.jsonc | 0 .../examples}/early-filter-2.n1ql | 0 .../examples}/early-filter-3.jsonc | 0 .../examples}/early-filter-3.n1ql | 0 .../examples}/early-filter-4.jsonc | 0 .../examples}/early-filter-4.n1ql | 0 .../examples}/early-filter-idx.n1ql | 0 .../examples}/early-paginate-1.jsonc | 0 .../examples}/early-paginate-1.n1ql | 0 .../examples}/early-paginate-2.jsonc | 0 .../examples}/early-paginate-2.n1ql | 0 .../examples}/early-paginate-3.jsonc | 0 .../examples}/early-paginate-3.n1ql | 0 .../examples}/early-paginate-4.jsonc | 0 .../examples}/early-paginate-4.n1ql | 0 .../examples}/early-paginate-idx.n1ql | 0 .../examples}/pushdown-comp-explain.jsonc | 0 .../examples}/pushdown-comp-plan.jsonc | 0 .../examples}/pushdown-count.jsonc | 0 .../examples}/pushdown-def-city.n1ql | 0 .../examples}/pushdown-distinct.jsonc | 0 .../examples}/pushdown-idx-1.jsonc | 0 .../examples}/pushdown-idx-2.jsonc | 0 .../examples}/pushdown-idx-3.jsonc | 0 .../examples}/pushdown-max.jsonc | 0 .../examples}/pushdown-min.jsonc | 0 .../examples}/pushdown-page-1.jsonc | 0 .../examples}/pushdown-page-2.jsonc | 0 .../examples}/pushdown-page-3.jsonc | 0 .../examples}/pushdown-simple.jsonc | 0 .../examples}/pushdown-skip.jsonc | 0 .../examples}/replication-nodes.n1ql | 0 .../examples}/replication-num.n1ql | 0 .../images/GBAP_Ex0_QP_after55.png | Bin .../images/GBAP_Ex0_QP_before55.png | Bin .../images/GBAP_Ex10_VP.png | Bin .../images/GBAP_Ex2A_EP.png | Bin .../images/GBAP_Ex4A_VP.png | Bin .../images/GBAP_ExB_Plan.png | Bin .../images/GBAP_ExC_Plan.png | Bin .../images/GBAP_ExD2_Plan.png | Bin .../images/GBAP_ExD_Plan.png | Bin .../images/GBAP_ExE_Plan.png | Bin .../images}/IndexKeyOrder.png | Bin .../images}/index-lifecycle-build.png | Bin .../images}/index-lifecycle-scan.png | Bin .../images}/index-lifecycle-update-1.png | Bin .../images}/index-lifecycle-update-2.png | Bin .../pages}/covering-indexes.adoc | 16 +- .../pages}/early-filters-and-pagination.adoc | 63 ++--- .../pages}/groupby-aggregate-performance.adoc | 16 +- .../pages}/index-lifecycle.adoc | 13 +- .../pages}/index-replication.adoc | 6 +- .../pages}/index-scans.adoc | 4 +- .../pages}/index_pushdowns.adoc | 81 +++--- .../pages}/indexing-and-query-perf.adoc | 14 +- .../pages/indexing-overview.adoc} | 24 +- .../pages}/query-without-index.adoc | 1 + .../pages}/storage-modes.adoc | 4 +- .../partials/diagrams/query-execution.puml | 0 .../partials/diagrams/query-service.puml | 0 .../indexes/query_execution.png | Bin 49742 -> 0 bytes .../indexes/query_service.svg | 250 ------------------ .../indexes/.indexes.adoc | 40 --- .../pages/n1ql-intro/queriesandresults.adoc | 2 +- .../adaptive-indexing.adoc | 2 +- .../pages/n1ql-language-reference/advise.adoc | 2 +- .../n1ql-language-reference/aggregatefun.adoc | 2 +- .../n1ql-language-reference/createindex.adoc | 4 +- .../createprimaryindex.adoc | 2 +- .../n1ql-language-reference/flex-indexes.adoc | 4 +- .../n1ql-language-reference/groupby.adoc | 2 +- .../n1ql-language-reference/selectintro.adoc | 6 +- .../updatestatistics.adoc | 2 +- modules/n1ql/pages/query.adoc | 2 +- modules/n1ql/partials/nav.adoc | 22 +- 88 files changed, 166 insertions(+), 448 deletions(-) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/create-idx-array.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/create-idx-composite.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/create-idx-expr.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/create-idx-partial.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-1.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-1.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-2.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-2.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-3.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-3.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-4.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-4.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-filter-idx.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-1.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-1.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-2.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-2.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-3.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-3.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-4.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-4.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/early-paginate-idx.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-comp-explain.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-comp-plan.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-count.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-def-city.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-distinct.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-idx-1.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-idx-2.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-idx-3.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-max.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-min.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-page-1.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-page-2.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-page-3.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-simple.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/pushdown-skip.jsonc (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/replication-nodes.n1ql (100%) rename modules/{learn/examples/services-and-indexes/indexes => indexes/examples}/replication-num.n1ql (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_Ex0_QP_after55.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_Ex0_QP_before55.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_Ex10_VP.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_Ex2A_EP.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_Ex4A_VP.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_ExB_Plan.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_ExC_Plan.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_ExD2_Plan.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_ExD_Plan.png (100%) rename modules/{n1ql/assets => indexes}/images/GBAP_ExE_Plan.png (100%) rename modules/{learn/assets/images/services-and-indexes/indexes => indexes/images}/IndexKeyOrder.png (100%) rename modules/{learn/assets/images/services-and-indexes/indexes => indexes/images}/index-lifecycle-build.png (100%) rename modules/{learn/assets/images/services-and-indexes/indexes => indexes/images}/index-lifecycle-scan.png (100%) rename modules/{learn/assets/images/services-and-indexes/indexes => indexes/images}/index-lifecycle-update-1.png (100%) rename modules/{learn/assets/images/services-and-indexes/indexes => indexes/images}/index-lifecycle-update-2.png (100%) rename modules/{n1ql/pages/n1ql-language-reference => indexes/pages}/covering-indexes.adoc (95%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/early-filters-and-pagination.adoc (82%) rename modules/{n1ql/pages/n1ql-language-reference => indexes/pages}/groupby-aggregate-performance.adoc (98%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/index-lifecycle.adoc (85%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/index-replication.adoc (97%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/index-scans.adoc (99%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/index_pushdowns.adoc (84%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/indexing-and-query-perf.adoc (97%) rename modules/{learn/pages/services-and-indexes/indexes/global-secondary-indexes.adoc => indexes/pages/indexing-overview.adoc} (55%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/query-without-index.adoc (99%) rename modules/{learn/pages/services-and-indexes/indexes => indexes/pages}/storage-modes.adoc (93%) rename modules/{learn => indexes}/partials/diagrams/query-execution.puml (100%) rename modules/{learn => indexes}/partials/diagrams/query-service.puml (100%) delete mode 100644 modules/learn/assets/images/services-and-indexes/indexes/query_execution.png delete mode 100644 modules/learn/assets/images/services-and-indexes/indexes/query_service.svg delete mode 100644 modules/learn/pages/services-and-indexes/indexes/.indexes.adoc diff --git a/modules/guides/pages/create-index.adoc b/modules/guides/pages/create-index.adoc index 3e71edb76..531b8e248 100644 --- a/modules/guides/pages/create-index.adoc +++ b/modules/guides/pages/create-index.adoc @@ -254,7 +254,7 @@ The following query creates a secondary index on an expression using the `name` [source,sqlpp] ---- -include::learn:example$services-and-indexes/indexes/create-idx-expr.n1ql[] +include::indexes:example$create-idx-expr.n1ql[] ---- For further details and examples, refer to xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX]. @@ -384,7 +384,7 @@ include::partial$query-context.adoc[tag=step] .Query [source,sqlpp] ---- -include::learn:example$services-and-indexes/indexes/create-idx-composite.n1ql[] +include::indexes:example$create-idx-composite.n1ql[] ---- For further details and examples, refer to xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX]. @@ -507,7 +507,7 @@ include::partial$query-context.adoc[tag=step] .Query [source,sqlpp] ---- -include::server:learn:example$services-and-indexes/indexes/create-idx-array.n1ql[] +include::indexes:example$create-idx-array.n1ql[] ---- ==== @@ -528,11 +528,11 @@ include::partial$query-context.adoc[tag=step] .Query [source,sqlpp] ---- -include::server:learn:example$services-and-indexes/indexes/create-idx-partial.n1ql[] +include::indexes:example$create-idx-partial.n1ql[] ---- ==== -For further details and examples, refer to xref:n1ql:n1ql-language-reference/indexing-and-query-perf.adoc#partial-index[Partial Index]. +For further details and examples, refer to xref:indexes:indexing-and-query-perf.adoc#partial-index[Partial Index]. === Creating a Covering Index @@ -542,13 +542,13 @@ If a query uses a covering index, the query can get all the data it needs from t To create a covering index, make sure the index includes all the fields and expressions required by the query. -For further details and examples, refer to xref:n1ql:n1ql-language-reference/covering-indexes.adoc[Covering Indexes]. +For further details and examples, refer to xref:indexes:covering-indexes.adoc[Covering Indexes]. == Related Links Reference and explanation: -* xref:server:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes] +* xref:indexes:indexing-overview.adoc[] Administrator guides: diff --git a/modules/guides/pages/defer-index.adoc b/modules/guides/pages/defer-index.adoc index 0763c898a..47ba4b67c 100644 --- a/modules/guides/pages/defer-index.adoc +++ b/modules/guides/pages/defer-index.adoc @@ -302,7 +302,7 @@ For further details, refer to https://docs.couchbase.com/sdk-api/couchbase-pytho Reference and explanation: -* xref:cloud:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes] +* xref:indexes:indexing-overview.adoc[] Administrator guides: diff --git a/modules/guides/pages/drop-index.adoc b/modules/guides/pages/drop-index.adoc index 68eec898f..06f55a8ee 100644 --- a/modules/guides/pages/drop-index.adoc +++ b/modules/guides/pages/drop-index.adoc @@ -335,7 +335,7 @@ For further details, refer to https://docs.couchbase.com/sdk-api/couchbase-pytho Reference and explanation: -* xref:server:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes] +* xref:indexes:indexing-overview.adoc[] Administrator guides: diff --git a/modules/guides/pages/index-advisor.adoc b/modules/guides/pages/index-advisor.adoc index 125c4cc36..ac7cdc2f4 100644 --- a/modules/guides/pages/index-advisor.adoc +++ b/modules/guides/pages/index-advisor.adoc @@ -227,7 +227,7 @@ For more details, refer to xref:n1ql:n1ql-language-reference/advisor.adoc#adviso Reference and explanation: -* xref:server:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes] +* xref:indexes:indexing-overview.adoc[] Administrator guides: diff --git a/modules/guides/pages/place-index.adoc b/modules/guides/pages/place-index.adoc index cf5e415cb..a12d4c049 100644 --- a/modules/guides/pages/place-index.adoc +++ b/modules/guides/pages/place-index.adoc @@ -102,7 +102,7 @@ include::partial$query-context.adoc[tag=step] .Query [source,sqlpp] ---- -include::server:learn:example$services-and-indexes/indexes/replication-num.n1ql[] +include::indexes:example$replication-num.n1ql[] ---- ==== @@ -124,13 +124,13 @@ include::partial$query-context.adoc[tag=step] .Query [source,sqlpp] ---- -include::server:learn:example$services-and-indexes/indexes/replication-nodes.n1ql[] +include::indexes:example$replication-nodes.n1ql[] ---- ==== NOTE: If you specify both `num_replica` _and_ `nodes`, the number of nodes must be _one greater_ than the number of replicas. -For further details and examples, refer to xref:server:learn:services-and-indexes/indexes/index-replication.adoc#index-replication[Index Replication]. +For further details and examples, refer to xref:indexes:index-replication.adoc#index-replication[Index Replication]. == Altering Index Placement @@ -162,7 +162,7 @@ For further details and examples, refer to xref:n1ql:n1ql-language-reference/alt Reference and explanation: -* xref:server:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes] +* xref:indexes:indexing-overview.adoc[] Administrator guides: diff --git a/modules/guides/pages/select-index.adoc b/modules/guides/pages/select-index.adoc index f384af7f4..a5252fb63 100644 --- a/modules/guides/pages/select-index.adoc +++ b/modules/guides/pages/select-index.adoc @@ -81,7 +81,7 @@ For further details and examples, refer to xref:n1ql:n1ql-language-reference/key Reference and explanation: -* xref:server:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes] +* xref:indexes:indexing-overview.adoc[] * xref:n1ql:n1ql-language-reference/selectintro.adoc[SELECT] * xref:n1ql:n1ql-language-reference/optimizer-hints.adoc[Hints] diff --git a/modules/learn/examples/services-and-indexes/indexes/create-idx-array.n1ql b/modules/indexes/examples/create-idx-array.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/create-idx-array.n1ql rename to modules/indexes/examples/create-idx-array.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/create-idx-composite.n1ql b/modules/indexes/examples/create-idx-composite.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/create-idx-composite.n1ql rename to modules/indexes/examples/create-idx-composite.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/create-idx-expr.n1ql b/modules/indexes/examples/create-idx-expr.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/create-idx-expr.n1ql rename to modules/indexes/examples/create-idx-expr.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/create-idx-partial.n1ql b/modules/indexes/examples/create-idx-partial.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/create-idx-partial.n1ql rename to modules/indexes/examples/create-idx-partial.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-1.jsonc b/modules/indexes/examples/early-filter-1.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-1.jsonc rename to modules/indexes/examples/early-filter-1.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-1.n1ql b/modules/indexes/examples/early-filter-1.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-1.n1ql rename to modules/indexes/examples/early-filter-1.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-2.jsonc b/modules/indexes/examples/early-filter-2.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-2.jsonc rename to modules/indexes/examples/early-filter-2.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-2.n1ql b/modules/indexes/examples/early-filter-2.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-2.n1ql rename to modules/indexes/examples/early-filter-2.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-3.jsonc b/modules/indexes/examples/early-filter-3.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-3.jsonc rename to modules/indexes/examples/early-filter-3.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-3.n1ql b/modules/indexes/examples/early-filter-3.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-3.n1ql rename to modules/indexes/examples/early-filter-3.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-4.jsonc b/modules/indexes/examples/early-filter-4.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-4.jsonc rename to modules/indexes/examples/early-filter-4.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-4.n1ql b/modules/indexes/examples/early-filter-4.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-4.n1ql rename to modules/indexes/examples/early-filter-4.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-filter-idx.n1ql b/modules/indexes/examples/early-filter-idx.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-filter-idx.n1ql rename to modules/indexes/examples/early-filter-idx.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-1.jsonc b/modules/indexes/examples/early-paginate-1.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-1.jsonc rename to modules/indexes/examples/early-paginate-1.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-1.n1ql b/modules/indexes/examples/early-paginate-1.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-1.n1ql rename to modules/indexes/examples/early-paginate-1.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-2.jsonc b/modules/indexes/examples/early-paginate-2.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-2.jsonc rename to modules/indexes/examples/early-paginate-2.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-2.n1ql b/modules/indexes/examples/early-paginate-2.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-2.n1ql rename to modules/indexes/examples/early-paginate-2.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-3.jsonc b/modules/indexes/examples/early-paginate-3.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-3.jsonc rename to modules/indexes/examples/early-paginate-3.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-3.n1ql b/modules/indexes/examples/early-paginate-3.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-3.n1ql rename to modules/indexes/examples/early-paginate-3.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-4.jsonc b/modules/indexes/examples/early-paginate-4.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-4.jsonc rename to modules/indexes/examples/early-paginate-4.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-4.n1ql b/modules/indexes/examples/early-paginate-4.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-4.n1ql rename to modules/indexes/examples/early-paginate-4.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/early-paginate-idx.n1ql b/modules/indexes/examples/early-paginate-idx.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/early-paginate-idx.n1ql rename to modules/indexes/examples/early-paginate-idx.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-comp-explain.jsonc b/modules/indexes/examples/pushdown-comp-explain.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-comp-explain.jsonc rename to modules/indexes/examples/pushdown-comp-explain.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-comp-plan.jsonc b/modules/indexes/examples/pushdown-comp-plan.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-comp-plan.jsonc rename to modules/indexes/examples/pushdown-comp-plan.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-count.jsonc b/modules/indexes/examples/pushdown-count.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-count.jsonc rename to modules/indexes/examples/pushdown-count.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-def-city.n1ql b/modules/indexes/examples/pushdown-def-city.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-def-city.n1ql rename to modules/indexes/examples/pushdown-def-city.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-distinct.jsonc b/modules/indexes/examples/pushdown-distinct.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-distinct.jsonc rename to modules/indexes/examples/pushdown-distinct.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-idx-1.jsonc b/modules/indexes/examples/pushdown-idx-1.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-idx-1.jsonc rename to modules/indexes/examples/pushdown-idx-1.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-idx-2.jsonc b/modules/indexes/examples/pushdown-idx-2.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-idx-2.jsonc rename to modules/indexes/examples/pushdown-idx-2.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-idx-3.jsonc b/modules/indexes/examples/pushdown-idx-3.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-idx-3.jsonc rename to modules/indexes/examples/pushdown-idx-3.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-max.jsonc b/modules/indexes/examples/pushdown-max.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-max.jsonc rename to modules/indexes/examples/pushdown-max.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-min.jsonc b/modules/indexes/examples/pushdown-min.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-min.jsonc rename to modules/indexes/examples/pushdown-min.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-page-1.jsonc b/modules/indexes/examples/pushdown-page-1.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-page-1.jsonc rename to modules/indexes/examples/pushdown-page-1.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-page-2.jsonc b/modules/indexes/examples/pushdown-page-2.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-page-2.jsonc rename to modules/indexes/examples/pushdown-page-2.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-page-3.jsonc b/modules/indexes/examples/pushdown-page-3.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-page-3.jsonc rename to modules/indexes/examples/pushdown-page-3.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-simple.jsonc b/modules/indexes/examples/pushdown-simple.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-simple.jsonc rename to modules/indexes/examples/pushdown-simple.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/pushdown-skip.jsonc b/modules/indexes/examples/pushdown-skip.jsonc similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/pushdown-skip.jsonc rename to modules/indexes/examples/pushdown-skip.jsonc diff --git a/modules/learn/examples/services-and-indexes/indexes/replication-nodes.n1ql b/modules/indexes/examples/replication-nodes.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/replication-nodes.n1ql rename to modules/indexes/examples/replication-nodes.n1ql diff --git a/modules/learn/examples/services-and-indexes/indexes/replication-num.n1ql b/modules/indexes/examples/replication-num.n1ql similarity index 100% rename from modules/learn/examples/services-and-indexes/indexes/replication-num.n1ql rename to modules/indexes/examples/replication-num.n1ql diff --git a/modules/n1ql/assets/images/GBAP_Ex0_QP_after55.png b/modules/indexes/images/GBAP_Ex0_QP_after55.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_Ex0_QP_after55.png rename to modules/indexes/images/GBAP_Ex0_QP_after55.png diff --git a/modules/n1ql/assets/images/GBAP_Ex0_QP_before55.png b/modules/indexes/images/GBAP_Ex0_QP_before55.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_Ex0_QP_before55.png rename to modules/indexes/images/GBAP_Ex0_QP_before55.png diff --git a/modules/n1ql/assets/images/GBAP_Ex10_VP.png b/modules/indexes/images/GBAP_Ex10_VP.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_Ex10_VP.png rename to modules/indexes/images/GBAP_Ex10_VP.png diff --git a/modules/n1ql/assets/images/GBAP_Ex2A_EP.png b/modules/indexes/images/GBAP_Ex2A_EP.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_Ex2A_EP.png rename to modules/indexes/images/GBAP_Ex2A_EP.png diff --git a/modules/n1ql/assets/images/GBAP_Ex4A_VP.png b/modules/indexes/images/GBAP_Ex4A_VP.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_Ex4A_VP.png rename to modules/indexes/images/GBAP_Ex4A_VP.png diff --git a/modules/n1ql/assets/images/GBAP_ExB_Plan.png b/modules/indexes/images/GBAP_ExB_Plan.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_ExB_Plan.png rename to modules/indexes/images/GBAP_ExB_Plan.png diff --git a/modules/n1ql/assets/images/GBAP_ExC_Plan.png b/modules/indexes/images/GBAP_ExC_Plan.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_ExC_Plan.png rename to modules/indexes/images/GBAP_ExC_Plan.png diff --git a/modules/n1ql/assets/images/GBAP_ExD2_Plan.png b/modules/indexes/images/GBAP_ExD2_Plan.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_ExD2_Plan.png rename to modules/indexes/images/GBAP_ExD2_Plan.png diff --git a/modules/n1ql/assets/images/GBAP_ExD_Plan.png b/modules/indexes/images/GBAP_ExD_Plan.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_ExD_Plan.png rename to modules/indexes/images/GBAP_ExD_Plan.png diff --git a/modules/n1ql/assets/images/GBAP_ExE_Plan.png b/modules/indexes/images/GBAP_ExE_Plan.png similarity index 100% rename from modules/n1ql/assets/images/GBAP_ExE_Plan.png rename to modules/indexes/images/GBAP_ExE_Plan.png diff --git a/modules/learn/assets/images/services-and-indexes/indexes/IndexKeyOrder.png b/modules/indexes/images/IndexKeyOrder.png similarity index 100% rename from modules/learn/assets/images/services-and-indexes/indexes/IndexKeyOrder.png rename to modules/indexes/images/IndexKeyOrder.png diff --git a/modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-build.png b/modules/indexes/images/index-lifecycle-build.png similarity index 100% rename from modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-build.png rename to modules/indexes/images/index-lifecycle-build.png diff --git a/modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-scan.png b/modules/indexes/images/index-lifecycle-scan.png similarity index 100% rename from modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-scan.png rename to modules/indexes/images/index-lifecycle-scan.png diff --git a/modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-update-1.png b/modules/indexes/images/index-lifecycle-update-1.png similarity index 100% rename from modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-update-1.png rename to modules/indexes/images/index-lifecycle-update-1.png diff --git a/modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-update-2.png b/modules/indexes/images/index-lifecycle-update-2.png similarity index 100% rename from modules/learn/assets/images/services-and-indexes/indexes/index-lifecycle-update-2.png rename to modules/indexes/images/index-lifecycle-update-2.png diff --git a/modules/n1ql/pages/n1ql-language-reference/covering-indexes.adoc b/modules/indexes/pages/covering-indexes.adoc similarity index 95% rename from modules/n1ql/pages/n1ql-language-reference/covering-indexes.adoc rename to modules/indexes/pages/covering-indexes.adoc index 655a0cbec..92374b98d 100644 --- a/modules/n1ql/pages/n1ql-language-reference/covering-indexes.adoc +++ b/modules/indexes/pages/covering-indexes.adoc @@ -1,8 +1,8 @@ = Covering Indexes :description: When an index includes the actual values of all the fields specified in the query, the index covers the query and does not require an additional step to fetch the actual values from the data service. :page-topic-type: concept -:page-aliases: indexes:covering-indexes.adoc -:imagesdir: ../../assets/images +:page-aliases: n1ql:n1ql-language-reference/covering-indexes +:imagesdir: ../images [abstract] {description} @@ -24,7 +24,7 @@ The following diagram illustrates the query execution work flow without covering .Query execution workflow including fetch request from Data service [plantuml,n1ql-query-workflow,svg] .... -include::learn:partial$diagrams/query-execution.puml[tags=!example] +include::indexes:partial$diagrams/query-execution.puml[tags=!example] .... The following diagram illustrates the query execution work flow with covering indexes: @@ -32,7 +32,7 @@ The following diagram illustrates the query execution work flow with covering in .Query execution workflow with no fetch request from Data service [plantuml,n1ql-query-workflow-cover-idx,svg] .... -include::learn:partial$diagrams/query-execution.puml[tags=!example;!fetch] +include::indexes:partial$diagrams/query-execution.puml[tags=!example;!fetch] .... As you can see in the second diagram, a well designed query that uses a covering index avoids the additional steps to fetch the data from the data service. @@ -467,7 +467,7 @@ The query plan for the above query shows that the index covers the query. == Related Links -* xref:learn:services-and-indexes/indexes/index-scans.adoc#query-execution-details[Query Execution: Details] -* xref:learn:services-and-indexes/indexes/index_pushdowns.adoc[Index Pushdown Optimizations] -* xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[Grouping and Aggregate Pushdown] -* xref:learn:services-and-indexes/indexes/early-filters-and-pagination.adoc[Early Filters, Ordering and Pagination] +* xref:index-scans.adoc#query-execution-details[Query Execution: Details] +* xref:index_pushdowns.adoc[] +* xref:groupby-aggregate-performance.adoc[] +* xref:early-filters-and-pagination.adoc[] diff --git a/modules/learn/pages/services-and-indexes/indexes/early-filters-and-pagination.adoc b/modules/indexes/pages/early-filters-and-pagination.adoc similarity index 82% rename from modules/learn/pages/services-and-indexes/indexes/early-filters-and-pagination.adoc rename to modules/indexes/pages/early-filters-and-pagination.adoc index 4942d0312..efeecc36e 100644 --- a/modules/learn/pages/services-and-indexes/indexes/early-filters-and-pagination.adoc +++ b/modules/indexes/pages/early-filters-and-pagination.adoc @@ -1,5 +1,6 @@ = Early Filters, Order, and Pagination :page-topic-type: concept +:page-aliases: learn:services-and-indexes/indexes/early-filters-and-pagination :description: When covering indexes and index pushdowns are not available, the Query Service may use early filtering, early ordering, and early pagination to improve the query response time. [abstract] @@ -15,7 +16,7 @@ include::ROOT:partial$query-context.adoc[tag=statement] == Overview -If a query has a xref:n1ql:n1ql-language-reference/covering-indexes.adoc[covering index], and the query is on a single keyspace, then the index contains all the data needed to perform the query. +If a query has a xref:covering-indexes.adoc[covering index], and the query is on a single keyspace, then the index contains all the data needed to perform the query. The Query service does not need to fetch data from the Data service. Any filters, order, or pagination (offset and limit) are performed by the Index service. @@ -103,7 +104,7 @@ Any feature that can reduce the amount of data to be fetched will improve the qu It would obviously be inefficient to fetch an entire dataset, and then discard a large portion of it by applying filters and pagination. Couchbase Capella therefore attempts to apply filters, order, and pagination _before_ fetching data, wherever possible. -Index xref:learn:services-and-indexes/indexes/index_pushdowns.adoc[pushdowns] provide one way to reduce the amount of data to be fetched. +Index xref:index_pushdowns.adoc[pushdowns] provide one way to reduce the amount of data to be fetched. Some filters, ordering, and pagination may be pushed down to the Index service, along with grouping and aggregates. The Index service applies these operations to the result of the index scan. The Query service then only needs to fetch the remaining data. @@ -214,7 +215,7 @@ For an illustration of early filtering, consider the following index. .Index I [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-filter-idx.n1ql[] +include::example$early-filter-idx.n1ql[] ---- ==== @@ -226,7 +227,7 @@ This index contains all the data needed to perform <>; it theref .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-filter-1.n1ql[] +include::example$early-filter-1.n1ql[] ---- The query plan shows that the query is covered. @@ -234,7 +235,7 @@ In addition, the predicate `city = "Paris"` is applied as a span by the Index se [source,json] ---- -include::example$services-and-indexes/indexes/early-filter-1.jsonc[tags=extract;ellipsis] +include::example$early-filter-1.jsonc[tags=extract;ellipsis] ---- <.> The `covers` section shows that the query is covered. @@ -250,7 +251,7 @@ Now the query is no longer covered, and the Query service needs to fetch documen .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-filter-2.n1ql[] +include::example$early-filter-2.n1ql[] ---- This query does not run too slowly, since the predicate `city = "Paris"` is pushed down to the Index service. @@ -258,7 +259,7 @@ The index only returns document keys for documents matching the predicate. [source,json] ---- -include::example$services-and-indexes/indexes/early-filter-2.jsonc[tags=extract;ellipsis] +include::example$early-filter-2.jsonc[tags=extract;ellipsis] ---- <.> The `range` section shows that this predicate is pushed down to the Index service. @@ -273,7 +274,7 @@ Now let's consider the case when the filter is not on the index key exactly, but .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-filter-3.n1ql[] +include::example$early-filter-3.n1ql[] ---- In this case, the filter cannot be pushed down to the Index service. @@ -282,7 +283,7 @@ The Query service can apply the specified filter to the results of the index sca [source,json] ---- -include::example$services-and-indexes/indexes/early-filter-3.jsonc[tags=extract;ellipsis] +include::example$early-filter-3.jsonc[tags=extract;ellipsis] ---- <.> The early index filters, including all the filters that can be evaluated on the index keys. @@ -300,7 +301,7 @@ If necessary, the Query service may use a mixture of index pushdowns and early f .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-filter-4.n1ql[] +include::example$early-filter-4.n1ql[] ---- The Index service evaluates the filters used to generate the index spans first, before returning to the Query service. @@ -308,7 +309,7 @@ As a result, the early filters only contain the predicates that were not pushed [source,json] ---- -include::example$services-and-indexes/indexes/early-filter-4.jsonc[tags=extract;ellipsis] +include::example$early-filter-4.jsonc[tags=extract;ellipsis] ---- <.> The filter `name LIKE "%Paris%"` does not generate an exact index span, and needs to be evaluated as an early index filter. @@ -325,7 +326,7 @@ As an illustration, consider the following index. .Index II [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-paginate-idx.n1ql[] +include::example$early-paginate-idx.n1ql[] ---- ==== @@ -337,7 +338,7 @@ This index acts as a covering index to <>. .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-paginate-1.n1ql[] +include::example$early-paginate-1.n1ql[] ---- The `covers` section of the query plan shows that the query is covered. @@ -345,7 +346,7 @@ In addition, the ordering, offset, and limit are performed by the Index service. [source,json] ---- -include::example$services-and-indexes/indexes/early-paginate-1.jsonc[tags=extract;ellipsis] +include::example$early-paginate-1.jsonc[tags=extract;ellipsis] ---- <.> Index order performed by index operator @@ -362,14 +363,14 @@ Now the query is no longer covered. .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-paginate-2.n1ql[] +include::example$early-paginate-2.n1ql[] ---- However the query runs pretty quickly, since the ordering, offset, and limit can still be pushed down to the Index service. [source,json] ---- -include::example$services-and-indexes/indexes/early-paginate-2.jsonc[tags=extract;ellipsis] +include::example$early-paginate-2.jsonc[tags=extract;ellipsis] ---- <.> Index order pushdown @@ -385,14 +386,14 @@ However, if we change the order of the ordering terms so that they no longer mat .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-paginate-3.n1ql[] +include::example$early-paginate-3.n1ql[] ---- So in this case, early ordering, limit, and offset are done by the Query service before fetch. [source,json] ---- -include::example$services-and-indexes/indexes/early-paginate-3.jsonc[tags=extract;ellipsis] +include::example$early-paginate-3.jsonc[tags=extract;ellipsis] ---- <.> Early ordering @@ -408,14 +409,14 @@ Similarly, if we change the direction of the sort from descending to ascending, .Query [source,sqlpp] ---- -include::example$services-and-indexes/indexes/early-paginate-4.n1ql[] +include::example$early-paginate-4.n1ql[] ---- In this case also, early ordering, limit, and offset are done by the Query service before fetch. [source,json] ---- -include::example$services-and-indexes/indexes/early-paginate-4.jsonc[tags=extract;ellipsis] +include::example$early-paginate-4.jsonc[tags=extract;ellipsis] ---- <.> The `sort_terms` section uses `_index_key` expressions to sort the results using the index keys. @@ -461,10 +462,10 @@ The following table summarizes the different methods of performing filtering, or ^<>^ | Fetch required? -| icon:times-circle[red] No -| icon:check-circle[green] Yes -| icon:check-circle[green] Yes -| icon:check-circle[green] Yes +| icon:times[fw] No +| icon:check[fw] Yes +| icon:check[fw] Yes +| icon:check[fw] Yes | Filters, order, and pagination + performed: @@ -487,10 +488,10 @@ NOTE: An uncovered query may use a mixture of these methods. == Related Links -* xref:learn:services-and-indexes/indexes/index-scans.adoc#query-execution-details[Query Execution: Details] -* xref:n1ql:n1ql-language-reference/covering-indexes.adoc[Covering Indexes] -* xref:learn:services-and-indexes/indexes/index_pushdowns.adoc[Index Pushdown Optimizations] -* xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[Grouping and Aggregate Pushdown] -* xref:n1ql:n1ql-language-reference/where.adoc[WHERE Clause] -- to apply a filter -* xref:n1ql:n1ql-language-reference/orderby.adoc[ORDER BY Clause] -- to apply a sort -* xref:n1ql:n1ql-language-reference/offset.adoc[OFFSET Clause] and xref:n1ql:n1ql-language-reference/limit.adoc[LIMIT Clause] -- to apply pagination +* xref:index-scans.adoc#query-execution-details[Query Execution: Details] +* xref:covering-indexes.adoc[] +* xref:index_pushdowns.adoc[] +* xref:groupby-aggregate-performance.adoc[] +* xref:n1ql:n1ql-language-reference/where.adoc[] -- to apply a filter +* xref:n1ql:n1ql-language-reference/orderby.adoc[] -- to apply a sort +* xref:n1ql:n1ql-language-reference/offset.adoc[] and xref:n1ql:n1ql-language-reference/limit.adoc[] -- to apply pagination diff --git a/modules/n1ql/pages/n1ql-language-reference/groupby-aggregate-performance.adoc b/modules/indexes/pages/groupby-aggregate-performance.adoc similarity index 98% rename from modules/n1ql/pages/n1ql-language-reference/groupby-aggregate-performance.adoc rename to modules/indexes/pages/groupby-aggregate-performance.adoc index 4810e543a..289f5054b 100644 --- a/modules/n1ql/pages/n1ql-language-reference/groupby-aggregate-performance.adoc +++ b/modules/indexes/pages/groupby-aggregate-performance.adoc @@ -1,6 +1,7 @@ = Grouping and Aggregate Pushdowns :description: {sqlpp} Pushdowns optimize the performance of {sqlpp} queries by supporting grouping and aggregate expressions. -:imagesdir: ../../assets/images +:page-aliases: n1ql:n1ql-language-reference/groupby-aggregate-performance +:imagesdir: ../images [abstract] {description} @@ -18,9 +19,10 @@ Grouping and aggregate pushdown improves the performance of {sqlpp} queries with After the optimizer selects an index for a query block, it attempts the two optimizations below: * Pagination optimization, by pushing the OFFSET and LIMIT parameters to the index scan. -* Grouping and aggregate pushdown to the indexer (introduced in Couchbase 5.5). +* Grouping and aggregate pushdown to the indexer. -The query intelligently requests the indexer to perform grouping and aggregation in addition to range scan. +Without grouping and aggregate pushdown, if a query contained aggregation and/or grouping, the query engine would fetch all relevant data from the indexer and group the data itself, even if the query was covered by an index. +With grouping and aggregate pushdown, the query intelligently requests the indexer to perform grouping and aggregation in addition to range scan. The Indexer has been enhanced to perform grouping, COUNT(), SUM(), MIN(), MAX(), AVG(), and related operations. You do not need to make any changes to the query to use this feature, but a good index design is required to cover the query and order the keys. @@ -2625,7 +2627,7 @@ Key Position to use the Index expr or the query expr. == Related Links -* xref:learn:services-and-indexes/indexes/index-scans.adoc#query-execution-details[Query Execution: Details] -* xref:n1ql:n1ql-language-reference/covering-indexes.adoc[Covering Indexes] -* xref:learn:services-and-indexes/indexes/index_pushdowns.adoc[Index Pushdown Optimizations] -* xref:learn:services-and-indexes/indexes/early-filters-and-pagination.adoc[Early Filters, Ordering and Pagination] +* xref:index-scans.adoc#query-execution-details[Query Execution: Details] +* xref:covering-indexes.adoc[] +* xref:index_pushdowns.adoc[] +* xref:early-filters-and-pagination.adoc[] diff --git a/modules/learn/pages/services-and-indexes/indexes/index-lifecycle.adoc b/modules/indexes/pages/index-lifecycle.adoc similarity index 85% rename from modules/learn/pages/services-and-indexes/indexes/index-lifecycle.adoc rename to modules/indexes/pages/index-lifecycle.adoc index 86569a912..26f491325 100644 --- a/modules/learn/pages/services-and-indexes/indexes/index-lifecycle.adoc +++ b/modules/indexes/pages/index-lifecycle.adoc @@ -1,6 +1,7 @@ = Index Lifecycle :page-topic-type: concept -:imagesdir: ../../../assets/images +:page-aliases: learn:services-and-indexes/indexes/index-lifecycle +:imagesdir: ../images :description: An overview of the lifecycle of a Global Secondary Index, from creation and building to updates and scans. [abstract] @@ -20,7 +21,7 @@ The build phase cannot start until the creation phase is complete. During the build phase, the Index Service reads the documents from the Data Service and builds the index. -image::services-and-indexes/indexes/index-lifecycle-build.png[align=center] +image::index-lifecycle-build.png[align=center] . The projector requests a DCP stream on the specified collection. . DCP streams only the documents in the collection. @@ -37,9 +38,9 @@ For more information and examples, refer to xref:n1ql:n1ql-language-reference/cr When a Global Secondary Index has been created on a collection, the index is updated when documents within the collection are updated. -image::services-and-indexes/indexes/index-lifecycle-update-1.png[align=center] +image::index-lifecycle-update-1.png[align=center] -image::services-and-indexes/indexes/index-lifecycle-update-2.png[align=center] +image::index-lifecycle-update-2.png[align=center] . The projector keeps a _bucket-level_ DCP stream open for updates -- this limits the number of DCP connections. . When a document within the collection is updated, the projector utilizes the collection ID available with each mutation, and only evaluates the indexes defined for that collection. @@ -53,11 +54,11 @@ Refer to xref:server:learn:clusters-and-availability/intra-cluster-replication.a When a query needs to make use of a Global Secondary Index, the index is scanned. -image::services-and-indexes/indexes/index-lifecycle-scan.png[align=center] +image::index-lifecycle-scan.png[align=center] * If the index consistency is `not_bounded`, the scan proceeds without waiting for the index to be updated. * If the scan consistency is `at_plus` or `request_plus`, the scan coordinator waits for the index to be updated for that collection only, and then performs the scan. The scan coordinator does not need to wait for indexes on other collections to be updated, even if documents in other collections are being mutated. -Refer to xref:learn:services-and-indexes/indexes/index-scans.adoc[Index Scans] and xref:learn:services-and-indexes/indexes/index-replication.adoc#index-consistency[Index Consistency] for further details. \ No newline at end of file +Refer to xref:index-scans.adoc[Index Scans] and xref:index-replication.adoc#index-consistency[Index Consistency] for further details. \ No newline at end of file diff --git a/modules/learn/pages/services-and-indexes/indexes/index-replication.adoc b/modules/indexes/pages/index-replication.adoc similarity index 97% rename from modules/learn/pages/services-and-indexes/indexes/index-replication.adoc rename to modules/indexes/pages/index-replication.adoc index a46ab9c8c..3529ce58c 100644 --- a/modules/learn/pages/services-and-indexes/indexes/index-replication.adoc +++ b/modules/indexes/pages/index-replication.adoc @@ -3,7 +3,7 @@ :description: The Index Service ensures availability and performance through replication and partitioning. :page-topic-type: concept :page-partial: -:page-aliases: indexes:index-replication,indexes:performance-consistency,understanding-couchbase:services-and-indexes/indexes/index-replication +:page-aliases: learn:services-and-indexes/indexes/index-replication,indexes:performance-consistency,understanding-couchbase:services-and-indexes/indexes/index-replication :keywords: consistency, consistent // Cross-references @@ -54,7 +54,7 @@ The active index is on `node1`, and the replicas are on `node2` and `node3`: [#nodes-example2] [source,sqlpp] ---- -include::example$services-and-indexes/indexes/replication-nodes.n1ql[] +include::example$replication-nodes.n1ql[] ---- * Specifying _no_ destination nodes; but specifying instead, by means of the `WITH` clause and the `num_replica` attribute, only the _number_ of replicas required. @@ -64,7 +64,7 @@ In the following example, an index is created with two replicas, with no destina + [source,sqlpp] ---- -include::example$services-and-indexes/indexes/replication-num.n1ql[] +include::example$replication-num.n1ql[] ---- + Note that if `nodes` and `num_replica` are both specified in the `WITH` clause, the specified number of nodes must be _one greater_ than `num_replica`. diff --git a/modules/learn/pages/services-and-indexes/indexes/index-scans.adoc b/modules/indexes/pages/index-scans.adoc similarity index 99% rename from modules/learn/pages/services-and-indexes/indexes/index-scans.adoc rename to modules/indexes/pages/index-scans.adoc index 32687446b..a9230cefe 100644 --- a/modules/learn/pages/services-and-indexes/indexes/index-scans.adoc +++ b/modules/indexes/pages/index-scans.adoc @@ -1,8 +1,8 @@ = Index Scans :description: This section discusses how index spans are generated from query predicates and provides a number of examples. :page-topic-type: concept -:page-aliases: performance:index-scans -:imagesdir: ../../../assets/images +:page-aliases: learn:services-and-indexes/indexes/index-scans,performance:index-scans +:imagesdir: ../images [abstract] During query execution, when the index path is chosen, the query engine requests the scan by providing a range of values to return. diff --git a/modules/learn/pages/services-and-indexes/indexes/index_pushdowns.adoc b/modules/indexes/pages/index_pushdowns.adoc similarity index 84% rename from modules/learn/pages/services-and-indexes/indexes/index_pushdowns.adoc rename to modules/indexes/pages/index_pushdowns.adoc index 218bf6177..252b7ea6b 100644 --- a/modules/learn/pages/services-and-indexes/indexes/index_pushdowns.adoc +++ b/modules/indexes/pages/index_pushdowns.adoc @@ -1,8 +1,8 @@ = Index Pushdowns :description: Index Pushdowns are performance optimizations where the Query engine pushes more of the work down to the Indexer. -:imagesdir: ../../../assets/images +:imagesdir: ../images :page-topic-type: concept -:page-aliases: performance:index_pushdowns +:page-aliases: learn:services-and-indexes/indexes/index_pushdowns,performance:index_pushdowns [abstract] {description} @@ -60,7 +60,7 @@ LIMIT 1; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-simple.jsonc[tag=projection] +include::example$pushdown-simple.jsonc[tag=projection] ---- The query refers to fields `sourceairport` and `type`. @@ -94,21 +94,20 @@ The `span` and `range` from the EXPLAIN output of <>. .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-simple.jsonc[tag=predicate] +include::example$pushdown-simple.jsonc[tag=predicate] ---- -* Each Span defines details about one index-key summarizing corresponding predicate conditions into a range-scan lookup for the index. +* Each span defines details about one index-key summarizing corresponding predicate conditions into a range-scan lookup for the index. In this example, the predicate condition (`sourceairport = "SFO"`) translates to one span with one range that specifies both `low` and `high` values of "SFO" (to imply equals condition). -* Refer to section xref:learn:services-and-indexes/indexes/index-scans.adoc[Scans] for more information. +* Refer to section xref:index-scans.adoc[] for more information. ==== == Composite Predicate Pushdown Compound or composite predicates are those with multiple conditions on different fields of the document. -When the predicate is conjunctive with multiple AND conditions, then a single `span` with multiple `ranges` are specified in the index-scan request. -When the predicate is disjunctive, then multiple `spans` are specified. -See xref:learn:services-and-indexes/indexes/index-scans.adoc[Scans] -for more details and examples on how predicate pushdown works for various types of index-scans as well as the conjunctive predicate AND and the disjunctive predicate OR. +When the predicate is conjunctive with multiple `AND` conditions, then a single span with multiple ranges is specified in the index-scan request. +When the predicate is disjunctive, then multiple spans are specified. +See xref:index-scans.adoc[] for more details and examples on how predicate pushdown works for various types of index-scans, as well as the conjunctive predicate `AND` and the disjunctive predicate `OR`. === Index Key Order and Structure @@ -120,7 +119,7 @@ For example, consider the following hypothetical index: CREATE INDEX `idx_age_name` ON users(age, name); ---- -image::services-and-indexes/indexes/IndexKeyOrder.png[,570] +image::IndexKeyOrder.png["Order of keys in a composite index",570] Various age and name values are stored in the index in a tree-like structure, represented in simplified form in the diagram above, with all the index key values linearly sorted as ordered pairs. For instance, @@ -173,7 +172,7 @@ WHERE distance < 2000 AND sourceairport = "LAX"; -- <1> .Results [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-comp-explain.jsonc[tag=excerpt] +include::example$pushdown-comp-explain.jsonc[tag=excerpt] ---- <.> The `spans` attribute of the EXPLAIN query plan output shows that the predicate is accurately represented and pushed-down to the indexer. @@ -186,7 +185,7 @@ For example, when you xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc[enable mo [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-comp-plan.jsonc[tags=index;ellipsis;final] +include::example$pushdown-comp-plan.jsonc[tags=index;ellipsis;final] ---- ==== @@ -216,7 +215,7 @@ There is no predicate on the 2nd index-key `sourceairport`. .Results [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-skip.jsonc[tag=excerpt] +include::example$pushdown-skip.jsonc[tag=excerpt] ---- <.> The EXPLAIN query plan output shows that the predicate is pushed-down to the indexer. @@ -252,7 +251,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -266,7 +265,7 @@ OFFSET 4000 LIMIT 10000; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-page-1.jsonc[tag=excerpt] +include::example$pushdown-page-1.jsonc[tag=excerpt] ---- <1> The `IndexScan3` operator handles `limit`. @@ -296,7 +295,7 @@ OFFSET 4000 LIMIT 10000; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-page-2.jsonc[tag=excerpt] +include::example$pushdown-page-2.jsonc[tag=excerpt] ---- <1> The `PrimaryScan3` operator handles `limit`. @@ -312,7 +311,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query [source,sqlpp] @@ -327,7 +326,7 @@ OFFSET 4000 LIMIT 10000; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-page-3.jsonc[tags=index;ellipsis;order] +include::example$pushdown-page-3.jsonc[tags=index;ellipsis;order] ---- <1> The `IndexScan3` operator does not handle `offset` or `limit`. @@ -350,7 +349,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -364,7 +363,7 @@ ORDER BY city; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-idx-1.jsonc[tags=index;ellipsis;query] +include::example$pushdown-idx-1.jsonc[tags=index;ellipsis;query] // ... ---- @@ -381,7 +380,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -395,7 +394,7 @@ ORDER BY meta().id; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-idx-2.jsonc[tags=index;ellipsis;query] +include::example$pushdown-idx-2.jsonc[tags=index;ellipsis;query] ---- <1> In this example, you can see an additional ORDER operator before the final projection, because the ORDER BY field `meta().id` is different from the index order key `city`. @@ -434,7 +433,7 @@ ORDER BY city DESC; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-idx-3.jsonc[tags=index;ellipsis;query] +include::example$pushdown-idx-3.jsonc[tags=index;ellipsis;query] ---- ==== @@ -445,9 +444,10 @@ In such cases, the Query engine pushes down necessary hints or options to the In === MAX() Pushdown -This function returns the highest value of the input field based on the default collation rules. (For details, see xref:n1ql:n1ql-language-reference/datatypes.adoc[Data types] and xref:n1ql:n1ql-language-reference/comparisonops.adoc[Comparison Operators].) +This function returns the highest value of the input field based on the default collation rules. +(For details, see xref:n1ql:n1ql-language-reference/datatypes.adoc[] and xref:n1ql:n1ql-language-reference/comparisonops.adoc[].) -MAX() can be pushed to the Indexer even if the index was not created with matching index keys or sort order. +You do not need to create the index with the matching index keys sorted in descending order to push MAX() to the Indexer. .MAX of a String Field ==== @@ -457,7 +457,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -472,15 +472,16 @@ WHERE city IS NOT NULL; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-max.jsonc[tag=excerpt] +include::example$pushdown-max.jsonc[tag=excerpt] ---- ==== === MIN() Pushdown -This function returns the lowest value of the input field based on the default collation rules. (For details, see xref:n1ql:n1ql-language-reference/datatypes.adoc[Data types] and xref:n1ql:n1ql-language-reference/comparisonops.adoc[Comparison Operators].) +This function returns the lowest value of the input field based on the default collation rules. +(For details, see xref:n1ql:n1ql-language-reference/datatypes.adoc[] and xref:n1ql:n1ql-language-reference/comparisonops.adoc[].) -MIN() can be pushed to the Indexer even if the index was not created with matching index keys or sort order. +You do not need to create the index with the matching index keys sorted in ascending order to push MIN() to the Indexer. .MIN of a String Field ==== @@ -490,7 +491,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -505,7 +506,7 @@ WHERE city IS NOT NULL; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-min.jsonc[tag=excerpt] +include::example$pushdown-min.jsonc[tag=excerpt] ---- ==== @@ -522,7 +523,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -562,7 +563,7 @@ WHERE city IS NOT NULL; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-count.jsonc[tag=excerpt] +include::example$pushdown-count.jsonc[tag=excerpt] ---- <1> The index operator `IndexCountScan3` counts values so the Query Service does not need to do additional processing. @@ -581,7 +582,7 @@ This example uses the `def_inventory_landmark_city` index that comes pre-install .Index [source,sqlpp] ---- -include::example$services-and-indexes/indexes/pushdown-def-city.n1ql[] +include::example$pushdown-def-city.n1ql[] ---- .Query @@ -621,7 +622,7 @@ WHERE city IS NOT NULL; .Result [source,json] ---- -include::example$services-and-indexes/indexes/pushdown-distinct.jsonc[tag=excerpt] +include::example$pushdown-distinct.jsonc[tag=excerpt] ---- <1> The index operator `IndexCountScan3` counts distinct values so the Query Service does not need to do additional processing. @@ -629,7 +630,7 @@ include::example$services-and-indexes/indexes/pushdown-distinct.jsonc[tag=excerp == Related Links -* xref:learn:services-and-indexes/indexes/index-scans.adoc#query-execution-details[Query Execution: Details] -* xref:n1ql:n1ql-language-reference/covering-indexes.adoc[Covering Indexes] -* xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[Grouping and Aggregate Pushdown] -* xref:learn:services-and-indexes/indexes/early-filters-and-pagination.adoc[Early Filters, Ordering and Pagination] +* xref:index-scans.adoc#query-execution-details[Query Execution: Details] +* xref:covering-indexes.adoc[] +* xref:groupby-aggregate-performance.adoc[] +* xref:early-filters-and-pagination.adoc[] diff --git a/modules/learn/pages/services-and-indexes/indexes/indexing-and-query-perf.adoc b/modules/indexes/pages/indexing-and-query-perf.adoc similarity index 97% rename from modules/learn/pages/services-and-indexes/indexes/indexing-and-query-perf.adoc rename to modules/indexes/pages/indexing-and-query-perf.adoc index 1d039648e..42d3e513d 100644 --- a/modules/learn/pages/services-and-indexes/indexes/indexing-and-query-perf.adoc +++ b/modules/indexes/pages/indexing-and-query-perf.adoc @@ -2,15 +2,15 @@ :navtitle: Types of Index :description: This topic provides an overview of the types of index that you can create using the Index Service, and explains how they help to query for data efficiently and improve query performance. :page-topic-type: concept -:page-aliases: performance:indexing-and-query-perf +:page-aliases: learn:services-and-indexes/indexes/indexing-and-query-perf,performance:indexing-and-query-perf // Cross-references :install-sample-buckets: xref:clusters:data-service/import-data-documents.adoc#import-sample-data :aggregatefun: xref:n1ql:n1ql-language-reference/aggregatefun.adoc :indexing-arrays: xref:n1ql:n1ql-language-reference/indexing-arrays.adoc -:covering-indexes: xref:n1ql:n1ql-language-reference/covering-indexes.adoc +:covering-indexes: xref:covering-indexes.adoc :bucket-analyzer: xref:clusters:query-service/query-workbench.adoc#insights-sidebar -:storage-modes: xref:learn:services-and-indexes/indexes/storage-modes.adoc +:storage-modes: xref:indexes:storage-modes.adoc :additional-storage-use: xref:server:learn:data/transactions.adoc#additional-storage-use Creating the right index -- with the right keys, in the right order, and using the right expressions -- is critical to query performance in any database system. @@ -219,7 +219,7 @@ This is commonly used for performance optimization. ==== [source,sqlpp] ---- -include::example$services-and-indexes/indexes/create-idx-composite.n1ql[] +include::example$create-idx-composite.n1ql[] ---- ==== @@ -239,7 +239,7 @@ For example: ==== [source,sqlpp] ---- -include::example$services-and-indexes/indexes/create-idx-expr.n1ql[] +include::example$create-idx-expr.n1ql[] ---- ==== @@ -371,7 +371,7 @@ With a rich structure as seen in the array schedule, here's how you index a part ==== [source,sqlpp] ---- -include::example$services-and-indexes/indexes/create-idx-array.n1ql[] +include::example$create-idx-array.n1ql[] ---- ==== @@ -528,7 +528,7 @@ When you want to create an index of restaurants, you can simply add the distingu ==== [source,sqlpp] ---- -include::example$services-and-indexes/indexes/create-idx-partial.n1ql[] +include::example$create-idx-partial.n1ql[] ---- ==== diff --git a/modules/learn/pages/services-and-indexes/indexes/global-secondary-indexes.adoc b/modules/indexes/pages/indexing-overview.adoc similarity index 55% rename from modules/learn/pages/services-and-indexes/indexes/global-secondary-indexes.adoc rename to modules/indexes/pages/indexing-overview.adoc index 7e8680ab6..4071a942f 100644 --- a/modules/learn/pages/services-and-indexes/indexes/global-secondary-indexes.adoc +++ b/modules/indexes/pages/indexing-overview.adoc @@ -1,5 +1,5 @@ = Primary and Secondary Index Reference -:page-aliases: indexes:indexing-overview,understanding-couchbase:services-and-indexes/indexes/global-secondary-indexes,indexes:gsi-for-n1ql,architecture:global-secondary-indexes,architecture:gsi-versus-views,clusters:index-service/index-service.adoc +:page-aliases: learn:services-and-indexes/indexes/global-secondary-indexes,understanding-couchbase:services-and-indexes/indexes/global-secondary-indexes,indexes:gsi-for-n1ql,architecture:global-secondary-indexes,architecture:gsi-versus-views,clusters:index-service/index-service.adoc :page-role: tiles -toc :!sectids: :description: Primary Indexes and Global Secondary Indexes (GSI) support queries made by the Query Service. @@ -20,16 +20,15 @@ endif::[] [abstract] {description} -== Tuning and Query Performance +== Indexing and Query Performance -* xref:learn:services-and-indexes/indexes/query-without-index.adoc[] -* xref:learn:services-and-indexes/indexes/index-lifecycle.adoc[] -* xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc[] -* xref:n1ql:n1ql-language-reference/covering-indexes.adoc[] -* xref:learn:services-and-indexes/indexes/index-scans.adoc[] -* xref:learn:services-and-indexes/indexes/index_pushdowns.adoc[] -* xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[] -* xref:learn:services-and-indexes/indexes/early-filters-and-pagination.adoc[] +* xref:query-without-index.adoc[] +* xref:indexing-and-query-perf.adoc[] +* xref:covering-indexes.adoc[] +* xref:index-scans.adoc[] +* xref:index_pushdowns.adoc[] +* xref:groupby-aggregate-performance.adoc[] +* xref:early-filters-and-pagination.adoc[] == Index Commands @@ -43,8 +42,9 @@ endif::[] == Storage and Availability -* xref:learn:services-and-indexes/indexes/index-replication.adoc[] -* xref:learn:services-and-indexes/indexes/storage-modes.adoc[] +* xref:index-lifecycle.adoc[] +* xref:index-replication.adoc[] +* xref:storage-modes.adoc[] == Related Links diff --git a/modules/learn/pages/services-and-indexes/indexes/query-without-index.adoc b/modules/indexes/pages/query-without-index.adoc similarity index 99% rename from modules/learn/pages/services-and-indexes/indexes/query-without-index.adoc rename to modules/indexes/pages/query-without-index.adoc index ad442bd64..34bab9fc6 100644 --- a/modules/learn/pages/services-and-indexes/indexes/query-without-index.adoc +++ b/modules/indexes/pages/query-without-index.adoc @@ -1,5 +1,6 @@ = Query without Indexes :page-topic-type: concept +:page-aliases: learn:services-and-indexes/indexes/query-without-index :description: Sequential scans enable you to query a keyspace, even if the keyspace has no indexes. :authorization-overview: xref:server:learn:security/authorization-overview.adoc diff --git a/modules/learn/pages/services-and-indexes/indexes/storage-modes.adoc b/modules/indexes/pages/storage-modes.adoc similarity index 93% rename from modules/learn/pages/services-and-indexes/indexes/storage-modes.adoc rename to modules/indexes/pages/storage-modes.adoc index 78310edbd..bb196aeee 100644 --- a/modules/learn/pages/services-and-indexes/indexes/storage-modes.adoc +++ b/modules/indexes/pages/storage-modes.adoc @@ -2,7 +2,7 @@ :navtitle: Storage Settings :description: All indexes in Couchbase Capella use the Couchbase Plasma storage engine. :page-topic-type: concept -:page-aliases: indexes:storage-modes,understanding-couchbase:services-and-indexes/indexes/storage-modes,architecture:index-storage +:page-aliases: learn:services-and-indexes/indexes/storage-modes,understanding-couchbase:services-and-indexes/indexes/storage-modes,architecture:index-storage [abstract] {description} @@ -54,6 +54,8 @@ The consequent reduction in disk reads promotes the efficiency of mutation proce //// Bloom filters can be enabled or disabled by means of the Couchbase Web Console UI, or the REST API. See the information provided on establishing xref:manage:manage-settings/general-settings.adoc[General] settings for the cluster. + +// include::manage:manage-settings/general-settings.adoc[tag=bloom-filter-default] //// === In-Memory Compression diff --git a/modules/learn/partials/diagrams/query-execution.puml b/modules/indexes/partials/diagrams/query-execution.puml similarity index 100% rename from modules/learn/partials/diagrams/query-execution.puml rename to modules/indexes/partials/diagrams/query-execution.puml diff --git a/modules/learn/partials/diagrams/query-service.puml b/modules/indexes/partials/diagrams/query-service.puml similarity index 100% rename from modules/learn/partials/diagrams/query-service.puml rename to modules/indexes/partials/diagrams/query-service.puml diff --git a/modules/learn/assets/images/services-and-indexes/indexes/query_execution.png b/modules/learn/assets/images/services-and-indexes/indexes/query_execution.png deleted file mode 100644 index e76da2b70d35c17ed2b39a2c53b33625ecf3bf96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49742 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 U0imBh;%^eFCr&G7%A4Q%KZFaqg8%>k diff --git a/modules/learn/assets/images/services-and-indexes/indexes/query_service.svg b/modules/learn/assets/images/services-and-indexes/indexes/query_service.svg deleted file mode 100644 index ff2611d6f..000000000 --- a/modules/learn/assets/images/services-and-indexes/indexes/query_service.svg +++ /dev/null @@ -1,250 +0,0 @@ - - - - Artboard - Created with Sketch. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Parse - - - Plan - - - Scan - - - Fetch - - - Join - - - Sort - - - Offset - - - Limit - - - Project - - - Filter - - - Pre-Aggregate - - - Aggregate - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Client - - - Query Service - - - - Index Service - - - - Data Service - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/modules/learn/pages/services-and-indexes/indexes/.indexes.adoc b/modules/learn/pages/services-and-indexes/indexes/.indexes.adoc deleted file mode 100644 index da44b73c7..000000000 --- a/modules/learn/pages/services-and-indexes/indexes/.indexes.adoc +++ /dev/null @@ -1,40 +0,0 @@ -= Indexes -:description: Couchbase Capella indexes enhance the performance of query and search operations. -:page-aliases: understanding-couchbase:services-and-indexes/indexes/indexes,concepts:indexing - -[abstract] -{description} - -_Indexes_ are used by certain services, such as _Query_, _Analytics_, and _Search_, as targets for search-routines. -Each index makes a predefined subset of data available for the search. - -The _Query_ service relies on indexes provided by the _Index_ service. -The _Search_ and _Analytics_ services both provide their own indexes, internally. - -Indexes, when well-designed, provide significant enhancements to the performance of search-operations. - -== Indexes - -The following forms of index are available: - -Primary:: Provided by the xref:services-and-indexes/services/index-service.adoc[Index Service], this is based on the unique key of every item in a specified collection. -Every primary index is maintained asynchronously. -A primary index is intended to be used for simple queries, which have no filters or predicates. -For information on primary indexes, see xref:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes]. - -Secondary:: Provided by the xref:services-and-indexes/services/index-service.adoc[Index Service], this is based on an attribute _within_ a document. -The value associated with the attribute can be of any type: scalar, object, or array. -+ -A Secondary Index is frequently referred to as a _Global Secondary Index_, or _GSI_. -This is the kind of index used most frequently in Couchbase Server, for queries performed with {sqlpp}. -For information on Global Secondary Indexes, see xref:services-and-indexes/indexes/global-secondary-indexes.adoc[Using Indexes]. - -Full Text:: Provided by the xref:services-and-indexes/services/search-service.adoc[Search Service], this is a specially purposed index, which contains targets derived from the textual contents of documents within one or more specified keyspaces. -Text-matches of different degrees of exactitude can be searched for. -Both input and target text-values can be purged of irrelevant characters (such as punctuation marks or html tags). -For information on how to create Full Text Indexes, see xref:fts:fts-creating-indexes.adoc[Creating Indexes]. - -Analytics:: Provided by the xref:services-and-indexes/services/analytics-service.adoc[Analytics Service], this is a materialized access path for the shadow data in an Analytics collection. -Analytics indexes can be used to speed up Analytics selection queries and join queries. -If changes in operational data result in corresponding modifications to shadow data, Analytics indexes are updated automatically. -See the section on xref:analytics:7_using_index.adoc[Using Indexes] in Couchbase Analytics. diff --git a/modules/n1ql/pages/n1ql-intro/queriesandresults.adoc b/modules/n1ql/pages/n1ql-intro/queriesandresults.adoc index fcb425774..baa494e52 100644 --- a/modules/n1ql/pages/n1ql-intro/queriesandresults.adoc +++ b/modules/n1ql/pages/n1ql-intro/queriesandresults.adoc @@ -235,4 +235,4 @@ For example, creating a secondary index on the `name` and `email` fields in the Note that you do not need to create an index on a keyspace to be able to query that keyspace. If no indexes exist on a keyspace, Couchbase Capella uses a sequential scan to query that index. -For more information, refer to xref:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[]. +For more information, refer to xref:indexes:indexing-overview.adoc[]. diff --git a/modules/n1ql/pages/n1ql-language-reference/adaptive-indexing.adoc b/modules/n1ql/pages/n1ql-language-reference/adaptive-indexing.adoc index 8c30848b6..e86430fe0 100644 --- a/modules/n1ql/pages/n1ql-language-reference/adaptive-indexing.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/adaptive-indexing.adoc @@ -5,7 +5,7 @@ :pairs: xref:n1ql-language-reference/metafun.adoc#pairs :createindex: xref:n1ql-language-reference/createindex.adoc :indexing-arrays: xref:n1ql-language-reference/indexing-arrays.adoc -:partial-index: xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc#partial-index +:partial-index: xref:indexes:indexing-and-query-perf.adoc#partial-index {description} Such an index is generic in nature, and it can efficiently index and lookup any of the index-key values. diff --git a/modules/n1ql/pages/n1ql-language-reference/advise.adoc b/modules/n1ql/pages/n1ql-language-reference/advise.adoc index e0400595c..19191ab3d 100644 --- a/modules/n1ql/pages/n1ql-language-reference/advise.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/advise.adoc @@ -26,7 +26,7 @@ :aggregate-quantifier: {n1ql}/aggregatefun.adoc#aggregate-quantifier // Indexing and Query Performance cross-references -:indexing-and-query-perf: xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc +:indexing-and-query-perf: xref:indexes:indexing-and-query-perf.adoc :secondary-index: {indexing-and-query-perf}#secondary-index :partial-index: {indexing-and-query-perf}#partial-index :array-index: {indexing-and-query-perf}#array-index diff --git a/modules/n1ql/pages/n1ql-language-reference/aggregatefun.adoc b/modules/n1ql/pages/n1ql-language-reference/aggregatefun.adoc index a9fc5d3f0..4278f3a4f 100644 --- a/modules/n1ql/pages/n1ql-language-reference/aggregatefun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/aggregatefun.adoc @@ -101,7 +101,7 @@ The conditional expression is subject to the same rules as the conditional expre It may not contain a subquery, a window function, or an outer reference. NOTE: If the query block contains an aggregate function which uses the FILTER clause, the aggregation is not pushed down to the indexer. -Refer to xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc#filter-clause[Grouping and Aggregate Pushdown] for more details. +Refer to xref:indexes:groupby-aggregate-performance.adoc#filter-clause[] for more details. [[over-clause]] === OVER Clause diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index 08434b512..1f2667117 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -6,7 +6,7 @@ Secondary indexes contain a filtered or a full set of keys in a given keyspace. :authorization-overview: xref:server:learn:security/authorization-overview.adoc -:index-replication: xref:learn:services-and-indexes/indexes/index-replication.adoc#index-replication +:index-replication: xref:indexes:index-replication.adoc#index-replication :console-indexes: xref:server:manage:manage-ui/manage-ui.adoc#console-indexes :query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context :build-index: xref:n1ql-language-reference/build-index.adoc @@ -16,7 +16,7 @@ Secondary indexes contain a filtered or a full set of keys in a given keyspace. :indexing-arrays: xref:n1ql-language-reference/indexing-arrays.adoc :index-partitioning: xref:n1ql-language-reference/index-partitioning.adoc :indexing-meta-info: xref:n1ql-language-reference/indexing-meta-info.adoc -:operator-pushdowns: xref:learn:services-and-indexes/indexes/index_pushdowns.adoc#operator-pushdowns +:operator-pushdowns: xref:indexes:index_pushdowns.adoc#operator-pushdowns :logical-hierarchy: xref:n1ql:n1ql-intro/queriesandresults.adoc#logical-hierarchy :querying-indexes: xref:n1ql-intro/sysinfo.adoc#querying-indexes diff --git a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc index 408460b0e..f9c248fe9 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc @@ -11,7 +11,7 @@ Primary indexes contain a full set of keys in a given keyspace. :query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context :logical-hierarchy: xref:n1ql-intro/queriesandresults.adoc#logical-hierarchy :querying-indexes: xref:n1ql-intro/sysinfo.adoc#querying-indexes -:index-replication: xref:learn:services-and-indexes/indexes/index-replication.adoc#index-replication +:index-replication: xref:indexes:index-replication.adoc#index-replication :query-settings: xref:server:manage:manage-settings/query-settings.adoc // TEMP diff --git a/modules/n1ql/pages/n1ql-language-reference/flex-indexes.adoc b/modules/n1ql/pages/n1ql-language-reference/flex-indexes.adoc index 0121a2f9f..4b98ad6bc 100644 --- a/modules/n1ql/pages/n1ql-language-reference/flex-indexes.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/flex-indexes.adoc @@ -12,13 +12,13 @@ :index-type: xref:n1ql-language-reference/hints.adoc#index-type :isstring: xref:n1ql-language-reference/typefun.adoc#isstring :isnumber: xref:n1ql-language-reference/typefun.adoc#isnumber -:covering-indexes: xref:n1ql:n1ql-language-reference/covering-indexes.adoc +:covering-indexes: xref:indexes:covering-indexes.adoc :query-settings: xref:n1ql:n1ql-manage/query-settings.adoc :fts-creating-indexes: xref:clusters:search-service/create-full-text-indexes.adoc :inserting-a-child-field: clusters:search-service/create-full-text-indexes.adoc#inserting-a-child-field :pre-constructed-analyzers: xref:server:fts:fts-using-analyzers.adoc#pre-constructed-analyzers :simple-queries: xref:server:fts:fts-query-types.adoc#simple-queries -:index_pushdowns: xref:learn:services-and-indexes/indexes/index_pushdowns.adoc +:index_pushdowns: xref:indexes:index_pushdowns.adoc [abstract] {description} diff --git a/modules/n1ql/pages/n1ql-language-reference/groupby.adoc b/modules/n1ql/pages/n1ql-language-reference/groupby.adoc index 82828b54f..171f6eda0 100644 --- a/modules/n1ql/pages/n1ql-language-reference/groupby.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/groupby.adoc @@ -265,4 +265,4 @@ The alias in the `GROUP BY` clause enables you to refer to the `CASE` expression == Related Links -* For further examples, refer to xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[Group By and Aggregate Performance]. +* For further examples, refer to xref:indexes:groupby-aggregate-performance.adoc[]. diff --git a/modules/n1ql/pages/n1ql-language-reference/selectintro.adoc b/modules/n1ql/pages/n1ql-language-reference/selectintro.adoc index 147b7fbb1..f42602928 100644 --- a/modules/n1ql/pages/n1ql-language-reference/selectintro.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/selectintro.adoc @@ -156,7 +156,7 @@ The following diagram shows the query execution workflow at a high level and ill .Query Execution Workflow [plantuml,query-execution,svg] .... -include::learn:partial$diagrams/query-execution.puml[] +include::indexes:partial$diagrams/query-execution.puml[] .... The SELECT statement is executed as a sequence of steps. @@ -169,7 +169,7 @@ The following diagram shows the possible elements and operations during query ex .Query Execution Phases [plantuml,query-service,svg] .... -include::learn:partial$diagrams/query-service.puml[] +include::indexes:partial$diagrams/query-service.puml[] .... Some phases are done serially while others are done in parallel, as specified by their parent operator. @@ -801,4 +801,4 @@ include::example$n1ql-language-reference/explain-idx-include.jsonc[tags=include; <.> In this case, since the lead key in the index includes MISSING values, the optimizer correctly chooses the `idx_airport_include` index. ==== -For further examples, refer to xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[Group By and Aggregate Performance]. +For further examples, refer to xref:indexes:groupby-aggregate-performance.adoc[]. diff --git a/modules/n1ql/pages/n1ql-language-reference/updatestatistics.adoc b/modules/n1ql/pages/n1ql-language-reference/updatestatistics.adoc index a9e6aff9a..c3bdbf945 100644 --- a/modules/n1ql/pages/n1ql-language-reference/updatestatistics.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/updatestatistics.adoc @@ -96,7 +96,7 @@ If an index has a memory-resident ratio of zero, then the statement returns the Depending on the index storage settings, if an index has been scanned recently, it is more likely to be memory-resident; whereas if an index is not used for a long while, then it is more likely to be ejected from memory. You may be able to improve the memory-resident ratio for an index (and avoid error 5390) by running one or more queries which use that index. -For further details, refer to xref:learn:services-and-indexes/indexes/storage-modes.adoc[Storage Settings]. +For further details, refer to xref:indexes:storage-modes.adoc[Storage Settings]. == Optimizer Statistics diff --git a/modules/n1ql/pages/query.adoc b/modules/n1ql/pages/query.adoc index f2d172439..1685b9f04 100644 --- a/modules/n1ql/pages/query.adoc +++ b/modules/n1ql/pages/query.adoc @@ -69,7 +69,7 @@ endif::flag-devex-javascript-udfs[] == Query References * xref:n1ql:n1ql-language-reference/index.adoc[] -* xref:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[] +* xref:indexes:indexing-overview.adoc[] ifdef::flag-devex-javascript-udfs[] * xref:javascript-udfs:javascript-functions-with-couchbase.adoc[] endif::flag-devex-javascript-udfs[] diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index 2c0ac4549..5fdd28c32 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -148,17 +148,17 @@ endif::flag-devex-javascript-udfs[] **** xref:n1ql:n1ql-language-reference/upsert.adoc[] *** xref:n1ql:n1ql-language-reference/n1ql-auditing.adoc[] *** xref:n1ql:n1ql-language-reference/n1ql-error-codes.adoc[] - ** xref:learn:services-and-indexes/indexes/global-secondary-indexes.adoc[] - *** xref:learn:services-and-indexes/indexes/query-without-index.adoc[] - *** xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc[] - *** xref:learn:services-and-indexes/indexes/index-lifecycle.adoc[] - *** xref:n1ql:n1ql-language-reference/covering-indexes.adoc[] - *** xref:learn:services-and-indexes/indexes/index-scans.adoc[] - *** xref:learn:services-and-indexes/indexes/index_pushdowns.adoc[] - *** xref:n1ql:n1ql-language-reference/groupby-aggregate-performance.adoc[] - *** xref:learn:services-and-indexes/indexes/early-filters-and-pagination.adoc[] - *** xref:learn:services-and-indexes/indexes/index-replication.adoc[] - *** xref:learn:services-and-indexes/indexes/storage-modes.adoc[] + ** xref:indexes:indexing-overview.adoc[] + *** xref:indexes:query-without-index.adoc[] + *** xref:indexes:indexing-and-query-perf.adoc[] + *** xref:indexes:covering-indexes.adoc[] + *** xref:indexes:index-scans.adoc[] + *** xref:indexes:index_pushdowns.adoc[] + *** xref:indexes:groupby-aggregate-performance.adoc[] + *** xref:indexes:early-filters-and-pagination.adoc[] + *** xref:indexes:index-lifecycle.adoc[] + *** xref:indexes:index-replication.adoc[] + *** xref:indexes:storage-modes.adoc[] ifdef::flag-devex-javascript-udfs[] ** xref:javascript-udfs:javascript-functions-with-couchbase.adoc[] *** xref:javascript-udfs:calling-javascript-from-n1ql.adoc[] From f506dad88cfa41eaec2e76332adca8cbaa96aca9 Mon Sep 17 00:00:00 2001 From: Ray Offiah Date: Mon, 19 Aug 2024 11:20:03 +0100 Subject: [PATCH 06/80] [DOC-11988-7.6]: RBAC role change impact to eventing function Minor corrections --- modules/eventing/pages/eventing-rbac.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/eventing/pages/eventing-rbac.adoc b/modules/eventing/pages/eventing-rbac.adoc index 65fcbd89a..dc94fce4a 100644 --- a/modules/eventing/pages/eventing-rbac.adoc +++ b/modules/eventing/pages/eventing-rbac.adoc @@ -71,7 +71,7 @@ The following minimal resources are required for a non-privileged user to access * Data DCP reader ** Mutation Source * Eventing / Manage Scope Function -** bucket.scope or bucket.* +** bucket.scope or bucket. == Minimal Eventing RBAC role example @@ -107,7 +107,7 @@ image::rbac_min_c.png[,538,align=middle] * Access the Couchbase Web Console > Security -* Select GROUPS on the right, you should see your definition for GROUP "eventing_min" +* Select GROUPS on the right, you should see your definition for GROUP `eventing_min`. + image::rbac_min_groups.png[,%100] From 3758fdcadd5d6a31b614f43e887e4202b21856f5 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:19:02 +0100 Subject: [PATCH 07/80] DOC-12652: Convert other server REST API references to use OpenAPI generator (#280) * Update links to Query Settings REST API * Update includes of Query Settings REST API * Driveby fixes for CURL() function * Update links to Query Settings examples * Add table-style partial * Add table-style for CURL() reference --- .../pages/n1ql-language-reference/.curl.adoc | 23 +++++---- .../pages/n1ql-manage/query-settings.adoc | 2 +- .../n1ql-language-reference/table-style.adoc | 51 +++++++++++++++++++ 3 files changed, 65 insertions(+), 11 deletions(-) create mode 100644 modules/n1ql/partials/n1ql-language-reference/table-style.adoc diff --git a/modules/n1ql/pages/n1ql-language-reference/.curl.adoc b/modules/n1ql/pages/n1ql-language-reference/.curl.adoc index d8742c557..aa7ab4860 100644 --- a/modules/n1ql/pages/n1ql-language-reference/.curl.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/.curl.adoc @@ -8,6 +8,9 @@ :url-yahoo-api: https://developer.yahoo.com/api/ :url-google-geo: https://developers.google.com/maps/documentation/geocoding/intro +// TEMP +include::partial$n1ql-language-reference/table-style.adoc[] + The `CURL()` function implements a subset of {url-wiki-curl}[cURL^] functionality and enables {sqlpp} queries to interact and integrate with external JSON data sources available over HTTP/REST. This allows federated queries against external data sources, such as the {url-google-maps}[Google geocoding API^], {url-yahoo-api}[Yahoo API^], or other Couchbase clusters. The federated queries can leverage full querying capabilities of {sqlpp}, including functions, expressions, sub-queries, JOINs, NESTs, UNNESTs etc. @@ -229,9 +232,9 @@ Click btn:[+] to add another URL to the list. Click btn:[-] to remove a URL from the list. -==== From CBQ +==== From the Query Settings REST API -From a CBQ prompt, you can send a CURL() command to allow or disallow specific URLs, for example: +You can send a call to the Query Settings REST API to allow or disallow specific URLs, for example: [source,sh] ---- @@ -639,7 +642,7 @@ WHERE to_number(hdp_low) < min_threshold; ==== [[Ex6]] -.Use CURL() to allow two URLs and disallow one URL +.Allow two URLs and disallow one URL ==== .Request [source,sh] @@ -654,7 +657,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex7]] -.Use CURL() to allow all access to all endpoints +.Allow all access to all endpoints ==== .Request [source,sh] @@ -667,7 +670,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex8]] -.Use CURL() to turn off access to all endpoints and clear the Allowed and Disallowed lists +.Turn off access to all endpoints and clear the Allowed and Disallowed lists ==== .Request [source,sh] @@ -682,7 +685,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex9]] -.Use CURL() to turn off access to all endpoints but make no changes to the Allowed and Disallowed lists +.Turn off access to all endpoints but make no changes to the Allowed and Disallowed lists ==== .Request [source,sh] @@ -695,7 +698,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex10]] -.Use CURL() to turn off access to all endpoints, allow one URL, and clear the Disallowed list +.Turn off access to all endpoints, allow one URL, and clear the Disallowed list ==== .Request [source,sh] @@ -710,7 +713,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex11]] -.Use CURL() to turn off access to all endpoints, disallow one URL, and clear the Allowed list +.Turn off access to all endpoints, disallow one URL, and clear the Allowed list ==== .Request [source,sh] @@ -725,7 +728,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex12]] -.Use CURL() to allow an IP address and port instead of a website name +.Allow an IP address and port instead of a website name ==== .Request [source,sh] @@ -740,7 +743,7 @@ curl -X POST -u Administrator:password \ ==== [[Ex13]] -.Use CURL() to allow and disallow the same URL -- and get an error +.Allow and disallow the same URL -- and get an error ==== .Request [source,sh] diff --git a/modules/n1ql/pages/n1ql-manage/query-settings.adoc b/modules/n1ql/pages/n1ql-manage/query-settings.adoc index 6d9a9b5c8..1341b7fc7 100644 --- a/modules/n1ql/pages/n1ql-manage/query-settings.adoc +++ b/modules/n1ql/pages/n1ql-manage/query-settings.adoc @@ -4,7 +4,7 @@ :alt-markdown-links: // External cross-references -:rest-cluster-query-settings: xref:rest-api:rest-cluster-query-settings.adoc +:rest-cluster-query-settings: xref:n1ql-rest-settings:index.adoc :general-settings-query-settings: xref:manage:manage-settings/general-settings.adoc#query-settings :couchbase-cli-setting-query: xref:cli:cbcli/couchbase-cli-setting-query.adoc :n1ql-rest-api-admin: xref:n1ql-rest-admin:index.adoc diff --git a/modules/n1ql/partials/n1ql-language-reference/table-style.adoc b/modules/n1ql/partials/n1ql-language-reference/table-style.adoc new file mode 100644 index 000000000..d121d0a31 --- /dev/null +++ b/modules/n1ql/partials/n1ql-language-reference/table-style.adoc @@ -0,0 +1,51 @@ +// FIXME: Temporary pass-through CSS for REST API tables with Markdown blocks + +ifdef::basebackend-html[] +++++ + +++++ +endif::[] \ No newline at end of file From 9713d5d4d05625a1ec43f17cd7d31a13a5bea61e Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Mon, 23 Sep 2024 11:51:06 +0100 Subject: [PATCH 08/80] DOC-12312: streaming completed requests to local files (#273) * Add Streaming Completed Requests * Try to make tabs sync with only partial success * Add system:completed_requests_history to sysinfo * Add links to Admin REST API * Update table formatting for sysinfo * Add links to gzip and jq --- modules/n1ql/pages/n1ql-intro/sysinfo.adoc | 26 ++++++ .../n1ql-manage/monitoring-n1ql-query.adoc | 82 ++++++++++++++++++- 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc index 080c6a84b..35bf09fd8 100644 --- a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc +++ b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc @@ -3,6 +3,31 @@ :description: {sqlpp} has a system namespace that stores metadata about data containers, the Query service, and the system as a whole. \ You can query the system namespace to get this information. +// Pass through HTML table styles for this page + +ifdef::basebackend-html[] +++++ + +++++ +endif::[] + [abstract] {description} @@ -29,6 +54,7 @@ xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#vitals[system:vitals] xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-active-req[system:active_requests] xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-prepared[system:prepareds] xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[system:completed_requests] +xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-history[system:completed_requests_history] a| [%hardbreaks] <> diff --git a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc index 01ee0336b..e0adb6742 100644 --- a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc +++ b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc @@ -241,7 +241,11 @@ SELECT *, meta().plan FROM system:active_requests; [[sys-active-delete]] === Terminate an Active Request -The DELETE command can be used to terminate an active request, for instance, a non-responding or a long-running query. +To terminate an active request, for instance, a non-responding or a long-running query, use +ifdef::flag-devex-rest-api[] +the Admin REST API or +endif::flag-devex-rest-api[] +a {sqlpp} query. [tabs] ==== @@ -795,7 +799,7 @@ For query plan field names and meanings, see <>. ifdef::flag-devex-rest-api[] [[sys-completed-config]] -== Configure the Completed Requests +== Configure Completed Requests You can configure the `system:completed_requests` keyspace by specifying parameters through the Admin API `/admin/settings` endpoint. @@ -923,6 +927,80 @@ curl $BASE_URL/admin/settings -u $USER:$PASSWORD \ -H 'Content-Type: application/json' \ -d '{"completed-limit":1000}' ---- + +[[sys-history]] +== Stream Completed Requests + +In clusters running Couchbase Server 7.6.4 and later, you can stream completed requests to disk. + +To enable completed request streaming, use the xref:n1ql:n1ql-rest-api/admin.adoc[Admin REST API] `/admin/settings` endpoint to specify the `completed_stream_size` property. + +[source,sh] +---- +curl $BASE_URL/admin/settings -u $USER:$PASSWORD \ + -H 'Content-Type: application/json' \ + -d '{"completed_stream_size":500}' +---- + +This property is a file size in MiB. +When set to `0` (the default), completed request streaming is disabled. + +When set to any size greater than `0`, completed requests are streamed to archive files. +The value of this property determines the size of the data to retain, per node. +The configuration for completed requests determines which requests are saved. + +NOTE: The additional processing required to save completed requests to disk may limit overall request throughput on a Query node, but typically only when every completed request is being recorded, and requests are very small or short-lived. +The speed of the file system on which the server logs directory resides naturally affects the potential impact too. + +[#sys-history-files] +=== Archived Request Files + +When streaming is enabled, completed requests are saved to GZIP archives with the prefix `local_request_log` in the Couchbase Server `logs` directory. +Each saved GZIP archive file contains multiple JSON entries, one for each for each recorded completed request. + +Couchbase Server writes multiple archive files in parallel, so whilst the order of requests in a file is sequential, a single given file may not contain a contiguous sequence of requests. + +When an archive file reaches or exceeds 100 MiB, it is finalized and saved to disk. +This is not a hard limit -- entries are not truncated to adhere to it. +Files may also be finalized with less content, if nothing has been written to them for an extended period. +Files that are actively being written are not available for reading, and they don't count towards the configured size limit until they're finalized. + +Couchbase Server tries to manage and retain archive files such that the total disk space used by the files is within the specified limit for the node. +When the specified limit is reached, older files are removed as necessary to make space for newly finalized files. +When a file is removed, it isn't guaranteed that only the oldest requests are evicted, given that Couchbase Server writes to multiple archive files in parallel. + +[#sys-history-view] +=== View Archived Requests + +To view archived completed requests, use https://www.gnu.org/software/gzip[gzip] and https://jqlang.github.io/jq[jq] on the command line, or a {sqlpp} query. + +[tabs,sync-group-id="REST API|{sqlpp}"] +==== +Command Line:: ++ +-- +To view all archived completed requests in `$FILE`: + +[source,sh] +---- +gzip -qdc $FILE | jq . +---- +-- + +{sqlpp}:: ++ +-- +To get a list of archived completed requests using {sqlpp}: + +[source,sqlpp] +---- +SELECT * FROM system:completed_requests_history; +---- +-- +==== + +The `system:completed_requests_history` keyspace is provided for {sqlpp} access to the archived files, but as they are external GZIP archives performance is restricted, particularly with large histories on clusters with multiple Query service nodes. +Directly reading the files may be more useful in some cases. endif::flag-devex-rest-api[] [#query-monitoring-settings] From 02ea005153a935d557f870823fe58de16b2af294 Mon Sep 17 00:00:00 2001 From: Ray Offiah <77050471+RayOffiah@users.noreply.github.com> Date: Wed, 22 Jan 2025 06:15:53 +0000 Subject: [PATCH 09/80] [DOC-12901]: erroneous vector search text (#312) Fix grammar in the pre-filtering section --- .../vector-search/pages/pre-filtering-vector-search.adoc | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/vector-search/pages/pre-filtering-vector-search.adoc b/modules/vector-search/pages/pre-filtering-vector-search.adoc index 936e96aea..2eef2131c 100644 --- a/modules/vector-search/pages/pre-filtering-vector-search.adoc +++ b/modules/vector-search/pages/pre-filtering-vector-search.adoc @@ -8,13 +8,10 @@ == About Pre-filtering -Using pre-filtering as part of your vector search offers two key advantages: +The Search Service supports pre-filtering on Vector Search queries. +Pre-filtering allows you to execute vector searches over a subset of the vector index, +via the means of a filter request that qualifies the subset. -. *Enhanced precision and relevance:* -Narrow your search results based on specific criteria, such as organization, date/time ranges, or geospatial locations. - -. *Performance optimization:* -Reduce the search space before executing queries to improve query execution time and reduce computational overhead. == Prerequisites From 12431d6f780baca5c459b2436c7b9f3bb31a8add Mon Sep 17 00:00:00 2001 From: Ray Offiah <77050471+RayOffiah@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:23:06 +0000 Subject: [PATCH 10/80] [DOC-12921]: Feedback on Search Functions | Couchbase Docs (#324) --- modules/n1ql/pages/n1ql-language-reference/searchfun.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/n1ql/pages/n1ql-language-reference/searchfun.adoc b/modules/n1ql/pages/n1ql-language-reference/searchfun.adoc index 8707b2b6a..456d69788 100644 --- a/modules/n1ql/pages/n1ql-language-reference/searchfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/searchfun.adoc @@ -62,6 +62,7 @@ NOTE: From Couchbase Server 7.6 and later, when you use the SEARCH function, you You also do not need to match the analyzer in a query to the analyzer in the Search index for an analytic query. For more information about how to set the analyzer for a Search index, see xref:search:create-search-index-ui.adoc#default-analyzer[Configure Global Search Index Settings] or the xref:search:search-index-params.adoc#mapping[Mapping Object]. +[#search-function-arguments-section] === Arguments identifier:: From b9a9f98f1b5e947a97fd06064dd9de00b3073d6d Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Mon, 8 Sep 2025 20:42:17 +0100 Subject: [PATCH 11/80] [DOC-9249] Add HASHBYTES Function (#327) --- .../n1ql-language-reference/metafun.adoc | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/modules/n1ql/pages/n1ql-language-reference/metafun.adoc b/modules/n1ql/pages/n1ql-language-reference/metafun.adoc index 9cb171b05..c2934f7e4 100644 --- a/modules/n1ql/pages/n1ql-language-reference/metafun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/metafun.adoc @@ -696,6 +696,100 @@ FROM system:completed_requests; ---- ==== +[[hashbytes,HASHBYTES()]] +== HASHBYTES(`input`, [ `options` ]) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function returns a binary hash value for a given input using a specified hashing algorithm. +By using this function, you can verify or compare data quickly, or protect your data by masking its original form while still allowing verification or comparison. + +=== Arguments + +input:: A binary object or any {sqlpp} data type. +The JSON marshalled value of the data is used as the input. + +options:: [Optional] +An object that specifies the hashing algorithm and other options for the function. +If omitted, the default hashing algorithm is `sha256`. + +=== Options + +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **algorithm** + +__required__ +| Specifies the hashing algorithm to be used. + +Supported algorithms are: `crc32`, `md4`, `md5`, `sha224`, `sha256`, `sha384`, `sha512`, `sha512/224`, and `sha512/256`. +| String + +| **polynomial** + +__optional__ +| The polynomial to use. +This only applies if the algorithm is `crc32`. +This property may have one of the following values: + +* `ieee` (the default value) +* `castagnoli` +* `koopman` +* A valid 32-bit integer, provided either as a JSON number (decimal) or a string that can be parsed as a numeric value (supports hexadecimal with a "0x" prefix) + +*Default:* `ieee` +| String or integer +|=== + +=== Return Value + +A binary hash value. +The size or length of the value depends on the algorithm you choose. + +=== Examples + +[[hashbytes-ex1,HASHBYTES() Example 1]] + +.Find the hash value using the `sha256` algorithm +==== +.Query +[source,sqlpp] +---- +SELECT HASHBYTES('Hello World', {"algorithm":"sha256"}); +---- +.Results +[source,json] +---- +[ + { + "$1": "a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e" + } +] +---- +==== + +[[hashbytes-ex2,HASHBYTES() Example 2]] + +.Find the hash value using the `crc32` algorithm +==== +.Query +[source,sqlpp] +---- +SELECT HASHBYTES("hello world", {"algorithm":"crc32", "polynomial":"koopman"}); +---- +.Results +[source,json] +---- +[ + { + "$1": "df373d3c" + } +] +---- +==== + [[len,LEN()]] == LEN(`expression`) From 00e8f38c29a55c023970c5cc036223a7a718b9e3 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:54:12 +0000 Subject: [PATCH 12/80] NO ISSUE: replace callout list for diagram (#330) --- .../n1ql/pages/n1ql-language-reference/window.adoc | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/window.adoc b/modules/n1ql/pages/n1ql-language-reference/window.adoc index ea14b48e6..d4fce374b 100644 --- a/modules/n1ql/pages/n1ql-language-reference/window.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/window.adoc @@ -40,13 +40,11 @@ include::partial$n1ql-language-reference/window-intro.adoc[tag=windows] .Window partitions and the window frame image::window-example.png[Table of query result set with numbered callouts] -// workaround for callout list with no callout references - -[%hardbreaks] -➀ The query result set. -➁ Window partitions -- partitioned by `name`, ordered by `time`. -➂ The current object. -➃ The window frame -- between unbounded preceding and current object. +[calloutlist] +. The query result set. +. Window partitions -- partitioned by `name`, ordered by `time`. +. The current object. +. The window frame -- between unbounded preceding and current object. include::partial$n1ql-language-reference/window-intro.adoc[tag=functions] From 74f18cbcd94d2ba0fb1c7a5c42eadf3ac81e035b Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Mon, 8 Sep 2025 20:47:48 +0100 Subject: [PATCH 13/80] [DOC-11906] Add system:group_info & system:bucket_info keyspaces (#338) --- modules/n1ql/pages/n1ql-intro/sysinfo.adoc | 85 ++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc index 35bf09fd8..c4ee077fc 100644 --- a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc +++ b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc @@ -48,6 +48,8 @@ a| [%hardbreaks] <> <> <> +<> +<> a| [%hardbreaks] xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#vitals[system:vitals] @@ -450,6 +452,89 @@ SELECT 2+5 FROM system:dual The query returns the result of the expression, 7 in this case. +[#querying-groups] +== Query Groups + +[.status]#Couchbase Server 8.0# + +You can query group information using the `system:group_info` keyspace as follows: + +[source,sqlpp] +---- +SELECT * FROM system:group_info; +---- + +This catalog contains the following attributes: + +[options="header", cols="~a,~a,~a"] +|=== +|Name|Description|Schema + +|**description** + +__required__ +|User-defined description associated with the group. +|String + +|**id** + +__required__ +|ID of the group. +|String + +|**ldap_group_ref** + +__optional__ +|LDAP mapping associated with the group. +|String + +|**roles** + +__required__ +|List of RBAC roles for the group. +|Array of <> objects +|=== + +[[roles]] +**Roles** +[options="header", cols="~a,~a,~a"] +|=== +|Name|Description|Schema + +|**bucket_name** + +__optional__ +|Name of the bucket to which the role applies. +|String + +|**collection_name** + +__optional__ +|Name of the collection to which the role applies. +|String + +|**role** + +__required__ +|Specifies the RBAC role. +|String + +|**scope_name** + +__optional__ +|Name of the scope to which the role applies. +|String +|=== + +[#querying-bucket-info] +== Query Bucket Information + +[.status]#Couchbase Server 8.0# + +The `system:bucket_info` (alias: `system:database_info`) keyspace provides comprehensive information about all buckets, including their metadata, configuration settings, memory usage, and other details. + +You can query the keyspace as follows: + +[source,sqlpp] +---- +SELECT * FROM system:bucket_info; +---- + +The query returns the same data as the xref:server:rest-api:rest-buckets-summary.adoc[pools/default/buckets] REST API. +However, the `vBucketServerMap.vBucketMap` field is returned in a more compact format as a pipe-delimited string, rather than an array of arrays. + [#sys_my-user-info] == Monitor Your User Info From 6998915cc834d725a892aeee267b97ae3bb3f4e5 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Mon, 8 Sep 2025 20:56:47 +0100 Subject: [PATCH 14/80] [DOC-13215] Add COMPRESS() and UNCOMPRESS() Functions (#344) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/stringfun.adoc | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) diff --git a/modules/n1ql/pages/n1ql-language-reference/stringfun.adoc b/modules/n1ql/pages/n1ql-language-reference/stringfun.adoc index 851ddb5fc..9f2f14843 100644 --- a/modules/n1ql/pages/n1ql-language-reference/stringfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/stringfun.adoc @@ -8,6 +8,64 @@ NOTE: If any arguments to any of the following functions are [.out]`MISSING` then the result is also [.out]`MISSING` -- that is, no result is returned. Similarly, if any of the arguments passed to the functions are `NULL` or are of the wrong type, such as an integer instead of a string, then `NULL` is returned as the result. +[[fn-str-compress,COMPRESS()]] +== COMPRESS(`input_string`) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function compresses a string using `zlib` compression and encodes the compressed data into `base64` format. +It returns a compact, encoded string that can be easily transmitted or stored. + +NOTE: To convert a compressed string back to its original format, use the xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] function. + +=== Arguments +input_string:: A string or a valid expression that evaluates to a string. + +=== Return Value +A `base64` encoded string. + +=== Examples + +.Example 1: Using a string argument +==== +.Query +[source,sqlpp] +---- +SELECT COMPRESS("This is the string to compress"); +---- + +.Result +[source,json] +---- +[ + { + "$1": "eJwKycgsVsgsVijJSFUoLinKzEtXKMlXSM7PLShKLS4GBAAA//+ouQs8" + } +] +---- +==== + +.Example 2: Using an expression that evaluates to a string as the argument +==== +.Query +[source,sqlpp] +---- +SELECT COMPRESS(REPEAT("Hell0",10)); +---- + +.Result +[source,json] +---- +[ + { + "$1": "eJzySM3JMSCJAAQAAP//tSYREw==" + } +] +---- +==== + [[fn-str-concat,CONCAT()]] == CONCAT([.var]`string1`, [.var]`string2`, …) @@ -1603,3 +1661,107 @@ SELECT URLENCODE("SELECT name FROM `travel-sample`.inventory.hotel LIMIT 1;") AS ] ---- ==== + +[[fn-str-uncompress,UNCOMPRESS()]] +== UNCOMPRESS(`input_string`) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function takes a `base64` encoded, compressed string as input and returns the original uncompressed string. + +NOTE: This function is often used together with the xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-compress[COMPRESS()] function, which compresses and encodes strings to `base64` format. + +=== Arguments + +input_string:: A `base64` encoded string that represents the compressed data. +It supports the following formats: + +* `zlib` compressed and `base64` encoded strings. +* `gzip` compressed and `base64` encoded strings. +* Execution plan strings stored in the `pln` array of AWR documents that are compressed and `base64` encoded. +//TODO: Add link to the AWR documentation, when it is ready. + +=== Return Value +A string that represents the decoded and uncompressed data. + +=== Examples + +.Example 1: Uncompressing a `base64` encoded string +==== +.Query +[source,sqlpp] +---- +SELECT UNCOMPRESS("eJwKycgsVsgsVijJSFVIzs8tKEotLk5NUSguKcrMSwcEAAD//5/2CwI="); +---- + +.Result +[source,json] +---- +[ + { + "$1": "This is the compressed string" + } +] +---- +==== + +.Example 2: Using UNCOMPRESS() and COMPRESS() together +==== +.Query +[source,sqlpp] +---- +SELECT UNCOMPRESS(COMPRESS("This is the compressed string")); +---- + +.Result +[source,json] +---- +[ + { + "$1": "This is the compressed string" + } +] +---- +==== + +.Example 3: Uncompressing execution plan strings in AWR documents +==== +Consider a workload document with `pln` array as follows: + +[source,json] +---- +"pln": [ + "0NM7AjQyYjVjNDMwZjIwNTFmNmIAX2RlZmF1bHQAE3RyYXZlbC1zYW1wbGUAJTA9AA==", + "0NM7AjQyYjVjNDMwZjIwNTFmNmIAX2RlZmF1bHQAE3RyYXZlbC1zYW1wbGUAJTA9AA==" + ] +---- + +.Query +[source,sqlpp] +---- +SELECT UNCOMPRESS("0NM7AjQyYjVjNDMwZjIwNTFmNmIAX2RlZmF1bHQAE3RyYXZlbC1zYW1wbGUAJTA9AA=="); +---- +.Result +[source,json] +---- +{ + "$1": + "{ \"#operator\": \"Sequence\", + \"~children\": [ + { \"#operator\": \"PrimaryScan3\", + \"index_id\": \"42b5c430f2051f6b\", + \"keyspace\": \"_default\" + }, + { \"#operator\": \"Fetch\", + \"keyspace\": \"travel-sample\" + }, + { \"#operator\": \"InitialProject\" }, + { \"#operator\": \"Limit\" }, + { \"#operator\": \"Stream\" } + ] + }" +} +---- +==== \ No newline at end of file From b157313724a83312aeb0e5356631945e00f1559c Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Mon, 8 Sep 2025 21:00:17 +0100 Subject: [PATCH 15/80] [DOC-11766] Add EVALUATE Function (#346) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/metafun.adoc | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/modules/n1ql/pages/n1ql-language-reference/metafun.adoc b/modules/n1ql/pages/n1ql-language-reference/metafun.adoc index c2934f7e4..449fbc2c3 100644 --- a/modules/n1ql/pages/n1ql-language-reference/metafun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/metafun.adoc @@ -331,6 +331,97 @@ SELECT DS_VERSION() as server_version; ---- ==== +[[evaluate,EVALUATE()]] +== EVALUATE(`statement` [ ,`params` ]) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function enables you to execute a SQL++ statement provided as a string and returns the result as an array. +It can be used as a part of larger query or request, or wherever arrays are permitted within a statement. + +The function evaluates the statement dynamically using the same permissions as the invoking statement. +The statement must be read-only. If it tries to modify data (like with UPDATE or INSERT), the function fails with `error 5010, "not a readonly request”`. + +NOTE: The results are materialized in memory, so large result sets may require a lot of memory. +To limit memory usage, you can use quotas (the evaluated statement operates within the invoking statement's quota). + +=== Arguments + +statement:: A string containing the statement to evaluate. + +params:: Can be one of the following: ++ +-- +* An object containing named parameters. +* An array containing positional parameters. +-- + +=== Return Value + +An array that contains the result of the evaluated statement. + +=== Examples + +[[evaluate-ex1,EVALUATE() Example 1]] +.Example 1: Using named parameters +==== +.Query +[source,sqlpp] +---- +SELECT EVALUATE("SELECT $named_param AS example", + {"named_param":"This is the named parameter's value"}) + eval_result; +---- + +.Results +[source,json] +---- +[ + { + "eval_result": [ + { + "example": "This is the named parameter's value" + } + ] + } +] +---- +==== + +[[evaluate-ex2,EVALUATE() Example 2]] +.Example 2: Using EVALUATE with INFER +==== +.Query +[source,sqlpp] +---- +SELECT `Flavor` FROM EVALUATE("INFER `travel-sample`")[0] inf; +---- + +.Results +[source,json] +---- +[ + { + "Flavor": "`type` = \"airport\"" + }, + { + "Flavor": "`stops` = 0, `type` = \"route\"" + }, + { + "Flavor": "`type` = \"landmark\"" + }, + { + "Flavor": "`type` = \"hotel\"" + }, + { + "Flavor": "`type` = \"airline\"" + } +] +---- +==== + [[finderr,FINDERR()]] == FINDERR(`expression`) From 25282150c15b9998d9741db74237d51e1b768ba6 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Mon, 8 Sep 2025 21:04:34 +0100 Subject: [PATCH 16/80] [DOC-10871] Add OBJECT_CONCAT2 Function (#333) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/objectfun.adoc | 72 +++++++++++++++++-- 1 file changed, 65 insertions(+), 7 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc b/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc index a4e426916..b80751d0b 100644 --- a/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc @@ -87,7 +87,12 @@ If any of the input objects contain the same attribute name, the attribute from .Query [source,sqlpp] ---- -SELECT OBJECT_CONCAT({"abc": 1}, {"def": 2}, {"ghi": 3}, {"ghi": 4}, {"ghi": [5, 6, 7]}); +SELECT OBJECT_CONCAT({"flight": "AF198"}, + {"utc": "4:44:44"}, + {"code": "green"}, + {"code": "yellow"}, + {"passengers": ["Corrine Hill", "Vallie Ryan"]} +); ---- .Results @@ -96,12 +101,12 @@ SELECT OBJECT_CONCAT({"abc": 1}, {"def": 2}, {"ghi": 3}, {"ghi": 4}, {"ghi": [5, [ { "$1": { - "abc": 1, - "def": 2, - "ghi": [ - 5, - 6, - 7 + "flight": "AF198", + "utc": "4:44:44", + "code": "yellow", + "passengers": [ + "Corrine Hill", + "Vallie Ryan" ] } } @@ -109,6 +114,59 @@ SELECT OBJECT_CONCAT({"abc": 1}, {"def": 2}, {"ghi": 3}, {"ghi": 4}, {"ghi": [5, ---- ==== +[[fn-obj-concat2,OBJECT_CONCAT2()]] +== OBJECT_CONCAT2(`expr`, `expr` ...) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function concatenates multiple input objects into a single new object, and requires at least two input objects to work. +Unlike <>, this function supports both plain objects and arrays of objects as arguments. + +=== Arguments + +expr:: An expression representing an object or an array of objects. +The first argument must be a plain object and cannot be an array. + +=== Return Value + +An object constructed by concatenating all the input objects. +If any of the input objects contain the same attribute name, the attribute from the last relevant object in the input list is copied to the output; similarly-named attributes from earlier objects in the input list are ignored. + +=== Examples + +[[obj-concat2-ex,OBJECT_CONCAT2() Example]] +==== +.Query +[source,sqlpp] +---- +SELECT OBJECT_CONCAT2( + {"flight": "AF198"}, + [ {"utc": "4:44:44"}, + {"code": "green"}, + {"airline": "Air France"}, + {"airline": "Delta"} + ] +); +---- + +.Results +[source,json] +---- +[ + { + "$1": { + "flight": "AF198", + "utc": "4:44:44", + "code": "green", + "airline": "Delta" + } + } +] +---- +==== + [[fn-obj-field,OBJECT_FIELD()]] == OBJECT_FIELD(`object`, `field`) From 76d94638f1f44652ffe6b7856b2348b861921510 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Thu, 24 Apr 2025 10:15:14 +0530 Subject: [PATCH 17/80] [DOC-10857] Add a note to ARRAY_REMOVE() (#334) --- .../n1ql-language-reference/arrayfun.adoc | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc b/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc index ea211d7ed..775589b7a 100644 --- a/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc @@ -1157,10 +1157,26 @@ val1, val2, …:: [At least 1 is required] The input value or multiple values to Output Values:: A new array with all occurrences of the specified [.var]`val` or multiple [.var]`val` fields removed from the array [.var]`expr`. - ++ If any of the arguments are `MISSING`, then it returns `MISSING`. - ++ If the first argument is not an array, then it returns `NULL`. ++ +[NOTE] +==== +This function cannot be used to remove NULL values from an array as it uses an equality predicate when evaluating the array elements to remove. +Since NULL does not equal NULL, such values are not matched and remain in the array. + +To remove NULL values, use the xref:n1ql-language-reference/collectionops.adoc#array[Array Collection Operator] instead. +For example: + +[source,sqlpp] +---- +SELECT ARRAY name FOR name IN ["Ryan", NULL, "Corrine"] +WHEN name IS NOT NULL +END AS filtered_names; +---- +==== === Example ==== From d51c13caf63388c949ac3b95a2a5374f24d88406 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Mon, 8 Sep 2025 21:11:51 +0100 Subject: [PATCH 18/80] [DOC-10792] Add OBJECT_TYPES/OBJECT_TYPES_NESTED functions (#331) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/objectfun.adoc | 309 +++++++++++++++--- 1 file changed, 271 insertions(+), 38 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc b/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc index b80751d0b..417aa4568 100644 --- a/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc @@ -599,36 +599,73 @@ SELECT OBJECT_NAMES(special_flights[*]) AS names; ==== [[fn-obj-pairs,OBJECT_PAIRS()]] -== OBJECT_PAIRS(`expression`) +== OBJECT_PAIRS(`expression` [, `options` ]) -_Alias_: *OBJECT_OUTER_PAIRS(`expression`)* +_Alias_: *OBJECT_OUTER_PAIRS(`expression` [, `options` ])* === Description This function returns an array of objects, containing the names and values of each attribute in the input object. -It is particularly useful when iterating over multiple objects in an array, as it collates the values from similarly-named attributes into a single nested array. +It also provides an option to return attribute types instead of values. + +The function is particularly useful when iterating over multiple objects in an array, as it collates the values from similarly-named attributes into a single nested array. +However, if an object does not contain a shared attribute name, it returns a null entry, similar to an OUTER JOIN. -In this case, the function returns a null entry from any object which does not contain the shared attribute name, rather like an OUTER JOIN. For an illustration, refer to the examples below. === Arguments expression:: An expression representing an object. +options:: [Optional] +A JSON object specifying options for the function. + +=== Options + +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **types** + +__required__ +| Determines whether to return attribute types or values. + +If TRUE, the function returns the name and type of each attribute. + +If FALSE, the function returns the name and value of each attribute. + +*Default:* `FALSE` +| Boolean +|=== + === Return Value -An array of objects, each containing two attributes: +An array of objects, each containing the following attributes: -name:: The name of an attribute in the source object. +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema -val:: The value of an attribute in the source object; or an array, containing the collated values of similarly-named attributes in the source objects. +| **name** + +| The name of an attribute in the source object. +| String -The objects in the array are sorted by attribute name, in {sqlpp} collation order. +| **val** + +| The value of an attribute in the source object; or an array, containing the collated values of similarly-named attributes in the source objects. +| Depends on the value returned. It can be a string, number, boolean, or others. + +| **type** + +| The type of an attribute in the source object. Returned only when the `types` parameter is set to `TRUE`. +| String +|=== + +NOTE: Each returned object will have either **val** or **type** (depending on the specified options), and not both. +Also, the objects in the array are sorted by attribute name, in {sqlpp} collation order. === Examples [[obj-pairs-ex1,OBJECT_PAIRS() Example 1]] -.Single object +.A single input object returning names and values ==== .Query [source,sqlpp] @@ -662,6 +699,40 @@ SELECT OBJECT_PAIRS({"flight": "AI444", "utc": "4:44:44", "codename": "green"}) ==== [[obj-pairs-ex2,OBJECT_PAIRS() Example 2]] +.A single input object returning names and types +==== +.Query +[source,sqlpp] +---- +SELECT OBJECT_PAIRS({"flight": "AI444", "utc": "4:44:44", "codename": "green"},{"types":TRUE}) + AS outer_pairs; +---- + +.Results +[source,json] +---- +[ + { + "outer_pairs": [ + { + "name": "codename", + "type": "string" + }, + { + "name": "flight", + "type": "string" + }, + { + "name": "utc", + "type": "string" + } + ] + } +] +---- +==== + +[[obj-pairs-ex3,OBJECT_PAIRS() Example 3]] .Iterating over objects in an array ==== In this example, notice that where the source objects have similarly-named attributes, the values from each of those attributes are collated into a single array in the output. @@ -719,44 +790,89 @@ SELECT OBJECT_PAIRS(special_flights[*]) AS outer_pairs; ---- ==== + [[fn-obj-pairs-nested,OBJECT_PAIRS_NESTED()]] == OBJECT_PAIRS_NESTED(`object` [, `options`]) === Description -Similar to <>, this function returns an array of objects, containing the names and values of each field in the input object. -A field in this context may be any attribute or element, nested at any level within the object. +Similar to <>, this function returns an array of objects, containing the names and values of each field in the input object. +It also provides an option to return field types instead of values. +A field in this context may be any attribute or element, nested at any level within the object. This function may be useful when iterating over multiple objects in an array, as it collates and unnests the values from similarly-named fields across all objects in the input array. -In this case, the function returns a null entry from any object which does not contain the shared field name, rather like an OUTER JOIN. +However, if an object does not contain a shared field name, it returns a null entry, similar to an OUTER JOIN. + For an illustration, refer to the examples below. === Arguments object:: An expression representing an object. -options:: [Optional] An object containing the following possible parameters: +options:: [Optional] A JSON object specifying options for the function. -composites;; A boolean. -If `true`, every level of every nested field is displayed; if `false`, only the deepest possible nested fields are returned. -Default `false`. +=== Options -pattern;; A regular expression used to filter the returned paths. +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **composites** + +__optional__ +| If TRUE, every level of every nested field is displayed. + +If FALSE, only the deepest possible nested fields are returned. + +*Default:* `FALSE` +| Boolean + +| **pattern** + +__optional__ +| A regular expression used to filter the returned paths. The pattern is matched against the composite path names, not the individual field names. +| String + +| **types** + +__optional__ +| Determines whether to return field types or values. + +If TRUE, the function returns the name and type of each field. + +If FALSE, the function returns the name and value of each field. + +*Default:* `FALSE` +| Boolean +|=== + === Return Value -An array of objects, each containing two attributes: +An array of objects, each containing the following attributes: + +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **name** + +| The full path to every possible field within the source object, subject to the specified options. + -name:: The full path to every possible field within the source object, subject to the specified options. -+ The result uses xref:n1ql-language-reference/nestedops.adoc[nested operators] to specify the path to all nested attributes or elements. If any attribute names within a field path contain special characters, they are escaped using backticks (`{backtick}{backtick}`). -val:: The value of an attribute in the source object; or an array, containing the collated values of similarly-named attributes in the source objects. +| String -The objects in the array are sorted by attribute name, in {sqlpp} collation order. +| **val** + +| The value of a field in the source object; or an array, containing the collated values of similarly-named fields in the source objects. +| Depends on the value returned. It can be a string, number, boolean, or others. + +| **type** + +| The type of a field in the source object. Returned only when the 'types' parameter is set to 'TRUE'. +| String +|=== + +NOTE: Each returned object will have either **val** or **type** (depending on the specified options), and not both. +Also, the objects in the array are sorted by field name, in {sqlpp} collation order. === Examples @@ -767,11 +883,12 @@ The objects in the array are sorted by attribute name, in {sqlpp} collation orde [source,sqlpp] ---- WITH input AS ({ - "attribute": {"first-part": 1, "second-part": 2} -}) + "attribute": {"flight-name": "AI444", "flight-number": 737} + }) SELECT OBJECT_PAIRS_NESTED(input) AS nested_pairs, OBJECT_PAIRS_NESTED(input, {"composites": true}) AS nested_pairs_comp, - OBJECT_PAIRS_NESTED(input, {"pattern": "first"}) AS nested_pairs_pattern; + OBJECT_PAIRS_NESTED(input, {"pattern": "name"}) AS nested_pairs_pattern, + OBJECT_PAIRS_NESTED(input, {"types": true}) AS nested_pairs_types; ---- .Results @@ -781,35 +898,45 @@ SELECT OBJECT_PAIRS_NESTED(input) AS nested_pairs, { "nested_pairs": [ { - "name": "attribute.first-part", - "val": 1 + "name": "attribute.flight-name", + "val": "AI444" }, { - "name": "attribute.second-part", - "val": 2 + "name": "attribute.flight-number", + "val": 737 } ], "nested_pairs_comp": [ { "name": "attribute", "val": { - "first-part": 1, - "second-part": 2 + "flight-name": "AI444", + "flight-number": 737 } }, { - "name": "attribute.first-part", - "val": 1 + "name": "attribute.flight-name", + "val": "AI444" }, { - "name": "attribute.second-part", - "val": 2 + "name": "attribute.flight-number", + "val": 737 } ], "nested_pairs_pattern": [ { - "name": "attribute.first-part", - "val": 1 + "name": "attribute.flight-name", + "val": "AI444" + } + ], + "nested_pairs_types": [ + { + "name": "attribute.flight-name", + "type": "string" + }, + { + "name": "attribute.flight-number", + "type": "number" } ] } @@ -923,7 +1050,7 @@ SELECT OBJECT_PAIRS_NESTED(special_flights[*], {"composites": true}) AS nested_p ] ---- -Compare this example with <>. +Compare this example with <>. ==== [[fn-obj-paths,OBJECT_PATHS()]] @@ -1415,6 +1542,112 @@ LIMIT 1; ---- ==== +[[fn-obj-type,OBJECT_TYPES()]] +== OBJECT_TYPES(`expression`) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function returns the data type of every field in the supplied object, as reported by the xref:n1ql-language-reference/typefun.adoc#fn-type-type[TYPE()] function. + +=== Arguments + +expression:: An expression representing an object. + +=== Return Value + +An object with the same fields as the input object, but with all values replaced by their corresponding data types. + +=== Example + +[[obj-type-ex,OBJECT_TYPES() Example]] +==== +.Query +[source,sqlpp] +---- +SELECT OBJECT_TYPES({"flight": "AI444", + "duration": 180, + "gate": NULL, + "aircraft": {"model": "Boeing 737"}}) + AS object_types; +---- + +.Results +[source,json] +---- +[ + { + "object_types":{ + "flight":"string", + "duration":"number", + "gate":"null", + "aircraft":"object" + } + } +] +---- +==== + +[[fn-obj-types-nested,OBJECT_TYPES_NESTED()]] +== OBJECT_TYPES_NESTED(`expression`) + +[.status]#Couchbase Server 8.0# + +=== Description + +This function returns the data type of every non-composite field in the supplied object, as reported by the xref:n1ql-language-reference/typefun.adoc#fn-type-type[TYPE()] function. +Additionally, all composite type fields (ARRAYs and OBJECTs) are recursively processed in the same way, returning the data types of all nested values. + +=== Arguments + +expression:: An expression representing an object. + +=== Return Value + +An object with the same fields as the input object, but with all values replaced by their corresponding non-composite data types. + +=== Example + +[[obj-type-nested-ex,OBJECT_TYPES_NESTED() Example]] +==== +.Query +[source,sqlpp] +---- +SELECT OBJECT_TYPES_NESTED({"flight":"AI444", + "crewMembers": ["Alice Bobson", + "John Flo", + true], + "gate": NULL, + "aircraft": {"model": "Boeing 737", + "capacity":200}}) + AS object_types_nested; +---- + +.Results +[source,json] +---- +[ + { + "object_types_nested": { + "flight": "string", + "crewMembers": [ + "string", + "string", + "boolean" + ], + "gate": "null", + "aircraft": { + "model": "string", + "capacity":"number" + } + } + } +] +---- +==== + + [[fn-obj-unwrap,OBJECT_UNWRAP()]] == OBJECT_UNWRAP(`expression`) From f1cb69a0fea76033264a012883ce09ea7b3b77d5 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Wed, 30 Apr 2025 16:18:22 +0530 Subject: [PATCH 19/80] [DOC-10023] Add IS UNKNOWN Syntax (#343) --- .../n1ql-language-reference/element.png | Bin 3845 -> 3843 bytes .../n1ql-language-reference/exponent.png | Bin 7906 -> 7905 bytes .../n1ql-language-reference/fraction.png | Bin 3857 -> 3855 bytes .../images/n1ql-language-reference/hex.png | Bin 4670 -> 4664 bytes .../n1ql-language-reference/integer.png | Bin 5674 -> 5676 bytes .../n1ql-language-reference/is-expr.png | Bin 16856 -> 22890 bytes .../unescaped-identifier.png | Bin 15482 -> 15472 bytes .../comparisonops.adoc | 43 +++++++++++++++++- modules/n1ql/partials/grammar/n1ql.ebnf | 3 +- 9 files changed, 44 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/assets/images/n1ql-language-reference/element.png b/modules/n1ql/assets/images/n1ql-language-reference/element.png index 956dac77dcd3daf5d27c5f27fa3050f64ef80180..c8e901cb6f921165ad01e4d231fc8bbe4a0b35ea 100644 GIT binary patch delta 3731 zcmV;E4s7v-9)li`lz&=DL_t(|+U;ElSk%@UJ((F+!3{(}+z~}-RmQzmt=6qt>xO8b zwbs7YeXq4vpRKL>JzAq%JN6_UMJa`aH zO-&g!y|1z{K_a1Gyr7y155Mr~#EC9o7-4t*Y5rYZT}Yu|Ntn1uBB4NV{J@&Yaj{qG zj~qEd6y^Ew!w;Y^P$-BuY@zIgz7h!qfY7tytKKC9G=DWQ5k+}uIr_i(CLPcnqG-y~K4((cVnl~TcKy2Q+ z3)_D2fkGjN()sl&r(tK;3`dS0GgUKc$HrFJn3je-UDtU{d7(LzRYj2|}wDJc(NW>&9S zBy85K8TRcDKvq_Erd*Au#2fyl>pHJ4FM2p)jI|Yx7Zzd}DaRW2*)dbpHgr*`Fh=Q! z0CKa={WBI1N`?xw?AQIUOo-x>$%`gV;&5>K`i)!IxoaODKFolzu@U<8R>Ecc$a0Ur zbARU^_6Ht)>3)AB zUwVN-U9??pqT2TB3I}!vFSwhWY&`hwL7b(Tk?|N-O)Syx&0fU&WWmjS6Cpb=!KG{> z8W|a(xt&ePHVyB+330i^_;F+LDC=Qc#w|n%Fc+4ie*W7_1aCu#3Ym)`_@~1(6p%~ z#*KZ4-QMBtkNWk^v1;XFPRmKlH*&;q?A;&OkZe+Ks23zGj~6lqM+$*&$|GNeB!AR^ zBoIaX?J%{L{RIU`A{W)!z}(rh=TtMMf5K^+Vc{3Cmi;nK@IMQX{ZOJ1SDQ|%B2Jxti&l= zc~Shoa>=M6VKzzRZUyAhwqGk~frv+4M?B(BWOE1)!v+8G@$vngkdTu{k)z%njJF2# zMrP(S*w{3MTwZaq<$r}}u8@J;>D|EB>A6F zLPFBJZCz0!+V)o#=Gkz6W`fyWJE3!A9HP0bynsKF{f6|l*c=rd-Jnb7&Q(7DWJnk? zGM=Dc-=1)Gb}I2?bg3y$hJ@lW=}kvQ$6>hjfNG_&Wy?0GRDY@>4l)R(!;qvs7|UrG zCUzmcir0vpMpde}UQJ$w{H8JCu*1yvVVAjhevkQF4R7vC!xu6wmr~< zuk@2{ColP5P>?DsJ6jY4j88~FN=j-GNz^z)nBtr(!*4uYu1T?d#7)BRyT~Cw#(brJ zJ}T#yrKLsm!GniHK|(q#Qz~4hkv}`A$LHyC#>Ms#HwlZw2(MotW#wis_3`y9qz!r@ zBQrA-mwzwEXlgBy)Y^c;q9GK%z(5CY=7{o>&qKivf>rtX4?{!41YM5x>ph{lk<<(# z2|Z3l#^biw>?PV67>rF#*Z%IaTd=OMpr8Q9jt6TtACW}~IW~yVR^pwD=6=%V#Kgp$ z8#itWGXK85e#pHLLj~3|o`7 zpods(CF-f+65a3$Oxoj7^9fRHL_ACE%N=u7~5&9+CW5L4xE7B}kA+C_y5j1PKxe zC4WdHlpsMOp#+J95+q0@l%SUo^Ev@yU6L@Tw;ewpz>7`W zP6NI*?uzY^QAtAY&ugV#8;yPWiYTIeRr^X$% z2enI`AtAY&!|9~zT&H{H^jQz3vooqPEgS{ap1XTDm0g}c=U1@m(W56N*LsmvwMm<7 zZEeub-k#pYc``NTaBP%;tX*^fod_&iH^n2;z;>@t@Vt);c zO^nI^wU0SY`Dg+B{10I7{=+XVDpetzI|LM;td;XD|B>hSEao2p>a2$ z6^!!~_@z*W<@eKSe^xG?Jhr1#1uGp9^UMUFkOE&$oEVH~3(3QQ8aV7frT5f6-Uf%4d%r-O;#l zBdYkBYox}9wl4)>+miF5>gq7LIy4j18?FLSCFQTQFYVeL)(tx(BTtMI={w-;Q{@7Bj6PQMQvEM z+JlvrUA}A{r}?59cSc5rGE#S}#$9#Np!H4boz_3K17AW%dK->Q!txcIpt>ehIjDgF zW;;8UtsJCvScV5}JBomSqknL9Et<%F^m{|`-S?ZYVBW{<_N)4K0|&l=MhzR3Z1469 z!s)Z;5ft#NR{4o48?71|cNHjY^@@ns9RYPtLXAfxKZB`!0qOCLCF}DFoFRgJrwMNdO+lM1~?YBijAzhSy+1L_?KOLtbtPqiwA4{f`^pkuIa+X^wUe|x+3 z?b~91;1QOD73tf}n)@aGyLK7cJMi}gPi<-3iMmb5C5pA}RCHoVuCSkk;w6h`z};;{ z$+Cj9?Pxo(SWo01$bZYr$MjiWV3O--3?0&+xAOi&;|{FGonRq~H>uDZ{h#)D4UG&~^{28(b|?8BqNA^{i-+gWFYSA8)DUb~w~CYU)`rHNM8ax-OKrO@ zT{hxs)NPqTw_%QuhRCM*)+SI#w zc>cn6Jov;x63*#$5)*G!>-<+W?uZw>a*<<=yV`~vB7)v(+r0t{i$?6YqjMK0n3`7p zZJ*lGxRb(h4WO^ucBN67=g;M#wlwafa9jh3RohO3+S0g_NLWLNP1{a`TGqIeNLUky zP1{a`TGqIeNPk#Uh(+5@1087GNhGW(#G-Adf!HKJByVZSIBA;p_hfUD~?c&JD8%C*d)f}VkTi~2C`Dq@qIHZ*pSU`0(Tej xBy0snT*fJ}*-6s26AB0GfX1B!2|C070by9bnqoIdBn$um002ovPDHLkV1mtQH<$nb delta 3733 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 delta 7826 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 UNboa^XV0D~$g0XzNqr3dAJ~F)Z~y=R diff --git a/modules/n1ql/assets/images/n1ql-language-reference/fraction.png b/modules/n1ql/assets/images/n1ql-language-reference/fraction.png index 06c267547628eb0fdad1db232d4515887f82e925..984673c1acc7a6459abe8f19bd294130c9711ec8 100644 GIT binary patch delta 3743 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 LNkvXXu0mjf?siEc diff --git a/modules/n1ql/assets/images/n1ql-language-reference/hex.png b/modules/n1ql/assets/images/n1ql-language-reference/hex.png index 395e6d74f8e86555b5e039fe02edccd5a43d0c09..01387309f60d1442b2cdeb87a04ea681c7dbc6b7 100644 GIT binary patch delta 4428 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 KMNUMnLSTaNZQCXQ diff --git a/modules/n1ql/assets/images/n1ql-language-reference/integer.png b/modules/n1ql/assets/images/n1ql-language-reference/integer.png index f9947999e07c3833fb81a151d015d847f6c37791..7de931aa7d972214d6113b72968fe9e32f7d5c16 100644 GIT binary patch literal 5676 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 literal 5674 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 z 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 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/unescaped-identifier.png b/modules/n1ql/assets/images/n1ql-language-reference/unescaped-identifier.png index 8c0c81fbb0a066d59d7006d419de83c3e844dfe1..b04fe844f5bc32fadf8806b5ab06639014876d29 100644 GIT binary patch literal 15472 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 IqVNBI0rBZA2><{9 literal 15482 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 sH{)3yV0ll4EL%tb6D Date: Fri, 16 May 2025 14:45:23 +0100 Subject: [PATCH 20/80] DOC-13223 sizing guidelines, note on residentRatio (#347) * DOC-13223: rebased to 7.6 * DOC-13223: changed to note * Update index-partitioning.adoc --- .../n1ql/pages/n1ql-language-reference/index-partitioning.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc b/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc index 926aef492..8d2fdb0a3 100644 --- a/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc @@ -532,6 +532,8 @@ Non-array fields will be ignored. | `50` |=== +NOTE: Couchbase recommends setting the residentRatio property value over 10 to avoid issues, for example, index build failures. + To provide sizing estimation, you can use a command similar to the following examples. [.server] From 2ed879290c3726a143febdbe4b0463364bb7dcdd Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Tue, 10 Jun 2025 09:46:56 +0530 Subject: [PATCH 21/80] [DOC-10001] Add new logging qualifiers to system:completed_requests (#361) --- modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc index e0adb6742..def55f9b5 100644 --- a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc +++ b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc @@ -826,6 +826,8 @@ A completed request is logged if _any_ of the qualifiers are met (logical OR). `client`:: Log requests from this IP address. `user`:: Log requests with this user name. `context`:: Log requests with this client context ID. +`statement`:: Log requests that match the specified LIKE search pattern in the query text. +`plan`:: Log requests where the specified plan field values appear in the query plan. For full details, see xref:n1ql-rest-admin:index.adoc#Logging_Parameters[Logging Parameters]. From 41b92cd7cb9997029e4578b00b90e706f375f023 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Thu, 12 Jun 2025 15:41:47 +0530 Subject: [PATCH 22/80] [DOC 13257] Add new fields to system:completed_requests and system:active_requests (#363) --- .../n1ql-manage/monitoring-n1ql-query.adoc | 192 ++++++++++-------- 1 file changed, 102 insertions(+), 90 deletions(-) diff --git a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc index def55f9b5..fc81f8ca6 100644 --- a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc +++ b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc @@ -285,42 +285,47 @@ Getting active requests, as described in <>, returns results sim [ { "active_requests": { - "clientContextID": "832adfa0-e9e6-464e-b5e6-b7ec7549d511", - "cpuTime": "111.877µs", - "elapsedTime": "77.631814ms", - "executionTime": "77.517185ms", - "n1qlFeatCtrl": 76, - "node": "127.0.0.1:8091", - "phaseOperators": { - "authorize": 1, - "fetch": 1, - "primaryScan": 1, - "project": 1, - "stream": 1 - }, - "phaseTimes": { - "authorize": "4.998µs", - "fetch": "69.519µs", - "instantiate": "16.28µs", - "parse": "597.435µs", - "plan": "24.141851ms", - "plan.index.metadata": "24.005473ms", - "plan.keyspace.metadata": "2.022µs", - "primaryScan": "23.496033ms", - "project": "824ns", - "stream": "2.242µs" - }, - "queryContext": "default:travel-sample.inventory", - "remoteAddr": "127.0.0.1:37506", - "requestId": "05cc1895-9986-4819-b4d3-8a4311e8f319", - "requestTime": "2024-05-21T13:29:16.864Z", - "scanConsistency": "unbounded", - "state": "running", - "statement": "SELECT * FROM system:active_requests;", - "statementType": "SELECT", - "useCBO": true, - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0", - "users": "builtin:Administrator" + "clientContextID": "8c169ed1-9e1a-486a-a1b9-1c2ac8e327a4", + "cpuTime": "22.915µs", + "elapsedTime": "30.092625ms", + "executionTime": "30.012ms", + "ioTime": "8.366709ms", + "memoryQuota": 1152921504606846976, + "n1qlFeatCtrl": 76, + "node": "127.0.0.1:8091", + "phaseOperators": { + "authorize": 1, + "fetch": 1, + "primaryScan": 1, + "project": 1, + "stream": 1 + }, + "phaseTimes": { + "authorize": "7.584µs", + "fetch": "5.708µs", + "instantiate": "15.708µs", + "parse": "266.875µs", + "plan": "13.737208ms", + "plan.index.metadata": "13.577125ms", + "plan.keyspace.metadata": "45.915µs", + "primaryScan": "8.370458ms", + "project": "666ns", + "queued": "1.459µs", + "setup": "62.375µs", + "stream": "2.542µs" + }, + "queryContext": "default:travel-sample.inventory", + "remoteAddr": "127.0.0.1:34064", + "requestId": "9860351c-d837-4b42-ad2f-a5b3cbcfeb4b", + "requestTime": "2025-06-05T10:31:34.423Z", + "scanConsistency": "unbounded", + "state": "running", + "statement": "SELECT * FROM system:active_requests;", + "statementType": "SELECT", + "useCBO": true, + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", + "users": "builtin:Administrator", + "waitTime": "8.376917ms" } } ] @@ -732,62 +737,69 @@ Getting completed requests, as described in <>, returns resul [source,json] ---- [ - // ... { "completed_requests": { - "clientContextID": "a19a61ab-cd9e-46c9-be71-92623ff85741", - "cpuTime": "912.408423ms", - "elapsedTime": "3.762926948s", - "errorCount": 0, - "errors": [], - "n1qlFeatCtrl": 76, - "node": "127.0.0.1:8091", - "phaseCounts": { - "fetch": 24023, - "primaryScan": 24023, - "primaryScan.GSI": 24023, - "sort": 24028 - }, - "phaseOperators": { - "authorize": 1, - "fetch": 1, - "primaryScan": 1, - "primaryScan.GSI": 1, - "project": 1, - "sort": 2, - "stream": 1 - }, - "phaseTimes": { - "authorize": "15.111µs", - "fetch": "3.641125449s", - "instantiate": "332.963µs", - "parse": "1.04015ms", - "plan": "602.878µs", - "plan.index.metadata": "25.849µs", - "plan.keyspace.metadata": "11.586µs", - "primaryScan": "101.118572ms", - "primaryScan.GSI": "101.118572ms", - "project": "33.273783ms", - "run": "3.760767643s", - "sort": "666.364325ms", - "stream": "1.617688ms" - }, - "queryContext": "default:travel-sample.inventory", - "remoteAddr": "127.0.0.1:37684", - "requestId": "e170bf67-d364-4ed7-9698-784bbb779d18", - "requestTime": "2024-05-21T14:31:46.882Z", - "resultCount": 5, - "resultSize": 17714, - "scanConsistency": "unbounded", - "serviceTime": "3.762768429s", - "state": "completed", - "statement": "SELECT * FROM route ORDER BY sourceairport LIMIT 5;", - "statementType": "SELECT", - "useCBO": true, - "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:126.0) Gecko/20100101 Firefox/126.0", - "users": "builtin:Administrator", - "~qualifier": "threshold" - } + "clientContextID": "99c776c2-438e-449e-b3f5-7585f2c41b62", + "cpuTime": "912.042µs", + "elapsedTime": "10.237875ms", + "errorCount": 0, + "errors": [], + "ioTime": "5.338667ms", + "memoryQuota": 1152921504606846976, + "n1qlFeatCtrl": 76, + "namedArgs": {}, + "phaseCounts": { + "fetch": 5, + "indexScan": 5, + "indexScan.GSI": 5 + }, + "phaseOperators": { + "authorize": 1, + "fetch": 1, + "indexScan": 1, + "indexScan.GSI": 1, + "project": 1, + "stream": 1 + }, + "phaseTimes": { + "authorize": "19.084µs", + "fetch": "1.1245ms", + "indexScan": "4.312417ms", + "indexScan.GSI": "4.312417ms", + "instantiate": "233.666µs", + "parse": "1.087875ms", + "plan": "1.453375ms", + "plan.index.metadata": "149.833µs", + "plan.keyspace.metadata": "13.543µs", + "project": "49.541µs", + "queued": "417ns", + "run": "6.39025ms", + "setup": "913.667µs", + "stream": "696µs" + }, + "queryContext": "default:travel-sample.inventory", + "remoteAddr": "127.0.0.1:34066", + "requestId": "73fcdccc-da70-40e9-95f6-f8566acb671c", + "requestTime": "2025-06-05T10:38:32.904Z", + "resultCount": 5, + "resultSize": 17714, + "scanConsistency": "unbounded", + "serviceTime": "9.305625ms", + "sqlID": "4c7b735499e4f5e84d031c1ee327d66e", + "sessionMemory": 1048576, + "state": "completed", + "statement": "SELECT * FROM route ORDER BY sourceairport LIMIT 5;", + "statementType": "SELECT", + "useCBO": true, + "usedMemory": 13374, + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", + "users": "builtin:Administrator", + "waitTime": "9.836667ms", + "~analysis": [ + "High IO time" + ], + "~qualifier": "threshold" + } } ] ---- From b060f77181a6a2b47bfffa3b2524545936da416e Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Wed, 23 Jul 2025 18:07:48 +0530 Subject: [PATCH 23/80] [DOC-12695] New SQL++ Statement - USING AI (#374) --- .../Railroad-Diagram-Generator.png | Bin 0 -> 769 bytes .../n1ql-language-reference/using-ai.png | Bin 0 -> 8979 bytes .../utility-statement.png | Bin 8187 -> 9519 bytes .../n1ql-language-reference/using-ai.adoc | 297 ++++++++++++++++++ modules/n1ql/partials/grammar/utility.ebnf | 12 +- modules/n1ql/partials/nav.adoc | 1 + 6 files changed, 309 insertions(+), 1 deletion(-) create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/Railroad-Diagram-Generator.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/using-ai.png create mode 100644 modules/n1ql/pages/n1ql-language-reference/using-ai.adoc diff --git a/modules/n1ql/assets/images/n1ql-language-reference/Railroad-Diagram-Generator.png b/modules/n1ql/assets/images/n1ql-language-reference/Railroad-Diagram-Generator.png new file mode 100644 index 0000000000000000000000000000000000000000..ef1a5a29f66d4ea0ea32dd05ebbcacc38257ba8e GIT binary patch literal 769 zcmV+c1OEJpP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#00075 zNklJ|ZmB7-FSaCRS=lkr9DOAV_LLmN$LijZjoX5)>gA=uHMu zM$4;$E~31Mh`#9SYDsgcTV>_4F9}S;9L&t-*7o+Cy}6vO1Mhorp7T5BJm>r$jTxr9 z$@h)LBeu#cLsH?!Q2l6o&`h zZ012lDciLIg0Tbww_M><-vF8RV~{+Lgcgaw(bgz5daj8KEtg4Cw8aQ^f!}+x`79hg+#!4TTFQ5ITUFWD)MhKp+C^Pzs1QB{%%EZ@Bj z1Fk8B6Lur6wgNowDYHa$QpbP7njGl=0z==8DgsJXv2B|TUw0oYNdv0|-l!Ex|Bj%NAoxONG2_==}h<9Y)(ySxh>Sf$rG~Th^=V zD8JjQwxI-O2?TJh%%Vc>m9=R0z@lQ&jG2f{4KX_duHMIEK2wj^^_G3POVJWdTi`_7 zQH&l5bI{y+ouS%FHn!a$_lYYWj_G|ylCNsezXEjbZKNR@R$flE$WuL*S@4vJPtGcf zVQ>V$7N$I^MENycAnd%!`SfH8l)_evNYZWb3Bqdn&wF7afHTuZ(f-r;<6dLzRrXN$ zs-K3>gOts&k`h&25WnvSFH(|dsXor5>G6L6_+s~4PC=Ap00000NkvXXu0mjfH5^w7 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/using-ai.png b/modules/n1ql/assets/images/n1ql-language-reference/using-ai.png new file mode 100644 index 0000000000000000000000000000000000000000..a2922a245407196e24e5e261d6950df4ce31af5b GIT binary patch literal 8979 zcmZXa1yCG8*RDxIf;(i9;7)LY%LaD{4#9%Ey9Zw&cyMOQ8cVFa^@B6Fn zf9uxtNKf}ncXhSA=jjvnO+gY3nGhKc4h~IPN=z9J?k(->vpC|1*K6#hM8WHg%t%UE z9uCfv1`h6L5FFgY>#Lu8aBwcHaBv4d;NbX@;ot!F=`BhEuLNfEe;@lX4&kq?Hll45W#|BmeTqJPOq_EK6-aB%2-|IRlFpV5h4i-VIE6IOL! zJkCJS!5ds0$Wqyp-&a><{Hcqnq;y1GokYYbk;j%;T)iy;zK&qih@V$xd8LQGo0ihc8$clyzX98AOt0M@J89!+y*%PSJ$ef-jQJW85T#9c zF$->u%YlLw;1)NaZTd@Z5KT2w3g2Y)eq3Yw&oRpbW1>Ba{nLSi46#StTj~@afNH-2#wUhX6C(oHbig5H;mH>1^Ud)tA3Mho8k& zt!Och=)?s;mE*5KMx4wXOOYe;Iw5sv= zwFUEe7)bd;Trgs;VTp}@C5_@Ixe&5aYNAGBY?pLJ#Y}_Yw8hFg3XXO+@Ux)ytpI+t zr;^t%B1;q-Ci>-U%Xh>DJeEl~VBnm9GY05Z^lL~zNQ)r49Pw=PhEK2MHG zZK^7E|Ia0>6>LC?4)e-#B0TcHHr>d-I$NL1Gb641#6O)FBux)LlH46hR0=Y0NE2}IPrL^Wu#2RfoR;cl3@l}I(TbI<2L>u z*tTd^b5sS<)H&;sH_fRqC8)?rt;&H zY(6iFYRd-P?z)HHd)8l7?~HQAREeS>%Xcr^*>;b}0XiA2itfRIF~-*O1n|*B)l%{r zRo8sxrdB~1A=9Bo5vjpD+kqZ>QqrR#7HBrsPvg?H%oGg7S>F5cc3w6%^fwg_^xt)N z7L`hZO7i0b&XdSMHPnKXIFeCb23r&3+YQkfFy`)CTg2J&)W;E<9me@^w+9}>D-g3P zT|yAQZ_d!zkVq?6f{~n<#dW~LZ7$oWGFi_g32d8vjFE0KcQy%7*4+=BGwQny%4Y;$ zOn_9Yby8pw5iw_~S0rvo4q;m6-{#=1tq#L%Dpow^H|v~Fe*WPBpa?!`9uOzN-^r(DS*24Pho zcKj5p7xW`4=`xaXNf4@tInVR0OCN2%Dxrh2a{IbXZ?vj(G#OH$l4t) zxJ!MsrrWZIhc3Q*ho)*>84+(eI$Fqsr2V+99&74|ubkBsUv?>Wy4Ik*M_M_bRq6jTy0u&!472LyoQql-( z*Z6X*c6X>pWbLJ>8cuj3hW6a|%txUc%cw>Y&cR|7-SI^ZJf0&&3T55PH-lP}CSUG* zh4%KWi|(JGo0&Ym4=wW@KCJ^)tQ_54&&ODJ89zIt^m>0I`EV{hHyjEq>!kG-W>VYM zv>oxTGdFN>O^H^X*qqstN`f02PXw^_vS}5Kpa+K0&ZYocoa;z3V5VQiy|BI_0_iWu zQ8zgj>U*q?J;_X4ls;3&7HLsFuDbAk;+ZXEoXrI)EQqnne(Z<>{@ zE7Zu-TnwS{wqXsjK@W>82u6}XJ%Cq9Y(QAz5~M^~tK<(NkOr3{X$^0>j~Wj2H0=f3bfR555@@9>qD}~ za($A`p(LsAKcBSKJ(nsn<{Gm1xvu%FDpShwWDtX^JPrP66oT7X2bl%%C@f~)&bT5d zhEj5HgjUSLpL2!9gK1eUc04t;rn`Q2DBM}}Vx{vO=UGg<2M!bMk)OJDb?1?2Hs7#R zkN3#U6zDcK5FE^~g;qp;^tMH){_s~j-c`c$qk8QJh6vqkUjAFX9$0(_0L{x#nPKWL zN3gm1Y#sVQ^ojq@&Gp%N(V@ewuX)%-Pk(H43YG-=evpvhVoh5{-%ZADe+!7VTC>Fw zBk{!I`QUWBWrb;1ejdMrEz5rr$~n;UBg6|u(^lMB zn!C~6#l$8o$99mzpP#Png2_=i8}=ANH`eTLHf*Y+c1@=H)QVM>a7jDXaIoaE%U0~= z;>XMG)7G61$qVHVLZ9203`WYbf*CJ3`2 zgbakPzJsd;@$V|uP_dVqT`b6jB+>VE%4{WS zTZFu3-KR&Az$$Zh&-dm#y8L|Ei7w9}(QA{JVWgjdrb##Q3+Er$l_o@~i#7Awy$;P% zkKJB82%i0+_QsuBx1(&2r?8T}>28Hh;k&`!)B20)RxhF}XB7(8J)~CYX_3Q3v;|+% z8k6!Whov=q?$WdYm8ppVY(Li60VK~WTn&Mf-or-*sMdzPzuQ%Q5*^0L@bJ(#k0~Zb zxe2hEi4)H39qCG|6r$vKBC(lRN0HC8;+UJgb$H;Qz&dy&76liIws226w5_ZZvK(>A zw`{!KB|dh8Rx3{6W*@|($E*jtwv1>B!o513L9e$;*|~J(ou9#3;oByNR+XR--+P}} zk8{-UcnA=ruB29&u7bCf@%J5}m^Cw_Og^p~+a#v)7#A*3PTBQ(K9-ZObMQ6O_{4vU z3lLb4cHvNmuUPeo0kQbCg%bZ+>YROc|9WIb%H2O_^;Bi*^$d6>Br28bfA`&kjPcg< zj3+k#H{&Gd@8tBS5$D^j{VAyKH%o_}&ZK%CgYE46QJ}D@-bFYHrKq6sXH^o_7X;{? z@#+WHmH3_tX<}#xMCtczaMs5ZmA^yUQY_jSMzE8v;m=N|RG2EacXH)aGgMQPe zRA|x=VUnBPPj7c7Vip8KlF$KMI;;!a<+MT44oL3!{zb9pd(&RN9ouL&WkFAps0W~N zpO1(vxBwRw+8dk|e!IA-Iu;$4s?-kH7Nx|T- zeoIsD6J+?%G$yN0faePvFG_TeGBlOHi<(M6+e^?NlckBc1T5kJX?&QR(5#LKIC&EV0I@$La#;bg&_Fc8lD`5b~~!}Ig!zg~}2 zcpBcSZyJ{=ducgeSL}#89OmyM;fKC-R}Gd_t)>E&$V9=o=+>ho)|-=MtS3VW$tND9 zZ>F6w?Qq6j%~P4WJzYuae(ZKLyPELPj&`?yc!RirKsN#l0BKzqvF zP{KDa87>=OBvE5PxB$AKt_`$#{cSKxT7b2(W`_{0(?+v(!{};nQO4;Lq(8G_&yyZe zl!m>m+;aUO1@C>uT8-_1)k17hZ|h2j?qj#?p*t#Obft%hM{Q@>QGlIsGot145Mj~t zLuuFbpG1YOT*&kL(=`8FnDx$XT9w(7S@ZPvtD#}L#eG!4907;dEEI# z7!OYiFZj|;BHRA1*Cw;B5q;)<53-5Q)Cl|O);fos`LW}1pxr$|1Wg9}av9}0nR6bVoVH$}PpABs zJ^R}hh-^yaR41hhN{Q>@tjg^o@Ga5njSRA#@r=be4=PFDJ)gb7#%xJ5;>q?suipXy zhAwzJb#_O10$tZbM90wc!7gbTcO)NdRdB9TgKY~}bDzRn`HuFlLv;deOl zt7DN+Cl0CK8m8(Ed&UoezqV9v{HD}PA(Tses zij)`J6ZD!KiQMjr!a@czoeMZ!i9hv!#8ES^86 znpu3B^}KLiQNcN8l7GAhcO5uBHlETVp2~UP;3GbZ6%-sFi2+uGTxs`3NN_i7&XVco zgJX3+4LS%b6GZL*wRm?1t>c`pf2m2f+y9ZLH7Jfk+RSD?&5qBW({q~Z!ZUA#EweuAhc#AoAFL9M!FYcFr=X!J5 zxg5nt>ci3!`?)N-rtUq5+Z$p~Hl~iqXcR_7uSW=em zgiEuKzBZNy=$}*9S6h`?>>zqg0o&vL>Qdei7eH##->v}kg~i^jbUlyHw{4<+TG>G| zaJ%T*82OeFF^$qZy5nl@zpaHl<~JEnG3?TtUn9mPb zg;V6oZb1CG{cT{6`w>F)8|dL3*ESMH%yw=lkVRa-(NOY?4~m?%MN z*#SC0{d4FI>Z4YlOG+HRKDwA?=Ve}<=&#~8{5(pS>)?q+LfOOi$0GlnDoDH!lr3+x zIp;-<=r>}eUbsCV%k#FQgi;ku=N&$69?u;dtx5)FvkLK;yeMTr)sk6dT0^4Vvv z);yM#zJ5yz?iEK~>Q-$aox#^>MnyxB%`d*Td&>-WWrgQ^F~d5G{WmSUtzS|6$L|m| zY0um=PwM^$w zXIU>xnm+NJ_~+5KPiA)%xSJxLKJ(OgDRtN&qugxikqNaU+O-w=H7LO^jU;RGxo;6B z`taTq9FI`M{9c3a9J!H@7-O!)r|c2r6;B|zCBf_a)2C`Mcu`1SqBnFXjkUj}r8ylv zf@(W7=MyBT#4}8EGgyY+%>)oK#b!dFQv})m92`ObE}c)pQvsp#w|lbM2f_Q zFlY(*;mV;PMlmr9bh&QKXHsNJXlqCLbb=*umco5>-rc71eED-b``hL}KmzZAIgxN+ zae)nqz!617mrqu9I8ZXoBrO|z_ji|d4Wp8-!F6k%SQzOrHXg#Q4l2=}^3MK6MU~ry z08;~d_Q^PTxCf3B7C$HZL^y_Ds?03QI{`Zjif#`x=MqW$s}-0i#Nvvx2k;@U zRsfk)`c`jQ;kdZlsZ@doD9 zFBdKB(|*)D4DKVLPmFFBMp3WGZgP4SpQ|2i?Vv|m9ungBjY7aqV)K_5JPz&fJ@eesaVtkL9;OKl&57dMK;&C*Pr)XQIrA+Y6tClwLpq{A zmH_ij5*jj~?bs>@(1yq*_i^x_H41q!m}qY3z7Nz-7^%$nnmbynHSEp6G74QV?C-gm zn2l2pGurJ5Q!GD{XR}aMxj)J4W=?ZMSaz^1`LuKVhetRm?m~R!Ov4r970AApRy<7X z(o@7z0xHGONw!|O{LyzHemq&D1!hRYU@jg&s~6WsP+1{}s3dl9>@q&}A_EL+qa)D< z(DCORzul1UYIWo~MaQqcKq+EilDp`+thNn{kYi4=wLOGG=KBwb6;Z`=KRcYPjn;@F zw$!!>lGgKQH?^k>)1kQUAAa*xQit?!#9(gc(|!wyuG-CWd@CAyqh-yhEgbJ|rb^=~K z!W8Nov|eHH-NvcTo_u}rl==xtt}hO}Qb}w)5(qFHYY1$G0T;^OJUc;^_F=nD|DnW# zbI%TRxG;sF9AVvek4;iD9F7-LD*tFM0qm)Qlpl15{<2Q>YJH%Di3O~6+C^`7-fiAI z1$kS53D@9P-8Rl3*JhQ=YpeClcP1K`<9cBt+yIoZ=c+Kx%-EE`TcLKEj>_-z$dNYT zzJu|6elpZ@)M|TeGSc9#VGbdDq2fH#g{;tuu2;mH=*`yhea1>X%O(Cde(!-BkZ<%q z&E3C_(d|?hY8OW$WK=7=HtlPrb->Ps^{#TsLG#%|cF$baVb3{8bKtz02qTHBu<7Vp zj|x0@(<~O+Idu|0_^GPDN&j4Tqg+B7QWh;a#CchRN~eua}W22>A1Wy z;M2Ic+6WILW&v8Yot1A8L!9$d@y;C_TJZ5f_t_Xl!;x1WvXE}dzb*qWTG)pg z3_rKH04;?0eDcA89nH_8F3QCio9?V9>I*D3viDP0?q*`RotlZHyDx{UtsuFv0EUZ(v$H{G8pBIIB%iB6tk| zf;W3fCuW#T;qwh~TL4PZ=~r3V4=_^~HeWf6y?x8h^M|p6bGRF}q!}v!Un^4Xg(w@X zn7{j~O^o9@JkRjBb5n)YeT=(Us~5Aj5FIl! zQ3*#wG-n9wu#w$?9U5QH$~8Oq3V9bE367pdb<38jVQ+n(HW?+*kN?5JE(j16OVMzx zSl7LM`#NdPNH5Eyy|6ZoY{*GO)xdVSSIdmQ$yl~(RSf0t(t;7-H_!hvi9NGyiN}Hw z&u=1e9B9(%^N2P=Z7}+35Xgr?AQ=EjqQddmh;^qMDOGq0gX5(u>mzB9!EK^PjMeZ& zNg%N;yMOf|WHgz>CuV*pKKj9EV9TxVRvk=~y#}Jzd;*I#xmdhO5gUOQ+kN|2$o`7q zD0RB~Nby6sN74;=qU6@QN&h-9?T_WxISj^(aps#1ud_U<SY&Ml>Z$iF$ra#PrVw7owqHvxa3!!MOm zG@i_Bo+tN6-+30i@OE@|4UidMhnjE$?Jng$88CV&u`h!i=V%THGA{pBR!7~_L(zvg zV6OdTcbxFpx>qhJ@{Kr2Bcr3jjwIAXF~}{{+T=s@yi(<08CFqlKr4$$NQq2N&d>d8 zYM3Xzx#%$!o9&RdNMTdY1J&iR{1thHMU=$Yp@_eP6K`4}IvSPLQ!Q_VN-*(8boKaK zg)5q};1g#M@#H&o{>mMxiD*N)|ICfL?R1beT-^#Zm(Tn-$*Ja)>@>vHnJL94IT5C4 zkwIUf8^&wrtO=q03vF_jX4x!%okY|@IQ~^!E=eOk zb3Nqw+W5TE-$(WN2!y-}t#h_Q?+4)gye6nAdXlmwSEF%PaS~|1Mffb>oUlME`)gyN z&9p^RFE8Yc1e%-pDS3oJc4fr%pQ0_fEHf3jl8aY%aG^n&pHI)F~cD- zW_Q>A`PCUg@1HM#JjyNmIexsxKnm_#0DCYo&Z}Y!!^ss{cc7|-A;L;!9A(rC1RHK8 zTe|0^q8TXuE%JyW@@PiKN6A5`&A}zM_2A7w$pmh=q`}BnovT`s_MQEW(kecId4DKS zzI@i>s;z+FxF z{yo9Nt8J@fNXyhe0qy2d|E-kx*_qlWMTOC4_mQ5@BlVs4Ii&;H|G#o)uz20epAv@f zlCRPU-By8zg(O=xyL!=DF%U*|7nAd{v~|DKbB4&<^vZaQmFzE^VaNpSg3Z$%qJL~q z@xFY}NtT)rrRat~<#(4Vkb5-(`1S+cW31zn840>UbwFD>RIrg06GA_yn{=$ XkvwwvnEUFA0w*o5AXXvrBjEo4!M2cF literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/utility-statement.png b/modules/n1ql/assets/images/n1ql-language-reference/utility-statement.png index dbef92b7d1655ee89f9765cfac92712e89d8677b..52b5617f154ecb945dad5b80603afe2c86a95c5c 100644 GIT binary patch literal 9519 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 iPnd9`m~Y0Op=eb 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 Yb%;1Bn&vkS8o7f>ipq+V3+em*9}7GAdH?_b diff --git a/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc b/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc new file mode 100644 index 000000000..0533a0323 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc @@ -0,0 +1,297 @@ += USING AI +:page-status: Couchbase Server 8.0 +:page-topic-type: reference +:description: The USING AI statement allows you to generate SQL++ queries from natural language prompts. + +[abstract] +{description} + +== Purpose + +You can use the USING AI statement to input natural language queries through {sqlpp} interfaces such as the CBQ shell, REST APIs, and SDKs. +When executed, the statement passes the input to Large Language Models (LLMs), which interpret the request and return the equivalent {sqlpp} query. + +For example, you can input prompts such as `How many airlines are based in Europe` or `List the names of all hotels in the same city as an airport`, and the statement will generate the corresponding SQL++ queries. + +If USING AI generates a SELECT query, it automatically executes it and returns the results. +For all other query types, it returns the generated query as a string without executing it. + +IMPORTANT: With the introduction of the USING AI statement, you might notice that AI is now recognized as a keyword. +However, this change has been implemented in a way that does not break existing queries or applications where "ai" is used as a field name or identifier. +For example, queries like `SELECT ai FROM XYZ` will continue to work without any issues. +AI is treated as a keyword only when used in conjunction with the USING AI statement. + +== Prerequisites + +Before using the USING AI statement, make sure you have: + +* A Couchbase Capella account. +* Your Capella account credentials and organization ID readily available. + +NOTE: Although the USING AI statement requires a Capella account, you can use it with any Couchbase Server 8.0 instances. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/utility.ebnf[tag=using-ai] +---- + +image::n1ql-language-reference/using-ai.png["Syntax diagram: refer to source code listing", align=left] + +natural-language-request:: A natural language prompt that you want to convert into a SQL++ query. + +options:: + +[Optional] A JSON object specifying additional <> to guide the statement execution. +By default, the statement uses the `natural_orgid`, `natural_cred`, and `natural_context` request parameters to determine the organization ID, credentials, and keyspaces for the request. +However, you can override these defaults by using the <> object. + +//TODO: Add links to `natural_orgid`, `natural_cred` and `natural_context` when available in the 8.0 documentation. + +[[optional-parameters]] +=== Options + +[cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **creds** + +__optional__ +| Credentials to authenticate the request. + +Can be one of the following: + +* A string in the username:password format, which matches the `natural_cred` specification. +//TODO: Add link to `natural_cred` when available in the 8.0 documentation. +* An object with the fields `user` and `pass`, similar to the xref:n1ql:n1ql-manage/query-settings.adoc#Credentials[`creds`] parameter. + +If specified, this value overrides the `natural_cred` parameter, which by default contains your Capella credentials. + +| String or object + +| **keyspaces** + +__optional__ + +| One or more keyspaces for the request. + +Can be one of the following: + +* A string matching the `natural_keyspaces` specification. +//TODO: Add link to `natural_context` when available in the 8.0 documentation. +* An array of comma-separated strings, which when joined, form the value. + +If specified, this value overrides the default `natural_context` parameter. + +| String or an array of strings + +| **orgId** + +__optional__ + +| Organization ID for the request. + +If specified, this value overrides the `natural_orgid` parameter, which by default contains your Capella organization ID. +//TODO: Add link to `natural_orgid` when available in the 8.0 documentation. + +| String + +| **execute** + +__optional__ + +| Indicates if the generated statement should be executed. + +If `TRUE`, the generated statement is executed immediately and the results are returned. + +If `FALSE`, the generated statement is returned as a string without execution. + +*Default:* `TRUE` + +| Boolean +|=== + +=== Handling Passwords Securely + +Use `creds` and `natural_cred` parameters with caution to avoid exposing password information through history files or logs. +When working with the cbq shell, avoid passing passwords directly on the command line. +Instead, use the `\set` command to specify only the username, and then enter the password at the terminal prompt. +This ensures that the password is not recorded in the shell history. + +Similarly, if you are sending requests directly to a REST endpoint from a shell, be mindful of how you provide the password and whether it will be recorded in the shell history. +Consider using a method like the following to prompt for the password: + +[source,sh] +---- +echo -n "Enter your password: " +read -s p +echo +curl -s -d "natural_cred=:${p}" ... +---- + +If you choose to reuse the password by setting an evironment variable, note that it might be visible to other users on the system with sufficient privileges for process inspection (for example, through `/proc`). +If security is a concern, consider using an HTTPS connection. + +== Examples + +In the following examples, replace `natural_cred` and `natural_orgid` with your Capella credentials and organization ID, respectively. + +.Natural language prompt with default request parameters +==== +Copy the following sequence and paste it into the xref:n1ql:n1ql-intro/cbq.adoc[cbq shell]. +Note that you must be using cbq shell version 8.0 or later. + +.Request +[source, console] +---- +\set -natural_context travel-sample.inventory.hotel; +\set -natural_cred username@example.com:P@ssw0rd; +\set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; +USING AI How many hotels provide free parking?; +---- +.Response +[source,json] +---- +{ + "requestID": "097f9cbf-57f2-4832-986d-4f85041c91dc", + "generated_statement": "SELECT COUNT(*) FROM `travel-sample`.`inventory`.`hotel` + AS `h` WHERE `h`.`free_parking` = TRUE", + "signature": { + "$1": "number" + }, + "results": [ + { + "$1": 253 + } + ], + "status": "success", + "metrics": { + "elapsedTime": "2.244083167s", + "executionTime": "55.577625ms", + "resultCount": 1, + "resultSize": 25, + "serviceLoad": 3, + "usedMemory": 16511, + "naturalLanguageProcessingTime": "2.188224375s" + } +} +---- +==== + +.Natural language prompt with a custom keyspace +==== +Copy the following sequence and paste it into the xref:n1ql:n1ql-intro/cbq.adoc[cbq shell]. +Note that you must be using cbq shell version 8.0 or later. + +.Request +[source, console] +---- +\set -natural_cred username@example.com:P@ssw0rd; +\set -natural_orgid 7a99d00c-f55b-4b39-bc72-1b4cc68ba894; +USING AI WITH {"keyspaces":["travel-sample.inventory.airline"],"execute":false} \ +How many airlines are based in United Kingdom?; +---- + +.Response +[source,json] +---- +{ + "requestID": "a6dfea34-6445-4e66-9127-9bdfbe5f7585", + "status": "success", + "generated_statement": "SELECT COUNT(*) AS `airlines_based_in_uk` FROM `travel-sample`.`inventory`.`airline` + AS `a` WHERE `a`.`country` = \"United Kingdom\"", + "metrics": { + "elapsedTime": "2.485615126s", + "executionTime": "0s", + "resultCount": 0, + "resultSize": 0, + "serviceLoad": 0, + "naturalLanguageProcessingTime": "2.484809668s" + } +} +---- +==== + +.Natural language prompt with all parameters directly in the statement, overriding the default ones +==== +Copy the following sequence and paste it into the xref:n1ql:n1ql-intro/cbq.adoc[cbq shell]. +Note that you must be using cbq shell version 8.0 or later. + +.Request +[source, console] +---- +USING AI WITH +{ + "creds": { + "user": "username@example.com", + "pass": "P@ssw0rd" + }, + "orgId": "5c670d3e-12a3-456b-7c89-123456789ab", + "keyspaces": [ + "travel-sample.inventory.hotel", + "travel-sample.inventory.airport" + ], + "execute": false +} +List the names of all hotels in the same city as an airport; + +---- +.Response +[source, json] +---- +{ + "requestID": "e154f6d5-0fa0-4de3-8824-3ebb73cb49f2", + "status": "success", + "generated_statement": "SELECT `h`.`name` FROM `travel-sample`.`inventory`.`hotel` AS + `h` JOIN `travel-sample`.`inventory`.`airport` AS `a` ON `h`.`city` = `a`.`city`", + "metrics": { + "elapsedTime": "4.032734417s", + "executionTime": "0s", + "resultCount": 0, + "resultSize": 0, + "serviceLoad": 0, + "naturalLanguageProcessingTime": "4.032041335s" + } +} +---- +==== + +.Natural language prompt submitted directly to the Query REST API +==== +.Request +[source, sh] +---- +echo -n "Enter your password: " +read -s p +echo +curl -s -d "natural_cred=username@example.com:${p}" \ + -d 'pretty=true&statement=USING AI WITH {"keyspaces":"travel-sample.inventory.landmark","orgId":"5c670d3e-12a3-456b-7c89-123456789ab"} \ + How many landmarks are in the western hemisphere?' \ + http://localhost:8093/query/service -u username:password +---- +.Response +[source,json] +---- +{ + "requestID": "325457b8-9cf4-477b-aaf5-7609f2ae79bf", + "generated_statement": "SELECT COUNT(*) FROM `travel-sample`.`inventory`.`landmark` + AS `l` WHERE `l`.`geo`.`lon` \u003c 0", + "signature": { + "$1": "number" + }, + "results": [ + { + "$1": 4033 + } + ], + "status": "success", + "metrics": { + "elapsedTime": "1.811586709s", + "executionTime": "73.500333ms", + "resultCount": 1, + "resultSize": 26, + "serviceLoad": 3, + "usedMemory": 659994, + "naturalLanguageProcessingTime": "1.736891542s" + } +} +---- +==== \ No newline at end of file diff --git a/modules/n1ql/partials/grammar/utility.ebnf b/modules/n1ql/partials/grammar/utility.ebnf index db16e0dcd..3fbaa746c 100644 --- a/modules/n1ql/partials/grammar/utility.ebnf +++ b/modules/n1ql/partials/grammar/utility.ebnf @@ -5,6 +5,7 @@ utility-statement ::= advise | explain-function | prepare | execute + | using-ai /* tag::advise[] */ advise ::= 'ADVISE' 'INDEX'? ( select | update | delete | merge ) @@ -90,4 +91,13 @@ delete-expr ::= 'STATISTICS'? '(' index-key ( ',' index-key )* ')' /* tag::delete-all[] */ delete-all ::= 'ALL' | 'STATISTICS' -/* end::delete-all[] */ \ No newline at end of file +/* end::delete-all[] */ + + +/*********************** + * Using AI Statement * + ***********************/ + +/* tag::using-ai[] */ +using-ai ::= 'USING AI' ( 'WITH' options )? natural-language-request +/* end::using-ai[] */ \ No newline at end of file diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index 5fdd28c32..fbd4d692a 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -146,6 +146,7 @@ endif::flag-devex-javascript-udfs[] ***** xref:n1ql:n1ql-language-reference/statistics-indexes.adoc[] ***** xref:n1ql:n1ql-language-reference/statistics-delete.adoc[] **** xref:n1ql:n1ql-language-reference/upsert.adoc[] + **** xref:n1ql:n1ql-language-reference/using-ai.adoc[] *** xref:n1ql:n1ql-language-reference/n1ql-auditing.adoc[] *** xref:n1ql:n1ql-language-reference/n1ql-error-codes.adoc[] ** xref:indexes:indexing-overview.adoc[] From a4ade001bd7a68454dc6d2613109fc8841c416a6 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Thu, 24 Jul 2025 15:00:42 +0530 Subject: [PATCH 24/80] [DOC-12880] Auto Update Statistics (#360) --- modules/guides/pages/cbo.adoc | 5 + modules/n1ql/pages/advanced.adoc | 1 + modules/n1ql/pages/n1ql-intro/sysinfo.adoc | 16 +- .../auto-update-statistics.adoc | 540 ++++++++++++++++++ .../cost-based-optimizer.adoc | 5 + modules/n1ql/partials/nav.adoc | 1 + 6 files changed, 567 insertions(+), 1 deletion(-) create mode 100644 modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc diff --git a/modules/guides/pages/cbo.adoc b/modules/guides/pages/cbo.adoc index 9a44efef0..aeb207902 100644 --- a/modules/guides/pages/cbo.adoc +++ b/modules/guides/pages/cbo.adoc @@ -92,6 +92,10 @@ For more information and examples, refer to xref:n1ql:n1ql-manage/query-settings Before you can use the Cost-Based Optimizer with a query, you must first gather the statistics that it needs. The Query service automatically gathers statistics whenever an index is created or built, and you can update statistics at any time. +You can also configure a scheduled task to automatically check and update statistics using xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc[Auto Update Statistics (AUS)]. +During the scheduled window, AUS evaluates the existing statistics and updates them if they are outdated. +For more information on how to enable this feature and set the schedule, see xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc#enable-and-schedule-aus[Enable and Schedule AUS]. + include::n1ql:page$n1ql-language-reference/statistics-expressions.adoc[tags=overview] === Updating Statistics for Expressions @@ -219,6 +223,7 @@ Explanation: Reference: * xref:n1ql:n1ql-language-reference/updatestatistics.adoc[UPDATE STATISTICS] +* xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc[Auto Update Statistics] Administrator guides: diff --git a/modules/n1ql/pages/advanced.adoc b/modules/n1ql/pages/advanced.adoc index 1d8c3b020..56cc969da 100644 --- a/modules/n1ql/pages/advanced.adoc +++ b/modules/n1ql/pages/advanced.adoc @@ -24,6 +24,7 @@ The cost-based optimizer takes into account the cost of memory, CPU, network tra * xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc[] * xref:guides:cbo.adoc[] +* xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc[] == {sqlpp} Support for Couchbase Transactions diff --git a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc index c4ee077fc..4c4f4cba8 100644 --- a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc +++ b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc @@ -73,6 +73,8 @@ a| [%hardbreaks] <> <> <> +xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc#system_aus[system:aus] +xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc#system_aus_settings[system:aus_settings] |=== == Authentication and Client Privileges @@ -1360,6 +1362,8 @@ This catalog contains the following attributes: __required__ |The class of the task. +For tasks related to xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc[Auto Update Statistics (AUS)], the class is `auto_update_statistics`. + *Example*: ``advisor`` |string @@ -1387,7 +1391,17 @@ __required__ __required__ |The state of the task. -*Values*: `scheduled`, `cancelled`, `completed` +Possible values are: +-- +* `scheduled`: The task is scheduled and yet to run. +* `deleting`: The scheduled task is in the process of being cancelled. +* `cancelled`: The task was cancelled before it began executing. +* `running`: The task is currently executing. +* `aborting`: The running task is in the process of being aborted. +* `aborted`: The task was aborted while it was running. +* `completed`: The task completed successfully without being cancelled or aborted. +-- + |string |**subClass** + diff --git a/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc b/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc new file mode 100644 index 000000000..ee718b729 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc @@ -0,0 +1,540 @@ += Auto Update Statistics +:page-status: Couchbase Server 8.0 +:page-edition: Enterprise Edition +:page-toclevels: 2 +:description: Auto Update Statistics (AUS) automatically refreshes optimizer statistics, ensuring accurate and cost-effective query plans. + +[abstract] +{description} + +== Overview + +Auto Update Statistics (AUS) is a feature that keeps the optimizer statistics up to date by automatically identifying and refreshing outdated statistics. + +Optimizer statistics are crucial as they help the xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc[Cost Based Optimizer] generate optimal query plans. +These statistics are initially created when you run the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement or build an index (available from 7.6.0 onwards). +However, as data changes over time, the statistics can become stale, leading to sub-optimal query plans and reduced query performance. + +To handle this, AUS executes a scheduled task on each query node in the cluster. +This task evaluates statistics based on expiration policies to identify outdated ones and then refreshes them by running the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement. +AUS can also optionally generate statistics for indexed expressions that do not already have them. + +NOTE: AUS maintains statistics only for expressions on index keys, and only for those indexed using the Plasma storage engine. +It does not support Memory-Optimized indexes. +For more information about these index storage types, see xref:indexes:storage-modes.adoc[]. + +[#availability] +== Availability + +AUS is available only in the Couchbase Enterprise Edition and on query nodes running version 8.0 or later. + +* You can enable AUS in a cluster that has been fully migrated to 8.0, or in a cluster that includes both 7.6.x and 8.0 query nodes. +In such mixed clusters, the 7.6.x query nodes will not perform any AUS tasks. + +* For clusters migrating from pre-7.6.x versions (to a configuration described above), the AUS task can only be enabled once the automatic migration of optimizer statistics to the `_query` collection in the `_system` scope of the buckets has been completed. + +== How AUS Works + +AUS is an opt-in feature that you must explicitly enable and schedule. +Once it is enabled and a schedule is set, all query nodes in the cluster participate in AUS, according to the same schedule. + +=== AUS Task Execution + +Each node receives its own AUS task, which performs the following actions during its scheduled window: + +* The query node first selects specific collections for AUS processing, ensuring that no other query node updates the same collection during this period. + +* Each selected collection then goes through two phases: <> and <>. +These phases process statistics gathered from expressions based on fields within that collection. + +* After AUS completes processing all statistics in all buckets, the query node schedules the next AUS run. + +* If the scheduled window ends before the AUS task finishes, the task is aborted and the next AUS run is scheduled. + +.AUS process flow showing the evaluation and update phases +[plantuml#fig-aus-process,aus-process,svg] +.... +@startuml + +skinparam defaultTextAlignment center + +() " " as start +() " " as end + +rectangle "AUS\nEnabled?" as AusEnabled + +rectangle "Query\nNode" { + rectangle "Scheduled\nAUS Task" as ScheduledTask + rectangle "Collection\nSelection" as CollectionSelection + rectangle "Evaluation\nPhase" as EvaluationPhase + rectangle "Update\nPhase" as UpdatePhase +} + +database "Optimizer\nStatistics" as OptimizerStatistics + +start ..r..> AusEnabled : "Start \nAUS Process" +AusEnabled -> ScheduledTask : "Yes" +ScheduledTask -> CollectionSelection +CollectionSelection -> EvaluationPhase +EvaluationPhase -> UpdatePhase +EvaluationPhase --> OptimizerStatistics +UpdatePhase --> OptimizerStatistics +UpdatePhase ..r..> end + +@enduml +.... + +=== Evaluation Phase + +In this phase, AUS evaluates whether existing statistics are stale based on the <>. +For each index, AUS assess how much data has changed since the last update of the optimizer statistics for the index's key expressions. +If the percentage of change exceeds the defined threshold in the <>, the statistics are marked as stale. + +Additionally, if configured to do so, this phase also identifies any indexed expressions that currently lack statistics and flags them for creation. +You can control this setting using the `create_missing_statistics` attribute in the <> catalog. + +=== Update Phase + +After the evaluation, AUS executes xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statements to refresh the statistics identified as stale. +When updating the existing statistics, AUS ensures that the refreshed statistics maintain the original xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution] at which they were collected. + +Also, if the `create_missing_statistics` option is set to `true`, AUS creates new optimizer statistics for indexed expressions that were flagged as missing during the evaluation phase. +The new statistics are created with the default xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution]. + +IMPORTANT: When AUS is first enabled, the initial task run might update all existing optimizer statistics, regardless of the expiration policy evaluation. +This is because the index change information might not have been recorded prior to this first run. + +[#expiration_policy] +=== Expiration Policy + +AUS uses expiration policies to determine when statistics are outdated and require an update. +The policy is based on the percentage of changes to data within an index. +You can configure this value using the `change_percentage` attribute in the <> or <> catalogs. +It defines how much data in an index must change before the statistics are considered outdated. + +If the percentage of changed data since the last statistics collection exceeds the defined threshold, AUS flags the statistics as stale. +The subsequent AUS operation then updates these statistics. + +== Enable and Schedule AUS + +To start using AUS for your cluster, you need to enable it and configure a schedule. +You can configure AUS to run during off-peak hours or at specific times that align with your workload patterns. + +AUS maintains its global configurations in the <> catalog. +You can enable AUS and set its schedule by modifying the relevant configurations within this catalog. + +If you need more granular control, use the <> catalog to customize certain AUS configurations at the bucket, scope, and collection levels. + +For a historical record of recent AUS tasks across all query nodes, use the xref:n1ql:n1ql-intro/sysinfo.adoc#sys-tasks-cache[system:tasks_cache] catalog. +For more information, see <>. + +[#system_aus] +=== system:aus + +The `system:aus` catalog contains a single document that holds all the global configurations of AUS. +You can update this document to modify the settings. + +[NOTE] +==== +* Only SELECT and UPDATE DMLs are allowed on this keyspace. +* To execute SELECT on `system:aus`, you need the `query_system_catalog` role. +* To execute UPDATE on `system:aus`, you need the `query_manage_system_catalog` role. +==== + +Each attribute in the document represents a particular global configuration. +The following are the attribute names and the configurations they represent: + +[cols="1a,4a,1a"] +|=== +| Name | Description | Schema + +| **enable** + +__required__ +| Indicates whether AUS is enabled for the cluster or not. + +To enable AUS, set this attribute to `true`. + +If set to `true`, then the `schedule` attribute must also be set. + +*Default:* `false` + +| Boolean + +| **schedule** + +__optional__ + +| Defines the schedule for AUS operations. + +This attribute is required only if `enable` is set to `true`. + +| <> object + +| **change_percentage** + +__required__ + +| The percentage of change to items within an index that must be exceeded for the statistics to be refreshed. +This is the threshold for determining whether the statistics are stale or not. + +The value must be an integer between `0` and `100`. + +For example, a value of `30` means that if 30% or more of the items in an index have changed, the statistics for that index are considered stale and will be refreshed. + +*Default:* `10` + +| Integer + +| **all_buckets** + +__required__ + +| Indicates whether AUS should be performed on all buckets or only those buckets whose metadata information is loaded on the query node. + +*Default:* `false` + +| Boolean + +| **create_missing_statistics** + +__required__ + +| Indicates whether AUS should create statistics that are missing. + +If set to `true`, AUS creates statistics for indexed expressions that do not have any existing statistics. +The statistics will be created using the default value for the xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution] property. + +*Default:* `false` + +| Boolean + +|=== + + +[[aus_schedule]] +==== Schedule +[cols="1a,4a,1a"] +|=== +| Name | Description | Schema + +| **start_time** + +__required__ + +| The start time of the AUS schedule in "HH:MM" format. +The `start_time` must be at least 30 minutes earlier than the `end_time`. + +*Example:* `"01:30"` + +| String + +| **end_time** + +__required__ + +| The end time of the AUS schedule in "HH:MM" format. + +The `end_time` must be at least 30 minutes later than the `start_time`. + +*Example:* `"05:30"` +| String + +| **days** + +__required__ + +| An array of strings specifying the days on which the AUS schedule runs. + +Valid values include: `Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday`, `Saturday`, `Sunday`. + +*Example:* `["Saturday", "Sunday"]` + +| String array + +| **timezone** + +__optional__ + +| The timezone that applies to the schedule's start and end times. +The value must be a valid IANA timezone string. + +*Default:* `"UTC"` + +*Example:* `"US/Pacific"` + +| String + +|=== + +When changing the global configurations, it is important to consider the following: + +* *Enabling AUS*: If AUS was previously disabled and is now enabled, the next AUS task will be scheduled immediately. +* *Rescheduling AUS*: Currently scheduled AUS task will be cancelled, and a new AUS task will be scheduled according to the updated schedule. +Running AUS tasks will not be cancelled. +* *Other Settings*: If other global settings such as `all_buckets` or `change_percentage` are modified, the new values will be applied during the next scheduled AUS run. + +==== Example +==== +A sample UPDATE statement to enable AUS and set a schedule with some customizations: + +.Query +[source,sqlpp] +---- +UPDATE system:aus SET enable = true, change_percentage = 20, +schedule = { "start_time": "01:30", + "end_time": "04:30", + "timezone": "Asia/Calcutta", + "days": ["Monday", "Friday"] + }; +---- +==== + +[#system_aus_settings] +=== system:aus_settings + +The `system:aus_settings` catalog stores granular configuration settings for AUS. +These settings can be applied at the bucket, scope, and collection levels. + +By default, this catalog has no documents, and the AUS settings for all keyspaces inherit the configurations defined at the global level. +In other words, unless you explicitly configure AUS for a specific keyspace, it will use the global AUS settings defined in <>. + +To customize AUS for a specific keyspace, you must insert a settings document into the `system:aus_settings` catalog. +The document ID of a document in this keyspace must be the full path of the bucket, scope, and collection. + +Each attribute in the document represents a particular granular configuration. +The following are the attribute names and the configurations they represent: + +[cols="1a,4a,1a"] +|=== +| Name | Description | Schema + +| **enable** + +__optional__ +| Indicates whether AUS is enabled for the bucket, scope, collection. + +Set it to `true` to enable AUS for the keyspace. + +AUS settings are hierarchical and follow the order: cluster > bucket > scope > collection. + +If AUS is disabled at higher level, it cannot be enabled at a more granular level. +However, if AUS is enabled at a higher level, it can be disabled at a more granular level. + +For example, +-- +* If AUS is disabled for a bucket, it is automatically disabled for all scopes and collections within it. +The setting cannot be overridden at the scope or collection level. +* If AUS is enabled for a bucket, it can be overridden at the scope and collection level. +-- + +| Boolean + +| **change_percentage** + +__optional__ + +| The percentage of change to items within an index that must be exceeded for the statistics to be refreshed. + +The value must be an integer between `0` and `100`. + +If set at a bucket level, this value applies to all scopes and collections within the bucket, unless overridden at a lower level. + +If set at a scope level, this value applies to all collections within the scope, unless overridden at a lower level. + +*Example:* `30` + +| Integer + +| **update_statistics_timeout** + +__optional__ + +| The timeout period for the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] command. +It is a number representing a duration in seconds. + +If the command does not complete within this duration, it times out. +If omitted, a default timeout value is calculated based on the number of samples used. + +If set for a keyspace, this timeout applies to every xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement that AUS executes for that keyspace. + +If set at a bucket level, this timeout applies to all scopes and collections within the bucket, unless a different value is set at a lower level. + +If set at a scope level, this timeout applies to all collections within the scope, unless a different value is set at a collection level. + +| Number + +|=== + +[NOTE] +==== +* All SQL++ DMLs are allowed on this keyspace. +* To execute SELECT on `system:aus_settings`, you need the `query_system_catalog` role. +* To execute UPDATE, DELETE, INSERT, and UPSERT on `system:aus_settings`, you need the `query_manage_system_catalog` role. +==== + +==== Example +==== +A sample query to add a scope level setting that applies to all collections within the scope. + +.Query +[source,sqlpp] +---- +INSERT INTO system:aus_settings ( KEY, VALUE ) + VALUES ( "default:bucket1.scope1", {"change_percentage": 20} ); +---- +==== + +[#monitor_aus_tasks] +== Monitor AUS Tasks + +The `system:tasks_cache` catalog stores information about all recent tasks executed in a cluster, including the AUS tasks. +For each AUS task, every involved query node maintains an entry within this catalog. +AUS task entries can be specifically identified by the `class` field, which is set to `auto_update_statistics`. + +[#view_aus_tasks] +=== View Recent AUS Tasks + +To view all recent AUS tasks, use the following query: + +[source,sqlpp] +---- +SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics"; +---- + +This query returns all AUS entries regardless of their state (scheduled, running, completed, etc.). +To get the details of completed tasks, see <>. + +=== Find Scheduled AUS Tasks + +To identify AUS tasks that are scheduled to run, you can filter the entries using the `state` attribute. + +[source,sqlpp] +---- +SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics" AND state = "scheduled"; +---- + +=== View AUS Tasks on a Particular Node + +To view recent AUS tasks on a particular node, filter by the `node` attribute. + +[source,sqlpp] +---- +SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics" + AND state = "scheduled" + AND node = "127.0.0.1:8091"; // Replace with the actual node address +---- + +[#view_completed_aus_tasks] +=== View Completed AUS Tasks + +The entries for completed AUS tasks have information specifically about tasks that have finished execution. +These entries include details such as the task ID, start time, end time, which keyspaces had their statistics updated, and whether any errors occurred during the task execution. + +==== Example +==== +A sample task entry for a successful AUS task on a query node: + +[source,json] +---- +{ + "tasks_cache": { + "class": "auto_update_statistics", + "delay": "21.707164s", + "id": "4b90bb39-ca1b-55f1-84f0-4d3137c88bf8", + "name": "bc1ab6e9-9f33-4a8f-86ad-40d74c50af5f", + "queryContext": "", + "results": { + "configuration": { + "all_buckets": true, + "change_percentage": 20, + "end_time": "2024-11-19 20:00:00 +0530 IST", + "internal_version": 1, + "start_time": "2024-11-19 19:16:00 +0530 IST" + }, + + "keyspaces_updated": [ + "default:bucket1.scope1.customers" + ] + }, + + "startTime": "2024-11-19T19:16:00.001+05:30", + "state": "completed", + "stopTime": "2024-11-19T19:16:03.154+05:30", + "subClass": "", + "submitTime": "2024-11-19T19:15:38.292+05:30" + } +} +---- +==== + +For more information about `system:tasks_cache` and its attributes, see xref:n1ql:n1ql-intro/sysinfo.adoc#sys-tasks-cache[Monitor Cached Tasks]. + +In addition to the attributes listed there, the AUS task entries also include the following attributes: + +* `keyspaces_updated`: A list of keyspaces that had their statistics updated during the AUS task execution. +* `configuration`: The configuration with which the AUS task was executed. + +NOTE: You can also retrieve the AUS task history from the `query.log`. + +== Cancel AUS Tasks + +You can cancel AUS tasks that are currently running or scheduled to run. + +* <> +* <> + +CAUTION: When cancelling AUS tasks, it is important to include appropriate WHERE clauses to specify exactly which tasks you want to cancel. +Make sure your filters target only the intended tasks, otherwise they might inadvertently cancel other tasks or delete task history. + +[#cancel_running_aus_tasks] +=== Cancel Running AUS Tasks + +To cancel a running AUS task, delete its entry from the `system:tasks_cache` catalog. +When you delete a task that is in the `scheduled` or `running` state, AUS cancels the task and schedules the next one automatically. + +To cancel all running AUS tasks, use the following DELETE statement: + +[source,sqlpp] +---- +DELETE FROM system:tasks_cache WHERE class = "auto_update_statistics" AND state = "running"; +---- + +To cancel a running AUS task on a specific node, include the node's address in the WHERE clause: + +[source,sqlpp] +---- +DELETE FROM system:tasks_cache + WHERE class = "auto_update_statistics" + AND state = "running" + AND node = "127.0.0.1:8091"; // Replace with the actual node address +---- + +[#cancel_next_scheduled_aus_tasks] +=== Cancel Next Scheduled AUS Tasks + +To cancel an upcoming scheduled AUS task, you need to temporarily modify its schedule in the `system:aus` catalog. +After the scheduled time has passed, you can revert it to its original schedule. + +==== Temporarily Update the Schedule + +First, identify the specific AUS task you want to skip or cancel. +Then, use an UPDATE statement to exclude the day or time from its schedule. + +For example, if your AUS tasks run on Monday, Wednesday, and Friday, and you want to cancel the upcoming Monday run: + +[source,sqlpp] +---- +UPDATE system:aus SET schedule.days = ["Wednesday", "Friday"]; +---- + +==== Revert the Schedule + +After the day and time for the cancelled task have passed, you can revert the schedule to its original settings. +This allows your AUS tasks to resume their regular schedule for all subsequent runs. + +For example, to restore the Monday, Wednesday, and Friday schedule after skipping the Monday run: + +[source,sqlpp] +---- +UPDATE system:aus SET schedule.days = ["Monday", "Wednesday", "Friday"]; +---- + +== Manage AUS Load + +When an AUS task runs, it can increase the load on the query node as it evaluates and updates statistics. +Therefore, to minimize performance impact, it is important to schedule AUS to best suit the workloads of your cluster. + +To prevent excessive load, the AUS task will not start if the query node's load is too high during the scheduled window. +In such cases, the task is skipped, and the next AUS task is scheduled. + +== Related Links + +* xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc[Cost Based Optimizer] +* xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] +* xref:n1ql:n1ql-intro/sysinfo.adoc[System Catalogs] diff --git a/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc b/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc index c7f42cb36..f34966d95 100644 --- a/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc @@ -28,6 +28,7 @@ :query-service-architecture: {query-service}#query-service-architecture :query-execution: {query-service}#query-execution :query-settings: xref:server:manage:manage-settings/general-settings.adoc#query-settings +:auto-update-statistics: xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc [abstract] {description} @@ -155,6 +156,9 @@ Before you can use the cost-based optimizer with a query, you must first gather In Couchbase Server 7.6 and later, the Query service automatically gathers statistics whenever an index is created or built. You can use the {updatestatistics}[UPDATE STATISTICS] statement to gather statistics at any time. +To keep optimizer statistics up to date, an opt-in feature called {auto-update-statistics}[Auto Update Statistics (AUS)] is available starting with Couchbase Server 8.0. +When enabled, AUS automatically identifies and refreshes outdated statistics, ensuring that the cost-based optimizer always has the latest information for generating query plans. + If the cost-based optimizer cannot properly calculate cost information for any step of a query plan, e.g. due to lack of the necessary optimizer statistics, the Query service falls back on the {query-service-architecture}[rules-based {sqlpp} optimizer] to generate a query plan. The cost-based optimizer uses the following statistics. @@ -392,4 +396,5 @@ Refer to the documentation for the {updatestatistics}[UPDATE STATISTICS] stateme * {updatestatistics}[UPDATE STATISTICS] statement * {optimizer-hints}[] overview +* {auto-update-statistics}[Auto Update Statistics] * Blog post: https://blog.couchbase.com/?p=7384&preview=true[Cost Based Optimizer for Couchbase N1QL^] \ No newline at end of file diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index fbd4d692a..5157a5c37 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -30,6 +30,7 @@ endif::flag-devex-javascript-udfs[] ** xref:n1ql:advanced.adoc[] *** xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc[] *** xref:guides:cbo.adoc[] + *** xref:n1ql:n1ql-language-reference/auto-update-statistics.adoc[] *** xref:n1ql:n1ql-language-reference/transactions.adoc[] *** xref:guides:transactions.adoc[] *** xref:n1ql:n1ql-language-reference/flex-indexes.adoc[] From c67aa4c9995264b9524623259ca5827bbeb4ef8d Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Tue, 9 Sep 2025 00:33:33 +0100 Subject: [PATCH 25/80] [DOC-12632] Auto Reprepare for PREPARE Statements (#387) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/prepare.adoc | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/prepare.adoc b/modules/n1ql/pages/n1ql-language-reference/prepare.adoc index 28b48ee00..7e298f3fd 100644 --- a/modules/n1ql/pages/n1ql-language-reference/prepare.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/prepare.adoc @@ -175,6 +175,7 @@ However, if the FORCE keyword is present, the prepared statement is created agai When you create an anonymous prepared statement, if there is a named prepared statement in the cache with identical statement text, the named prepared statement is not returned. The anonymous prepared statement is added to the cache in addition to the named prepared statement. +ifdef::flag-devex-rest-api[] [[auto-prepare]] == Auto-Prepare @@ -192,9 +193,29 @@ The process is similar to creating a prepared statement without a local name: The auto-prepare feature is inactive by default. You can turn the auto-prepare feature on or off using the `auto-prepare` service-level query setting. -For more details, refer to xref:n1ql:n1ql-manage/query-settings.adoc#auto-prepare[]. +For more details, refer to xref:n1ql:n1ql-manage/query-settings.adoc#auto-prepare[Configure Queries]. Auto-prepare is disabled for {sqlpp} requests which contain parameters, if they do not use the PREPARE statement. +endif::flag-devex-rest-api[] + +[[auto-reprepare]] +== Manual Reprepare + +[.status]#Couchbase Server 8.0# + +If no indexes exist when you prepare a statement, then the prepared plan uses a sequential scan. +If you create a primary index or a secondary index later, the statement still continues to use the sequential scan and does not automatically benefit from the new indexes. + +To manually reprepare a statement, update xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-prepared[system:prepareds] and unset the `planPreparedTime` field for the statement. + +For example, to reprepare a prepared statement named `NumParam` on a node with the IP address `127.0.0.1` and port `8091`, use the following query: + +[source,sqlpp] +---- +UPDATE system:prepareds USE KEYS ["[127.0.0.1:8091]NumParam"] UNSET planPreparedTime; +---- + +You can repeat this operation after creating each relevant index to refresh the prepared statement's plan. [[auto-execute]] == Auto-Execute @@ -209,10 +230,12 @@ You can use this when you need to execute the prepared statement again. The auto-execute feature is inactive by default. You can turn the auto-execute feature on or off using the `auto_execute` request-level query setting. -For more details, refer to xref:n1ql:n1ql-manage/query-settings.adoc#auto_execute[]. +For more details, refer to xref:n1ql:n1ql-manage/query-settings.adoc#auto_execute[Configure Queries]. +ifdef::flag-devex-rest-api[] The auto-execute feature only works for {sqlpp} requests which actually contain the PREPARE statement. Prepared statements created by the <> feature are not executed by the auto-execute feature. +endif::flag-devex-rest-api[] [[propagation]] == Statement Propagation From 7cde9744e3b7c17111dbc7b5a14a8b1950711e8f Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Tue, 9 Sep 2025 10:30:29 +0100 Subject: [PATCH 26/80] DOC-12757 Added information about OnDeploy (#391) --------- Co-authored-by: Pallavi-Janardhan --- .../pages/eventing-Terminologies.adoc | 66 ++++++++++++------- .../eventing/pages/eventing-lifecycle.adoc | 11 +++- 2 files changed, 49 insertions(+), 28 deletions(-) diff --git a/modules/eventing/pages/eventing-Terminologies.adoc b/modules/eventing/pages/eventing-Terminologies.adoc index d616d1fb1..bad109365 100644 --- a/modules/eventing/pages/eventing-Terminologies.adoc +++ b/modules/eventing/pages/eventing-Terminologies.adoc @@ -15,7 +15,7 @@ The Eventing Service can run one or more Eventing Functions. == Eventing Functions Eventing Functions handle data changes in the Eventing Service. -They're standalone JavaScript fragments that trigger in real time as a response to document mutations and that must execute from start to finish before a specified timeout is reached. +These are standalone JavaScript fragments that trigger in real time as a response to document mutations and must be executed from start to finish before the specified timeout. Eventing Functions allow you to: @@ -24,7 +24,7 @@ Eventing Functions allow you to: ** Work with Atomic Counters, CAS, and TTLS * Integrate with the Query Service to use inline {sqlpp} queries or statements * Enable a Timer to schedule functions to run in the future -* Interact with external REST endpoints through cURL functionality +* Interact with external REST endpoints through cURL capability * Route mutations to the entry points `OnUpdate` and `OnDelete` * Route fired timers to a user-defined Timer callback @@ -42,10 +42,10 @@ The `OnUpdate` handler is called when you create or modify a document. The entry point `OnUpdate(doc,meta)` passes `doc`, the document, and `meta`, which contains additional data like the document ID, CAS, expiration date, and data type. -There are two limitations to the `OnUpdate` handler: +Limitations of the `OnUpdate` handler: -* If you modify a document several times in a short period of time, the handler calls can merge into a single event due to deduplication -* It is not possible to distinguish between Create and Update operations +* If you modify a document several times in a short period of time, the handler calls can merge into a single event due to deduplication. +* It is not possible to distinguish between Create and Update operations. NOTE: To prevent the suppression of binary documents, you must set the language compatibility of your Function to Couchbase Server version 6.6.2 or later. @@ -53,17 +53,34 @@ NOTE: To prevent the suppression of binary documents, you must set the language The `OnDelete` handler is called when you delete a document or when the document expires. -The entry point `OnDelete(meta,options)` passes `meta`, which contains information like the document, and `options`, which contains the boolean parameter `options.expired` that indicates if the document was removed because of a deletion or an expiration. +The entry point `OnDelete(meta,options)` passes `meta`, which contains information like the document, and `options`, that contains the boolean parameter `options.expired` that indicates if the document was removed because of a deletion or an expiration. It is not possible to get the value of a document that has been deleted or expired. +==== `OnDeploy` + +[.status]#Couchbase Server 8.0# + +The `OnDeploy` handler runs once when an Eventing function is deployed or resumed. + +The entry point `OnDeploy(action)` receives an `action` parameter, like `deploy` or `resume`, indicating the reason for invocation. It also includes a `delay` value (in milliseconds), showing the time since the function was paused. For deployment operations, this value is `0` + +*Limitation*: Avoid long-running operations within the `OnDeploy` as they can delay function deployment. + +Use `OnDeploy` for one-time setup tasks such as: + +* Registering a Timer. +* Initializing resources required by the function. + +If `OnDeploy` fails, no mutations are processed, and the function remains in its previous state. + ==== Timer Callback Timer callbacks are user-defined JavaScript functions passed as the `callback` argument to the built-in function call `createTimer(callback,date,reference,context)`. When you create a Timer, the `callback` argument is executed at or close to the `date` argument. The `reference` argument works as an identifier for the Timer scoped to an Eventing Function and callback. -The `context` argument must be serializable data that is available to the callback when the Timer is fired. +When the Timer fires, the `context` argument data must be in serialized form and available to the callback. For more information about Timer callbacks, see xref:eventing-timers.adoc#createtimer-function[`createTimer()` and `cancelTimer()`]. @@ -72,13 +89,13 @@ For more information about Timer callbacks, see xref:eventing-timers.adoc#create The persistent state of an Eventing Function is captured in the following external elements: -* Documents or mutations and their extended attributes -* Listen to Location, or the Eventing source: a collection that is the source of mutations sent to the Function through the Database Change Protocol (DCP) -* Eventing Storage, or the Eventing metadata: a collection used as a scratchpad for the state of the Function +* Documents or mutations and their extended attributes. +* Listen to Location, or the Eventing source: a collection that's the source of mutations sent to the Function through the Database Change Protocol (DCP). +* Eventing Storage, or the Eventing metadata: a collection used as a scratchpad for the state of the Function. * Optional bindings for the Function: -** Bucket alias: an alias and access mode used by the Function to access a collection -** URL alias: an alias and HTTP/S setting used by the Function to access external REST APIs -** Constant alias: an alias to an integer, decimal number, string, boolean, or a JSON object used as a global variable within the Function +** Bucket alias: an alias and access mode used by the Function to access a collection. +** URL alias: an alias and HTTP/S setting used by the Function to access external REST APIs. +** Constant alias: an alias to an integer, decimal number, string, boolean, or a JSON object used as a global variable within the Function. All states in the execution stack are short-lived. @@ -150,12 +167,11 @@ The keyspaces `bucket.scope.collection` are accessible by the bound name as a Ja You can add bucket aliases by selecting *Bucket alias* and entering an alias-name, a keyspace, and the access level. This sequence of values does the following: -* alias-name is the name you can use to refer to the keyspace or collection from your Eventing Function code -* keyspace is the full path to a collection in the cluster -* the access level provides access to the keyspace as `read only` or `read and write` -** `read only` lets you read documents from the collection but not write (create, update, or delete) documents in the collection -** `read and write` lets you read and write documents in the collection - +* alias-name is the name you can use to refer to the keyspace or collection from your Eventing Function code. +* keyspace is the full path to a collection in the cluster. +* the access level provides access to the keyspace as `read only` or `read and write`. +** `read only` lets you read documents from the collection but not write (create, update, or delete) documents in the collection. +** `read and write` lets you read and write documents in the collection. NOTE: You must have one or more bucket alias bindings for your Eventing Function to perform operations directly against the Data Service. An Eventing Function can listen to multiple collections when you use the `{asterisk}` wildcard in its scope or collection. @@ -193,10 +209,10 @@ A keyspace is a path to a collection in the format `bucket-name.scope-name.colle For backward compatibility, you can also use the format `bucket-name._default._default`. This is the format of a bucket from Couchbase Server version 6.6 that has been upgraded to version 7.0. -The following are the two keyspaces used by Eventing Functions: +The two keyspaces used by Eventing Functions are: -* <>, which represents the Eventing source -* <>, which represents the Eventing metadata +* <>, which represents the Eventing source. +* <>, which represents the Eventing metadata. [#listen-to-location] ==== Listen to Location @@ -279,7 +295,7 @@ You can only modify the Feed Boundary when you create a Function or when a Funct |System Log Level |Determines the granularity of messages logged across the Eventing Function. -Can be one of `Info` (the default), `Error`, `Debug`, `Warning`, or `Trace`. +Can be `Info` (the default), `Error`, `Debug`, `Warning`, or `Trace`. |Application Log Location |The directory path to the log file for the Eventing Function. @@ -313,11 +329,11 @@ New Functions default to the highest compatibility version available of 6.6.2. In version 6.5.0, trying to access a non-existing item from a keyspace returns an undefined value. In version 6.0.0, it throws an exception. -Only a Function with a language compability setting of version 6.6.2 passes binary documents to Eventing Function handlers. +Only a Function with a language compatibility setting of version 6.6.2 passes binary documents to Eventing Function handlers. Versions 6.0.0 and 6.5.0 filter all binary documents out of the DCP mutation stream. |Script Timeout -|The number of seconds to elapse before the script times out and is terminated. +|The number of seconds to elapse before the script times out and terminates. The entry points into the handler processing for each mutation must run from start to finish before the specified timeout duration. The default number of seconds is `60`. diff --git a/modules/eventing/pages/eventing-lifecycle.adoc b/modules/eventing/pages/eventing-lifecycle.adoc index 25104c394..3db4de8c5 100644 --- a/modules/eventing/pages/eventing-lifecycle.adoc +++ b/modules/eventing/pages/eventing-lifecycle.adoc @@ -127,14 +127,19 @@ The minimum value is 1 (the default) and the recommended maximum is 64. If the semantics of a language construct change in any given release the “Language compatibility” setting will ensure an older Eventing Function will continue to see the runtime behavior that existed at the time it was authored, until such behavior is deprecated and removed. Note 6.0.0, 6.5.0, and 6.6.2 (the default) are the only currently defined versions. * *Script Timeout*: Script Timeout provides a timeout option to terminate a non-responsive Function. -The entry points into the Eventing Function, e.g. OnUpdate and OnDelete, processing for each mutation must complete from start to finish prior to this specified timeout duration. The default is 60 seconds. In addition an Timer callback must also complete within this period. +The entry points into the Eventing Function, like OnUpdate and OnDelete, processing for each mutation must complete from start to finish prior to this specified timeout duration. The default is 60 seconds. In addition an Timer callback must also complete within this period. + +* *OnDeploy Timeout*: OnDeploy Timeout defines the maximum duration allowed for an Eventing Function to complete its initialization during deployment or resumption. +The OnDeploy entry point must complete execution, from start to end, within the specified timeout period. If the runtime exceeds the specified duration, the function is reverted to its previous state. By default, the timeout is set to 60 seconds. * *Timer Context Max Size*: Timer Context Max Size limits the size of the context for any Timer created by the Function. -Eventing Timers can store and access a context which can be any JSON document, the context is used to store state when the timer is created and retrieve state when the timer fires. By default the size is 1024 bytes, but this can be adjusted on a per Function basis. +Eventing Timers can store and access a context which can be any JSON document, the context is used to store state when the timer is created and retrieve state when the timer fires. By default the size is 1024 bytes, but this can be adjusted on a per Function basis. | Bindings a| -A binding is a construct that allows separating environment specific variables (example: bucket names, external endpoint URLs, constants) from the Eventing Function's JavaScript source code. Currently Eventing Functions support the following binding types: +A binding is a construct that allows separating environment specific variables (example: bucket names, external endpoint URLs, constants) from the Eventing Function's JavaScript source code. + +Currently Eventing Functions support the following binding types: * *Bucket Bindings*: to access the Data Service or KV. From b577ae41a2e42b0cf1f7708a8a03bbc3882c22f6 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Tue, 12 Aug 2025 13:36:15 +0530 Subject: [PATCH 27/80] [DOC-12493] Add XATTR support to SQL++ statements (#388) --- .../n1ql-language-reference/set-clause.png | Bin 11078 -> 12552 bytes .../n1ql-language-reference/unset-clause.png | Bin 6753 -> 8661 bytes modules/n1ql/examples/dml/set-xattr.jsonc | 17 +++++ modules/n1ql/examples/dml/set-xattr.n1ql | 8 +++ modules/n1ql/examples/dml/unset-xattr.n1ql | 3 + .../indexing-meta-info.adoc | 6 ++ .../pages/n1ql-language-reference/insert.adoc | 39 +++++++++++- .../n1ql-language-reference/metafun.adoc | 18 ++++++ .../pages/n1ql-language-reference/update.adoc | 58 ++++++++++++++++-- .../pages/n1ql-language-reference/upsert.adoc | 16 ++++- modules/n1ql/partials/grammar/dml.ebnf | 6 +- 11 files changed, 158 insertions(+), 13 deletions(-) create mode 100644 modules/n1ql/examples/dml/set-xattr.jsonc create mode 100644 modules/n1ql/examples/dml/set-xattr.n1ql create mode 100644 modules/n1ql/examples/dml/unset-xattr.n1ql diff --git a/modules/n1ql/assets/images/n1ql-language-reference/set-clause.png b/modules/n1ql/assets/images/n1ql-language-reference/set-clause.png index d37791c89320670517b2256988cc39e73c3fab59..fb5547fc4c69a37239925b81fda6c4426df22460 100644 GIT binary patch literal 12552 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 ah24Kg53{WcfE2_+LCHueN>qy*1^+)?x~W0{ diff --git a/modules/n1ql/assets/images/n1ql-language-reference/unset-clause.png b/modules/n1ql/assets/images/n1ql-language-reference/unset-clause.png index 80417808fe0ae2cfdf8dd3497e01dff43bec2d87..2b5b2049c4e0d783d90259087a98f572ee169a03 100644 GIT binary patch literal 8661 zcmaKS1yCGK*DizvNYF(WCrbhe9yE9ei(7Dam*DP!084O4&@2$#-JRfBoZ#-h%i=-* z&0BBPcfb4Jy0x`E(`R~SdaBNIo^zh=h!0BAc+V)Gp`oGS$;yCL(a_LyQ0Gu=OjJve zKn_J6=*?tQ717Xq7}3yzKBJ*sqf9}&XlU-7XlVP!XlQ~dXlUe4-+to)(Ow*4-8^}H zW2^FLbMG)!@6tT9<_rSqf;i0OTXb#AIEr!$ov5e5R@;ZixN}7*r#+?o9sBJ>)16*p z?GRTJQYHl<0!5&RU1RJ>rAt z5_XPvd2vI+;OiE4Z?3v9D<){E>9^w`#gU84roB$@e`B@`36=^uJr3jq#`n70;5_)z zY#$6^6WJ}fRP7J*rU1r4L{%l|iFp`3q}GUctxb`6#xr-p8xMEn-XyEiBA9`othEu%h$%mQr6 zVO5vE_B8%us~Q)f#y8gp0cJw?z12`Sw6%#4Vhhw!9=Lu#O;vp#caDv64x%b6Ze`)2 zxj@{5k^}w*L`xy9(XAZ|J6bknY2|W?nszKFaD4c6>#FsQ&)k&n%fqqCNNoF~up1wq z)%WzpYtIg1FQ%J=-o#Q&J=zb>5%fFN!*yZh5@~~nu|GYlAb(_RRS;fIWI)Kpb=ueo zv5zYi3&ubyu04q=X$z;}&e45`(HtqJ$I2^0z<+ZqUqnjhQj9o4Q|51xQ@jByP?7`V zk2D$e)csAPp|(i@!%RfPf$;;>RocyP(`2GR(Gt0BcLW`IWJdl5W=k5e%6Z&5q*NIg zwQKoD&|)<>k8%5Guab@D@cp-;-Tbi{NoC?5r%#bF10E#P4DGm5ZZ*`Ny*k@o@opz> z7ekr#JzFU7u?Z#?tWN-llT~WB2T!S$T*m=(F+Y8J;!&_qI(%3h@N+fk~tRT>< zy8kL^<#K(qre$b7@HK*noF-mz+&B*w_Sae0iEH})qS$rUt6DOj-)_wW+?!8c1|K)Y z<~yiLdijsLmpcK3Tuy7(hz(ahHcth;z!)!1&`HAoVLD@%S*D*Aj{?j<*pYzwwE%E1t)qp~tbd$9>h=J<=ZY`Ok2SR7aBTUwB?RIWs!7vG0TGy5xmy?GIlimZKp4izj8 zj5ba&rXqYNiJR<3iGL8p4T24_ZfsDPF1`kQ-n8nNLc>DNYaCuL)@6QzKvF2i%dk1D zb*YNsAU&tM;(N}>@6uSwC8GPqHZlN&FJ#A;7h@UM%<9Qsu*x$ZK4A)<(WV5OKef+C z0r)S7|AXXz;QZgF>eNKTx=O2~>BG4@)1InLrWonGdL_AGcNv9W<5RVd&M({sJe{lM zkw}+WMnnp;qq^3NR`n_xZ0TxL_h;<;{{7&>B&-}oSa84c{cg)#e8Gf1=H7PR&rPNXX#`;*i_A({X3)h_afqbDHo$g<&^tH9- zemlhqV6v)mgLQ7MK4-`0? zzkc1A&HdpD)t~)TCj2E~?ekAPPrdhU?G*QmUm?4iKsW0G^munh;LE(N{njO#{mq{a z^I31PTfVG`$}6aq3Y!RW`?#nvv$3(^3=UGTVrNt3Nf^;o!YIYclzfgTKV$mhZ@l-W zE4KEtNL8df3;Qxk!;{X7>)W2Cznn_+nLd#J-0x4URpm(mxAn|C4dT9yX5{6z@omY? zRAW$*Ly7>KjEER8KA3-7DyuG&#d5S!qAfWgDg2L-qzSD2@r#1(A3tI-ZqwdwjCT!> z6_jwa->m4c>XEw+xAK%DKF=88cDg<+8o_Vz;S1QK!Y+486p{}O`Cal>KN4ejX#$9R zNnLv<8$L)2aleSjs&O4v!KL-GLi%R zDTSF9pXP0_81rdcdNhH-BhKHs-HU$2t-bPAW+uI_(hsE46oAZ(*GE&tW!9}_siFs* zaQM3G@J;%Aj>325jurjOi0hwo<5|mMK3sT01TVf_+sni;@v*kmZ?QP9gzP)dHES!R z|6#h-Yc%cO_jT~l#7mOn>*Y!V1)omDd<1wL15IuBF{_M`s4zNBb`UTdnmE4m=6G2N zcxp|@%PzProD@*^gq%oi)z}ey$^P+;Etq51O|bMn0E>&uh0|*Ja=*sxVWPn+)^gZW zsOmnM)61uEb&EXwhl+&qv@rOkn?q#Ry2%%DiH2VR4b{jWudq{jc-ZD*)QVGOSiB72 zU=~WpkA}1t)^m%bH}?uZ)9L7XLqI~zgL(89ApV&sX-2qI2mE|IFND0=K zk@UFexlGBVXG)iD4NLfTAcpxd0YcZ_U$q9pG0SwHj(E9%Z1X|i4(iR$AT8tB-WWsI zqYX|jE}h5Emo(JASHx1m;ec1wYx=DZneGGREgH&E%~nT=Q_r$?W$Db9 zEXHh7%yWW1y5ZELwQU04Pm3Z&#>7NPPZzY`BD(y!%@ zbEt=Oy;`r%8^;?K+&B}!XxAO9^^kEJ?F9ielXd63xgdXdD&(H6PjCl+G3sH2BD|At z`1k2|SQE2+Lf5NYH5T5U?@FCbr?R`0>#@gT+3KA8lib)wW!HEN;TNxX%YG1eu!vfc zjMYDwbpi4xF-75GzCiBn)zT7|UmWl@~$a7!o!+a56jG zpyPkJwae1%y1MoIP9(N(z85_CZFeKfMmJ(-D^S|l4%FEanx8AIz&O0^8bs?-OU&WR6(R#;?m{F^6k`52|s*;3nImPgEhA;2{RLn<2YeS$HI>c#M9WGO)au6SPiZ2(lRzv&S(U3M$AaDqGQ6O)=-3Lb1T)} z#T%dzzRPkhG1#2_V?aAbuQ?_TDX!ofr_+s%v@W;qev_mYe?(#wMIL+kpF>XlOB9k4WEYbT_oEzj*sLSg)uvF=29T zPeoZI@chV;^M3C}gYgBM{xuH1WDi-zSIZj9^DT?$lf1MNdA+Nh15Tq-CUH{{9rpUK zY?$02T`saCI;UF%Es7rZvkyWIMlK z+pzI6U#C5TuZOJCD{FY)RsQ)-$uD!OB-^i?x3T6d6lnx2UwZH_QHwVEGxdz3$Rlp^ zpKLqsW1s1$wP(S*C}F}+!_yi4wP(Rlh#T_i55FE##$-}2L#B&{1}DvMO90$*K|@Yq z*QF7+xb%HWK+@&-%+2CY!Z7iHgjizORJI{BF)h4{NqOC6ywRVJvn|~^y2;QlWr7zQ zv6Ff%=Ph1j&Z%o49;agf6)zlkP{dQE!4H`At8bhu%ZLPU2rm=G;@j%NFEP(-vmVWj zc0f4-DkOr01izRZz`?vEPs$6V>pKq;AIbZRiEwwQ^E=GdweT_Po2=|DYVtOfllf{c zm9}9$Oq@v;zvdHoi9tZH|D`GiCr!CP$q$%Vz@aI!eI`ibkf`Vu8o9;Sfw{YIgMS8m zD`8$IRjSVyy(P~F1q^mRpFU-}pzHS0OJ5#74A&r`d$z*D|BCcUj{TeX#)HSHU;4Bt zD7-}d8@TW9Y_as^*s;$PDc=?`wt^b?Jzv9J3?_DJC8peZ=s4`HBOC~#oVrwp^)B80QtHe?f8Kag?ja)!18;;G zasuUy-kBp?pUO0*6#Gngdo`{ih-sO5mn(`mvL9}1N0K>ojMjWO`&B=6PfV8N%Jqhq zgd`OD_mg5V-S+wzmrT~^#?{NYhDI95 z-To;RYy!dWHcZDS-PBdIV0zDqrWpi}JxExMikV&hz|K203$zM?;~NUP>&Gf_++8FW zNqp*eZGwUJ<%Hk4ehVX|{82*%+d~gNl_^!gALk?%)L7luzGN5UAJs3I?o@N$gG9hy zF?)N{{<6_a?>BHRUP^7?wECku<;<#2VDIkZ&IJ7UpSnmLs*6$3K^L$Uis?-ep~&|( zo$^DQR%oG_c6)A!1wzPjZ*K}}{Gyl1GFqn=#I-Yq+!U<37}oUys#NVsPN~!agNJ=e zw>)IQ=Do%w?EBk`!XK|b&v>TW`o2r}WUVpC`XT&76-!O*P8uOVM*t}6i=P@WGBEP6 z;L7b`OBd)&Qg`(KsFAk!rNQc*)<+bxbf5B`qg&o3A7qQ_AiH0iHN=PlXIoz1>NR&& zRM|x{50!rRqmEVTUJi-4;yo+HmZHcLqsNGEO{l?F4vQFyE1?6#M?YqGefWyZ)1ja@ z-9@pa;i%1+Fhs44*}^+YCj7&Iuf*OPzFTa*={i!j+!?jS`C@EDmHK({jV1@K)bvms z_z4a5=NMFmjI2&p>K3TFTIyZRvnjMG*tCN1@~aGa=B7Nbs;Ie*W0a=>JdY|uC{)J7 zhU99VdG6M8m^^oq{?avI`b|?@QbgVGs^a+C;Le1MG_}0%34;~@qT1v4e-u&Kl$riq z62%N%g)$}_+ybqAlIk~HFF@HPdpeK7;2vWz7^S_iKFYT3mwz;6P`5rIf-42ClTfgnGskm70Mx+|}_D4WZ20s%TuOfaRJb$>#k@1{#KEc0cTG1%N) z&^Wo3RbBBxEFpnAE+gKcEmcy9eWb^zCvWpCt@-$-cuN`ewCQ{YnrsudOfue^#&Ig{ zcgayydOGPsm`aC$=gF{;9>ci?p84@rHOr>0);|k4*^-m6-jMczo{M zUF`nD$*Hm%Cy?rM{k`IEtJ6~j?XxY$!&!gafMI_PSDkn1mbQy?uCiBddmN2%DUU)7 zV^@{fdJ$)#U0MD62oL&E^Pk_nS4u`j1xuOIcrN<7#FW=y-#XTAL(ScuIz&4w6MPP7 zGe|vcGrLr|^?re=6mwxK*iE;O-(h)PwS5Dft+Ww~lER>+n8&#DS@|IvcncQBrxgsP zHNfb(a`J*ac;*5f*-Qlp$OzPWTo8SA9rmbFxjMM5pU`I7Bv&b%1DteLp;@;2fu`eT zJop?HJy`?VY!1W^XI&LU!~pJOlPg#HyhTf{mo!e!&OL<%qVFuHEqDXw?O>J284R!6 zDpBlb*5xr2r16t(uC9G!T}zzS@37kq&xN)FFKQ@v4vz4lSJLUcNR^O~9H^~}ug6K? zc!3omV>Dfq7=FKTAC*y((2C3ag@=@vS7V{gTfy0q)dpiEW)$T(js(0zZRmzvyTjQC z`EW9Fr~wqZXXt^peFn!vbwc#ZUH<&qVoh$)hwI;@QUK<@VgP1Yi4q+C2o8CY%gXGa zv4)5JCygkEd+(3k^RcFID~Tk3yS;z{uKfD}ZX}4nh5&+}0S|=B8Rx&RprPUl&qyc| zsLkt1n8Iic7C^VgT~GFJ&YlH3*SD)%a#{2dwF=w3q9qXr+b;Kzw_%QSh9g9as?#K- zO(Vq?Ivk~I3C=MEf8xF8xRTxp!vE(*W$ z9xmCk)YCA@mGLpVU9*~CsI08{`3mo?Jqd-%l?vuxIfH5>uBY37U+$bTEMg~d2(vZ@ zKgg&OPd{(%f(*~;`EyAN%4kX-QmpI}nlF&v&qX+reWq9sn$a43>-(w!4^ab&R!Dew z39_qyg|uU5<0uT)qjY25L=}rw=KDIvI=_ni3nXT4n!YudG1$S zFQ4YZ{JN+Ew~YYbY33<$lZnQz{c~o3Lcn5W!xjJV_C(F@{{Clvrs$tR0nqZ)B>Vlu z?(=~xE1v!Mj8um0(K^m|7C$oVrk0ZvwK6IMg)PDA;lD4P`%%cBI#sJ8uY53eD?-lc zG!^Fr*Rq{qXDdOa5iP-E3jQLg4VtCk(VbYCmKO<)zusfZdzdETYfF8 z%`Zr2Wb&64s<8@&ZT|~yRW+O#qph8Eujr{6@$t6}Fg93%Y+6?~CAiV{JAHS5k?uJIzfaQ`dbw?YD|iGi{Go6ZEF=Wj?2 zZrX4;2((@lSY+QoKXMixdyPeVA)=X%XLfc>VTeEw6B9u+rI#rxr_mqaB~epq4zs^7 zaRm?S8h&d!@{*Iw7X;MV5F=C(53F2?%1I7A1h9u9K@gAaYF^q;xrBaO^U>f4b_N5wnG60{nDAF30#j}V{RUNe7vlTUTm}zC=e!0WgFkRB-%)r6^ zTQ{gb3L?{#V}PST`#_HqoI(MJKOeAcDM^Q;v_1d;wG{Dh^9G1I`KS4BlLk3TyHv;d z+8RI!;AQ|7dz^q$TPxZA8My@Fn*>Z{<3{AY8;XKJ{<`GfWte}Pe|rCIvSmg+OoRO` z8m0UXTjXagltS2yZnBVENmz`{ksw!xp1udMmAx3m{rbOdW>ui|HAb+477ADv4Jo1u zHGl0blf{xcFLdX6wpg z9TEjzSHFPR2bdj|)N5ff6h{yFl#=d^?~1b7!ku##Tm4G!J+Ou>52zQS1)xDIp46|; zm*JH%)M9{9(kRyVA2UsbG!|Gw08>&}F{=bfr&mi))$H~k;!@*72D!-?R?Mq^ArN?C zpOlmDRrlLCk{x^N$GY{q20+gmMkPWQ?4tYaCRI}Z7u(^GIf4-xN0qh)ud>b9jdw$q z#t?9!%Hz|A=eNcr!9w*tn@9;`98YC)Dmogn4^=( z)d`Omq-n>-@9aQH7ZP=kb0n#b7b9`T8h?<(;p6yf4^6lPq8H`14!*me*tO4(@L7#c zTdog7Ka=3z!4wvkv!CZH`DnNCZ>I)IO!8b^H5Sb%Qu*fS5Yv%DR42LCwzs2xgtVB9 z1rhqS?RySA9PYU6NMdHy>?CqJ&s*(ZDubcjn|qOjBx9}g+7VgPs<#&#AZ>T}7*V33 zPHx&du2je~rI;9x{f4d8{dH_BD=e?ZrsA3Q_Gv9PPN72jY64 z8K5+!x~uaBF=UL_QocL!ImMp^#zcz03Wl*&xW~tIvyOq~=FqDg`AV@7sB)i7{5gpY zd+>+wEV8`iM9U5lvL#7zVuOz_j3LPIOxf7ZpCiw5cvdS_%)x8YcFOdqrA4Y=apo*) z1s=OuGn@*-ndW?1?rvze!6m!Qcs_UE2Aii`nR!R1dY|sFzbM&Z${s0JFyF|(>)n8U zKa5Xxr$DiOc`Ez|L|Y-H`NI=@6mbGPFNpNN<6K*RkC5+?i+3lrS<^Cl!hq!~dP9c*T7Xuo&H7Rn~J9fH&5fic+;?ncr$8Ihqh>y*&Q4R44D&HAQOL zOXmFE{^MWftgNSIKutLvmhg-(D19EARY!bZ?z0#iDNf~rG~!<#pn265Es6Z-Quku<3S zvPck2(B;gnD2n~UE&JLYF!x5B?>P}FNEb`OJ1T057qM`Ci4Ec9GNVJ9G<2G5>6k*k z3>mbp9APmTMS^TYes|7OIEXp&9kV^Hbd70H4fG&h;!VrUD5e`{=(+_93UxV=>8nL2S*YRq5CgX}(_`}czy=rUpg RP@5^xWF?ir0@D-P1GmyZinBen-91RKmxh!T|sP_$tZ@IsgD#0P5Kd>lsQ4Og@=M z-N4q$IvN0gKPvzb90~y3pj5#-0Du=S0I+8P0Endk03g@&Mr{dH1%|z>hAaS3@%h88 zb^@x5=Aok`2Phk**+mteS*a;003QDx*)4_ts$`A}fo-B^d(#)Ry)yI}f%WMVOD?z!=vcO%FA%?_zq>l|>&N6^?Z9N}uWDN^ZhO9r zlBGdb(DX37lln;a)8?NXFmN$CPJgTE$AGa%DB-19hk^`b>EJq0>QHhhU^HONFL~8( z)MMq8E*Ojj`|XP{h@LALIauga+eaJpV)w%U;@er}N{?-gcUVu+Dx6-+r^%lUGff9V z*d*@&dY42OQ>>Z2#Dqm0(1|x!_rlX`_(5&xHUCgXE@Pv$jiLROx3_}5*6pg3@vHpK zM3`gubKIllG0^_O!JomU&OIaSDCNR*=6|n~mioC>yk8uoHJ)|W%n*8~3Xvf90=;*# zDP3u+)ePZ&k!sk)qNn$oO;bBl?=Z)N1#1&r$OZn+G?({w@un2?1A28Cz#C{|(7)wW zg@1MNBt!xz)UH->=!&#nL4HqfmP^k~XZiOfg|)IYtyXoj_OR9<`b%-up}rwB%lj4^ zX`12GKL;FUjdCz8AoE4&@j9Wkf%E58X-josW9JEKbe=20*=f0r>-Z?smK+=MK&mYP zSx*|iLG+E6zU67v2pl$Ko-p&+@J<)>0Vg)HG>2hFQB>n!S41kR92q2{z2zE&*2Yh? zARn@Y56QBFspxeyNid=$EfsY52K{64P92h~`@SSC$q{hH&@2%?;i$ugb!YMtEA~7O zkT&o0RuLCzFSUFr^HDwI*SAFsSt~7ysEw019aHc!(@EstytYV@Dp%<(Az4p6oPU2M z;7G*hciZezsAfRA&hYB~KgX$(h>9x!a}XQ0L(v~APeI~876MjAV8g&D+n_`)JZ@}7 zZXG&j%lJd4+qHHs?P*ZT8hc@mECLI=(|zq+G%XCbq=t41YtCY zYhZP`eYuh}M-s}yK&kty-=a#Q8w11QYcW3g&!;r@2Oc-Sm=VG=6<^0zU|jxoiVD$; zcKq+ImwV+_%}jW7RpjWU#-DUy2Iw#VyYY{_`xlv9lAEC?-l|qwOGLx&hCQsDnwd)K zO849ABnAb$(Ln^+=-^1>Y^P+->Vt3Hne~#@Pd=R=>P}TKsq{WCXRNQoMbfX!hsglB zvz@Z;V+8@=YXmpILFNV8>RtTPMA^v%>{2Seb^5WV9lbA~<=}rYu}ZKsb%D=623N50#Ebzna;JrVIQ80b$%bOeeFUVu;E=Hon%cBB*}JQH8M$0@Mn5< z#sSYiE>)DQfAH5dTw;arnvsmwQseF7FUcrLx27Yd{AbkOYZfM6u+mcX1{T(-Y|MtE zkkEZx#-jQhEkz|mO2!z0_t>bmuibHr?Ms*Ai^S4&tm4j+pqY_p2pm(dF$)G=rY?d( z2N<}5Ek+rA>hFS>+uo@Qt-(FW+L^yR&$@$142P5u9nPyE)& ziuo)iC(u}*`RL@;Dg(1H>u z06__qbxpYuge%3Wbjb>~5O=H^OhOH%P86&J$%w z9*pqF<9^cp#Q79%Rxt?sHQxZD|L&QU7axSh+%f#pPnXWjr8ZIQ{WQsRC3fexZZlHQ zP;Kc_h1dM|ZilKLXPuRbm+dpX&5~+&=sjJ*V8Xkt3Yngylwr$vb@{B}=b%FNv7*aY ziTiU+B$Y?lxoCOMIYBq)#t`+}9r{a)i$7*|kTc=Vv52hMy}F2b@dcdKh^HaynlNyQ z8lqu8+^Bgf>5&`n{MBqy$vRviWPp*4|`K@`+gkCP`x!+SNJIWAmR z{Pc~+udq7phdYCUi|Ay5urQTmrwmaFSrX@5!|naI ziD9%fYd@M&ImZJR#(*}{?|{l0QDAlIhTuTPI7dM%a}zU8-^K+aTT7qQ3G+YcM)j*e zhswb`QUMAFq~B{Zv)K4}RUM2@cOoDIpfBclc2Z4GUVe=vIr8qWkRwNH>Dy^Wo0Ftf zuZgz`>VCBh<||MZ42F+9lXrg)A(s1u$>Zg9oGZ8Qq)}jMxkAlWP@iqaW7r5*_%5BH z`>BUBVSI6watMSUHfYbJRct_#V4x>ksLsw?>!>>$$ z+SN(ksr1>GVd>9qUE)k1vN6L6PGnvMt0g#{;yC`ki=JlP2wHWWIyma&x{;KJRmAK4 z=z1@9YC}xm6FFDD98xMyX#KZ(VrRY!bLioon}!C#>ow^*ptpIj1)E@k%`Y2pOI=-R zPV@6yU&P$59qi&X$b};V@jT^!*5j);v$W+Q0jRE9VB8BJ>O|{5}QxA%~kZ-XKKP*B&VsKt`}gT6tKu z%~UCssAj!B!)9{H#s1=L7MTapQel%od80n3(X|Pp>lvmp!@d<7k2y#0_-`5JyCj~d z`?;?SSN@BT6e&N2glbl45%t3=!o5Y>*Y+)1pJY?;r{K4 z&q{Rz={u<=%OxZv;?A}Dr<}QZuYN`Ee$Ooxt8Kk4uh=x2k!%m7i*sN$XL!saSVv~IMy_}%eE*`R+@n@r9u^V6hOxB#)PXYD z=&p3NJZ_-O2e>~yfac}pm@sS(tEZ%#T{PdU-5KISlFHY~mbGymL{Sk<&FN0*C>jVb zkt)r9Zg_u#nY8vs2zsr5EQIr6oP4OY2LDwrj}gzP5PNxvyuPO3OUD{v@jBJ-jZG^i z!61oc%+>q!2({#Q-%Ga1TgvNNY}QZPjheVgqLbJdFI8W6&5phdN184?ngU+az%Dg0 zD(mynk$jPu#gTU^k;f(Es0o@iNgtMa4tquKk6OVR=y($*}rOG7$IFCsyAmq6*#fbM^5NTBuON7trJD_l?BH zYG*`R+a}E&cXXr#KF7ZO6^czzOt?ACn43ya#$GJ1`-ZA)cSF;&{jn~)tsD=(0~7J` z>in-lTg9AG9e87cmg7Y1;o33sOvdZ-L88U@M?wPn*!?dMUB+DL{5@;T$yXjy=?8bk zHfM`C&Sw>_N4`0vo}h5H!pm-B2!`-{TW(RSim=+sd3?Pn1Y*M3Fr%u8109Iu*RegY2BJ+cbTUilpENFfoEEn%JM#I-6J!Z|6F-9}?_xHn8WV zvIxg;eSjICnd}%zWtV(Mo;GlIdrrjMS%FCqJO|O5uL%g|T_BN_B+O$lD^1#)*S6Hy}^Z4eR`+ z8a=&}PbT2!H;Qf>p}aAzb@Zx3#pCeVC+>bzpxW6|f4ZjzL;0B^&d!=w`=^A0QJ05* zV`KQUD7VsmL+pI2Ia9*gK5>68)Two@KDP+_8rrIH6OgyV@0C^z3J9a|S$_UCX+s>{ z`J*^he}r>?b>y?}9z919B@zNk_7H;v$wE!RtKXeyW5;Ow3pb2-ma<4{DT|zE_eRhZ zo0!Ko(|aebn-4}aZ*A4YDe;`qP8di^z77_NMT=$mtfXK|n-fNJasFy53UbMoQsXFZ;gRM~i|Qt27x_okctmJ+JYiDlU5Q zU%X{Y;&2xFb>XXn2ba>x)Fc~yDRqDos#h0I%*`T__fEEhsLX=Co;7)3oGVloBM9G@ zzJ@752}Avm+dfzR#e!1jh#5k(Aq-wM8% zA`Ht3tE~3w@>*t^coNT*$xfYMYcvsXNIi^X+9wT+6%7i|TrxWUk|=ntC0Vue z^J>6g;I{z1)a8V<*kke!ImkvE!Ux9Q_fGd73%0{f+A9^DpfU#}&;RPQklJcDgjDbO zEo&A@Gll=L#bj+2K3~FD^}pzg%ayMX$X}{5H@GhmF&bV(FALOXx}dS;o59~@`&;x5 zJ`u5Ty2T}8sLSI)-x6$iSCl9xcm1Gjo-XA_ z_k#AkjdQl!ViXmw>@DzG^*_klukBbwudhSh81DJL6;7_9VjCxMYfF3kknPOxk*yyC zCu`5W97~p~36(x)MFbJL3}g^b7dDY5`!rBwIbC6+;<~sY8!XzT=zA@UKkk&dKD4qK zZ(_-cTN7%bo`cF)UgzDr{Hb%*=OB{-h^+5hmtiO$v3ISIuq2YHFTw4v2{{eIslfAx zlmN}cvbgoFk5YyGstP+P%J2AL^u|(xowD2+K!sy=R^8)Z@+^R`ck7f$q@@0tDm;p$ z^Jvwn&FUN^t?IUtSq7Yo^1eKchh?93BzoA1dZ^bwzK1Y~+qL)!ZY` zheoS1ficCiqY36a|35U(D$bj%HnQ)|nS2|4;y1oHLWt8X>`U zm7i(J(0kmCNQQ0_759%9a1)NfBo3N{(k?NdOhUh`1ejC~j%5zbxQI(x0dFvGyQZp0 zkhYW;eaAVIH(ImE4tvh5p7C)R2P3c2&ry$N3W`Gcy9ZmJ=TG!OmTs_6fHIUyT&iEl(kD|LkNCVLZMf@g2HAW=i!# z*b}+7cv|WFbK1UEsm%L6z{gU1oI=`z%i;wO5Yu<3+tbw&&6nB&Qg=4Vff>n#xMlDe z22nvw<2K1$b9%ZN<3sOBZEbBPqy3LQKJfDWsYSwFBZIS{GK6#cxZLU_?=mI6OP^g8 ztf^h~kfQ1@6Zg4C4r-0MiR(X{e>KAAk%=Wr!GXhT9>R0#tBH|F&G`L-6Y^!QRij!B zf52_$61#&RHOcpTbl$k9;(!;?-tbqe7t9|t!BAYmQMT$dDw@_CUi;wrrc z6zu5f?!00JxLMzb-t1$-2Q=Hx< zYFHpNKpDDp{lrw$TazJP$NlUU4u`9u5C1A_2%oc7xe)=`D@|8kr7tnwH)3x-vxI}B zb4yCruVtYv&!q1lIq+>u>*DsG>-WDMhGZR#NELTQWxIFKbo*`QNiaI-!+A_9vFU?u zTBaBOzN}Lp-C~T1G+{T|sF~ekd6W!dAM`sMG4gePceDxy z#$C73_M2m4W!)dm$7BkM8 zqS_g>Y$~Je_EapOX{9zO!{_#oDa4QJKz4JCIG#F!D*(nzU0+aEHIo+NaJ)CX?72g2>;P00H5JO_EMWfub`%u( diff --git a/modules/n1ql/examples/dml/set-xattr.jsonc b/modules/n1ql/examples/dml/set-xattr.jsonc new file mode 100644 index 000000000..3d39c7612 --- /dev/null +++ b/modules/n1ql/examples/dml/set-xattr.jsonc @@ -0,0 +1,17 @@ +[{ + "a": { + "airportname": "San Francisco Intl", + "city": "San Francisco", + "country": "United States", + "faa": "SFO", + "geo": { + "alt": 13, + "lat": 37.618972, + "lon": -122.374889 + }, + "icao": "KSFO", + "id": 3469, + "type": "airport", + "tz": "America/Los_Angeles" + } +}] \ No newline at end of file diff --git a/modules/n1ql/examples/dml/set-xattr.n1ql b/modules/n1ql/examples/dml/set-xattr.n1ql new file mode 100644 index 000000000..fe1d1d663 --- /dev/null +++ b/modules/n1ql/examples/dml/set-xattr.n1ql @@ -0,0 +1,8 @@ +UPDATE airport AS a +SET META(a).xattrs.metadata = { + "lastUpdatedBy": "Admin", + "reviewed": true, + "notes": "Updated terminal info" +} +WHERE a.faa = "SFO" +RETURNING a; \ No newline at end of file diff --git a/modules/n1ql/examples/dml/unset-xattr.n1ql b/modules/n1ql/examples/dml/unset-xattr.n1ql new file mode 100644 index 000000000..e0b8436dc --- /dev/null +++ b/modules/n1ql/examples/dml/unset-xattr.n1ql @@ -0,0 +1,3 @@ +UPDATE airport AS a +UNSET META(a).xattrs.metadata +WHERE a.faa = "SFO"; \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/indexing-meta-info.adoc b/modules/n1ql/pages/n1ql-language-reference/indexing-meta-info.adoc index 501920d06..2d5d684cb 100644 --- a/modules/n1ql/pages/n1ql-language-reference/indexing-meta-info.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/indexing-meta-info.adoc @@ -24,8 +24,14 @@ Note that this property gives correct results only when used in a xref:n1ql-lang id:: include::./metafun.adoc[tag=metadata-id] +xattrs:: +include::./metafun.adoc[tag=metadata-xattr] ++ +NOTE: Starting with Couchbase Server 8.0, you can index any number of XATTR fields using the xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] statement. + The `META()` function does not require a keyspace parameter when creating an index, since it implicitly uses the keyspace being indexed. + == Examples include::ROOT:partial$query-context.adoc[tag=section] diff --git a/modules/n1ql/pages/n1ql-language-reference/insert.adoc b/modules/n1ql/pages/n1ql-language-reference/insert.adoc index 30ed32ac1..d1560b1dc 100644 --- a/modules/n1ql/pages/n1ql-language-reference/insert.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/insert.adoc @@ -230,13 +230,22 @@ You can insert NULL, empty, or MISSING values. options:: [Optional] An object representing the metadata to be set for the inserted document. -Only the `expiration` attribute has any effect; any other attributes are ignored. +Only the listed attributes have any effect; the statement ignores the others. expiration::: An integer, or an expression resolving to an integer, representing the {document-expiration}[document expiration] in seconds. + If the document expiration is not specified, it defaults to `0`, meaning the document expiration is the same as the {bucket-expiration}[bucket or collection expiration]. +xattrs::: +An object containing top-level extended attribute (XATTR) names and their corresponding JSON values. ++ +The object includes only the attributes you want to add or update and does not affect other existing attributes. +For each atttribute, you must provide its complete value. +You cannot specify or update individual nested fields, as each attribute is updated as a whole. ++ +NOTE: Starting with Couchbase Server 8.0, you can include up to 15 XATTRs per query. + For examples illustrating the VALUES clause, see <>. [[insert-select]] @@ -263,13 +272,22 @@ If the VALUE is omitted, the entire JSON document generated by the SELECT statem options:: [Optional] An object representing the metadata to be set for the inserted document. -Only the `expiration` attribute has any effect; any other attributes are ignored. +Only the listed attributes have any effect; the statement ignores the others. expiration::: An integer, or an expression resolving to an integer, representing the {document-expiration}[document expiration] in seconds. + If the document expiration is not specified, it defaults to `0`, meaning the document expiration is the same as the {bucket-expiration}[bucket or collection expiration]. +xattrs::: +An object containing top-level extended attribute (XATTR) names and their corresponding JSON values. ++ +The object includes only the attributes you want to add or update and does not affect other existing attributes. +For each atttribute, you must provide its complete value. +You cannot specify or update individual nested fields, as each attribute is updated as a whole. ++ +NOTE: Starting with Couchbase Server 8.0, you can include up to 15 XATTRs per query. + select:: <> icon:caret-down[] [[select-statement]] @@ -988,6 +1006,23 @@ curl -v http://localhost:8093/query/service -u Administrator:password \ ---- ==== +[[example-xattr]] +.Insert a document with an extended attribute (XATTR) +==== +Insert a document into the `airline` keyspace with an extended attribute, `metadata`. + +.Query +[source,sqlpp] +---- +INSERT INTO airline (KEY, VALUE, OPTIONS) + VALUES ("airline:1402", + { "callsign": "MY-AIR", + "country": "United States", + "type": "airline" }, + { "xattrs": { "metadata": { "created_by": "admin", "created_at": "2025-08-05" } } }); +---- +==== + [#insert-explain-plan] == Explain Plan diff --git a/modules/n1ql/pages/n1ql-language-reference/metafun.adoc b/modules/n1ql/pages/n1ql-language-reference/metafun.adoc index 449fbc2c3..70a604ada 100644 --- a/modules/n1ql/pages/n1ql-language-reference/metafun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/metafun.adoc @@ -1026,6 +1026,24 @@ type::: Value for the type of document; currently only `json` is supported. This property is not indexable. If you attempt to build an index on this property, an error is returned. +xattrs::: +// tag::metadata-xattr[] +Value representing extended attributes (XATTRs) of a document. ++ +-- +To access XATTRs, use the syntax `META().xattrs.[.]`, where: + +* `` is a top-level attribute name or key of the XATTR object. +* `` is an optional subpath within that attribute. +-- ++ +While you can create an index on a specific extended attribute like `META().xattrs.attr1`, you cannot create an index on the entire `META().xattrs` object itself. +// end::metadata-xattr[] ++ +Attempting to select the entire `META().xattrs` object will return an empty result. ++ +NOTE: Starting with Couchbase Server 8.0, you can include up to 15 XATTRs per query. + === Return Value The bare function returns a JSON object containing the specified document's metadata. diff --git a/modules/n1ql/pages/n1ql-language-reference/update.adoc b/modules/n1ql/pages/n1ql-language-reference/update.adoc index 1bc0ba3aa..a3b3d1453 100644 --- a/modules/n1ql/pages/n1ql-language-reference/update.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/update.adoc @@ -167,19 +167,27 @@ The value may be a generic expression term, a subquery, or an expression that re update-for:: <> icon:caret-down[] -The SET clause also supports alternative arguments which enable you to set the expiration of the document. +The SET clause also supports alternative arguments which enable you to set the expiration and extended attributes of the document. [horizontal] -meta:: -A {meta}[META().expiration] expression specifying the expiration property of the document being updated. +meta:: -expiration:: -An integer, or an expression resolving to an integer, representing the {document-expiration}[document expiration] in seconds. +A META() expression specifying the document metadata. ++ +To set the expiration property, use {meta}[META().expiration]. ++ +To set extended attributes (XATTR), use {meta}[META().xattrs.[.\]] +expiration::: +An integer, or an expression resolving to an integer, representing the {document-expiration}[document expiration] in seconds. ++ [NOTE] If the document expiration is not specified, the document expiration is set according to the request-level {preserve_expiry}[preserve_expiry] parameter. If this is `true`, the existing document expiration is preserved; if `false`, the document expiration defaults to `0`, meaning the document expiration is the same as the {bucket-expiration}[bucket or collection expiration]. +xattrs::: +An object containing one or more extended attribute (XATTR) names as top-level keys and their corresponding JSON values. + [[unset-clause]] === UNSET Clause @@ -192,12 +200,22 @@ image::n1ql-language-reference/unset-clause.png["Syntax diagram: refer to source Removes the specified attribute from the document. -[horizontal.compact] +[horizontal] path:: A <> specifying the attribute to be removed. update-for:: <> icon:caret-down[] +meta-xattr:: +An expression specifying the extended attribute (XATTR) to be removed. ++ +-- +The format is {meta}[META().xattrs.[.\]], where: + +* `` is a top-level attribute name or key of the XATTR object. +* `` is an optional subpath within that attribute. +You can directly reference individual fields in composite XATTR values through the nested path. +-- [NOTE] You cannot use the UNSET clause to unset the document expiration. To unset the document expiration, set the document expiration to `0`. @@ -409,3 +427,31 @@ Alternatively, if the request-level {preserve_expiry}[preserve_expiry] parameter include::example$dml/update-unset-expire-alt.n1ql[] ---- ==== + +[[example-10]] +.Update a document and set an extended attribute (XATTR) +==== + +.Query +[source,sqlpp] +---- +include::example$dml/set-xattr.n1ql[] +---- + +.Result +[source,json] +---- +include::example$dml/set-xattr.jsonc[] +---- +==== + +[[example-11]] +.Update a document and unset an extended attribute (XATTR) +==== + +.Query +[source,sqlpp] +---- +include::example$dml/unset-xattr.n1ql[] +---- +==== diff --git a/modules/n1ql/pages/n1ql-language-reference/upsert.adoc b/modules/n1ql/pages/n1ql-language-reference/upsert.adoc index 5f97821e5..462002206 100644 --- a/modules/n1ql/pages/n1ql-language-reference/upsert.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/upsert.adoc @@ -181,9 +181,15 @@ Also enables you to set the {document-expiration}[expiration] of the upserted do For details, refer to {values-clause}[VALUES Clause]. [NOTE] -When updating a document, if the document expiration is not specified, the document expiration is set according to the request-level {preserve_expiry}[preserve_expiry] parameter. +==== +* When updating a document, if the document expiration is not specified, the document expiration is set according to the request-level {preserve_expiry}[preserve_expiry] parameter. If this is `true`, the existing document expiration is preserved; if `false`, the document expiration defaults to `0`, meaning the document expiration is the same as the {bucket-expiration}[bucket or collection expiration]. +* When adding or updating extended attributes (XATTRs), you must provide the complete value for each attribute. +You cannot specify or update individual nested fields, as each attribute is updated as a whole. +For example, if an existing XATTR named `a` has the value `{"b":1}`, an UPSERT operation with the option `{"xattrs":{"a":{"c":1}}}` completely replaces the value of `a` with `{"c":1}`. +==== + [[insert-select]] === Insert Select @@ -199,9 +205,15 @@ Also enables you to set the {document-expiration}[expiration] of the upserted do For details, refer to {insert-select}[Insert Select]. [NOTE] -When updating a document, if the document expiration is not specified, the document expiration is set according to the request-level {preserve_expiry}[preserve_expiry] parameter. +==== +* When updating a document, if the document expiration is not specified, the document expiration is set according to the request-level {preserve_expiry}[preserve_expiry] parameter. If this is `true`, the existing document expiration is preserved; if `false`, the document expiration defaults to `0`, meaning the document expiration is the same as the {bucket-expiration}[bucket or collection expiration]. +* When adding or updating extended attributes (XATTRs), you must provide the complete value for each attribute. +You cannot specify or update individual nested fields, as each attribute is updated as a whole. +For example, if an existing XATTR named `a` has the value `{"b":1}`, an UPSERT operation with the option `{"xattrs":{"a":{"c":1}}}` completely replaces the value of `a` with `{"c":1}`. +==== + //// [[select-statement]] ==== SELECT Statement diff --git a/modules/n1ql/partials/grammar/dml.ebnf b/modules/n1ql/partials/grammar/dml.ebnf index 423ee2a61..fa4f80c73 100644 --- a/modules/n1ql/partials/grammar/dml.ebnf +++ b/modules/n1ql/partials/grammar/dml.ebnf @@ -144,12 +144,12 @@ returning-clause ::= 'RETURNING' (result-expr (',' result-expr)* | /* end::returning-clause[] */ /* tag::set-clause[] */ -set-clause ::= 'SET' ( meta '=' expiration | path '=' expr update-for? ) - ( ',' ( meta '=' expiration | path '=' expr update-for? ) )* +set-clause ::= 'SET' ( path '=' expr update-for? | meta '=' ( expiration | xattrs ) ) + ( ',' ( path '=' expr update-for? | meta '=' ( expiration | xattrs ) ) )* /* end::set-clause[] */ /* tag::unset-clause[] */ -unset-clause ::= 'UNSET' path update-for? (',' path update-for?)* +unset-clause ::= 'UNSET' ( path update-for? | meta-xattr ) ( ',' ( path update-for? | meta-xattr ) )* /* end::unset-clause[] */ /* tag::update-for[] */ From 986e5c298cb06442c2d0a12db7dc40e871badd77 Mon Sep 17 00:00:00 2001 From: Gary Gray <137797428+ggray-cb@users.noreply.github.com> Date: Thu, 21 Aug 2025 10:33:54 -0400 Subject: [PATCH 28/80] Removing single reference to memcached buckets (#367) * Removing single reference to memecached bukets * Removing Couchbase and Ephemeral at Richard's suggestion --- modules/eventing/pages/eventing-faq.adoc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/eventing/pages/eventing-faq.adoc b/modules/eventing/pages/eventing-faq.adoc index c5170ac5e..c154ade78 100644 --- a/modules/eventing/pages/eventing-faq.adoc +++ b/modules/eventing/pages/eventing-faq.adoc @@ -47,8 +47,7 @@ This means that the event entry points of *OnUpdate* and *OnDelete* to the Event * Can a Function listen to all changes across Couchbase Server? + -A defined Function listens only to changes that are exposed using the DCP for the source collection (Couchbase and Ephemeral) in the data-nodes. -Memcached buckets (and thus underlying collections) are not supported. +A defined Function listens only to changes that are exposed using the DCP for the source collection in the data-nodes. The Function cannot listen to changes happening in other Couchbase components, such as FTS, Views, or GSI; nor can it listen to system events. From d6f932ce953c3facdf926f875ff286bdc6b92da4 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Thu, 12 Jun 2025 09:29:47 +0530 Subject: [PATCH 29/80] [DOC-10909] Add 'Errors' Logging Qualifier (#365) --- modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc index fc81f8ca6..7c0d18927 100644 --- a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc +++ b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc @@ -840,6 +840,7 @@ A completed request is logged if _any_ of the qualifiers are met (logical OR). `context`:: Log requests with this client context ID. `statement`:: Log requests that match the specified LIKE search pattern in the query text. `plan`:: Log requests where the specified plan field values appear in the query plan. +`errors`:: Log requests with at least this many errors. For full details, see xref:n1ql-rest-admin:index.adoc#Logging_Parameters[Logging Parameters]. From 49b628664f222e3df2ec71b3d6b87a2c792ba82b Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Fri, 20 Jun 2025 18:59:58 +0530 Subject: [PATCH 30/80] [DOC-10618] Additional Date Formats (#368) --- .../n1ql-language-reference/datefun.adoc | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/modules/n1ql/pages/n1ql-language-reference/datefun.adoc b/modules/n1ql/pages/n1ql-language-reference/datefun.adoc index 87d70ace0..b7aa210ad 100644 --- a/modules/n1ql/pages/n1ql-language-reference/datefun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/datefun.adoc @@ -506,6 +506,72 @@ The elements are given in the table below. | Seconds since 1970-01-01 00:00:00 UTC | `1624904579` +| `x` +| Same as `%D` +| `2021-06-28` + +| `r` +| 12-hour time, hh:mm:ss AM/PM +| `07:22:59 AM` + +| `X` +| Same as `%T` +| `19:22:59` + +| `:z` +| UTC offset in the format, +HH:MM +| `+05:30` + +| `::z` +| UTC offset in the format, +HH:MM:SS +| `+05:30:00` + +| `:::z` +| UTC offset with minimum precision as required for the time zone +| `+05:30` or `+05:30:00` + +| `V` +| ISO week number +| `27` + +| `G` +| Year corresponding to the ISO week number +| `2025` + +| `j` +| Day of the year +| `179` + +| `q` +| Quarter of the year, 1-4 +| `2` + +| `w` +| Day of the week (Sunday=0) +| `1` + +| `u` +| Day of the week (Monday=1, Sunday=7) +| `2` + + +| `U` +| Week number of year (Sunday is first day of the week) +| `27` + +| `W` +| Week number of year (Monday is first day of the week) +| `27` + +| `#` +| Time since Epoch in the format, [total hours]:mm:ss +| `406464:27:15` + + +| `@` +| Time since Epoch in the format, [total hours]:mm:ss.fff +| `406464:27:15.123` + |==== To specify a date format, you can put the format specifiers together in any order, along with any other characters as required. From 29f3d306ac78b4316a4445a8ef4a0dfe8c9d3782 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Tue, 9 Sep 2025 10:54:46 +0100 Subject: [PATCH 31/80] [DOC-11152] Changes to date functions (#383) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/datefun.adoc | 106 ++++++++++++++---- 1 file changed, 87 insertions(+), 19 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/datefun.adoc b/modules/n1ql/pages/n1ql-language-reference/datefun.adoc index b7aa210ad..add2ac3da 100644 --- a/modules/n1ql/pages/n1ql-language-reference/datefun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/datefun.adoc @@ -590,13 +590,23 @@ If the date string does not explicitly declare the value of a component, then th * The month and day default to 1. * The century (when not specified by year) defaults to 19 if year is greater than or equal to 69, or 20 otherwise. * All other numeric components default to 0. -* The time zone defaults to the local local system time zone. +* The time zone defaults to the local system time zone. In cases where the timezone is not specified, the local system time is assumed. For example, `2016-02-07` is equivalent to `2016-02-07T00:00:00` and parsing just `16` as the year is equivalent to `2016-01-01T00:00:00` in the local system time zone. ==== +[NOTE#tzn-date-format] +.TZN Date Format +==== +In addition to the date formats listed <>, Couchbase Server 8.0 and later also supports the `TZN` (Time Zone Name) format. +This format parses date strings in the same way as `TZD` but outputs the time zone name instead of the offset. +For example, the `TZN` representation of the "Australia/Darwin" time zone is `ACST`. + +For an example of its usage, refer to the <> function. +==== + [#manipulating-components] == Manipulating Date Components @@ -1300,7 +1310,7 @@ WHERE reviews[0].date BETWEEN "2013-01-01 %" AND "2014-01-01 %"; NOTE: When querying between two dates, you must specify the full date (with time and time zone) or use the wildcard character (%). [#fn-date-format-str] -== DATE_FORMAT_STR(date1, fmt) +== DATE_FORMAT_STR(date1, [input-fmt,] fmt) === Description @@ -1313,6 +1323,14 @@ A string, or any valid xref:n1ql-language-reference/index.adoc[expression] which + If this argument is not a valid date string then `null` is returned. +input-fmt:: +The format of the input string, `date1`. +This can be a string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string. ++ +*Optional argument*. +Only required if `date1` is not in a standard format or if the input and output formats are different. +Available in clusters running Couchbase Server 8.0 and later. + fmt:: A string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string, representing a <> to output the result as. + @@ -1329,7 +1347,8 @@ A date string in the format specified. ---- SELECT DATE_FORMAT_STR('2016-05-15T00:00:23+00:00', '1111-11-11') as full_to_short, DATE_FORMAT_STR('2016-05-15', '1111-11-11T00:00:00+00:00') as short_to_full, - DATE_FORMAT_STR('01:10:05', '1111-11-11T01:01:01Z') as time_to_full; + DATE_FORMAT_STR('01:10:05', '1111-11-11T01:01:01Z') as time_to_full, + DATE_FORMAT_STR('15-MAY-2016', 'DD-MON-YYYY', 'YYYY-MM-DD') as month_to_numeric; ---- .Results @@ -1338,8 +1357,9 @@ SELECT DATE_FORMAT_STR('2016-05-15T00:00:23+00:00', '1111-11-11') as full_to_sho [ { "full_to_short": "2016-05-15", - "short_to_full": "2016-05-15T00:00:00-07:00", - "time_to_full": "0000-01-01T01:10:05-08:00" + "short_to_full": "2016-05-15T00:00:00Z", + "time_to_full": "0000-01-01T01:10:05Z", + "month_to_numeric": "2016-05-15" } ] ---- @@ -1799,15 +1819,15 @@ SELECT DATE_TRUNC_MILLIS(1463284740000, 'day') as day, [ { "day": 1463270400000, - "month": 1462147200000, - "year": 1451696400000 + "month": 1462060800000, + "year": 1451606400000 } ] ---- ==== [#fn-date-trunc-str] -== DATE_TRUNC_STR(date1, part) +== DATE_TRUNC_STR(date1, part [,fmt]) === Description @@ -1827,6 +1847,14 @@ This function accepts the components `millennium`, `century`, `decade`, `year`, + If an invalid part is specified, then `null` is returned. +fmt:: +The format of the input string, `date1`. +This can be a string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string. ++ +*Optional argument*. +Only required if `date1` is not in a standard format. +Available in clusters running Couchbase Server 8.0 and later. + === Return Value A date string representing the truncated date. @@ -1838,7 +1866,8 @@ A date string representing the truncated date. ---- SELECT DATE_TRUNC_STR('2016-05-18T03:59:00Z', 'day') as day, DATE_TRUNC_STR('2016-05-18T03:59:00Z', 'month') as month, - DATE_TRUNC_STR('2016-05-18T03:59:00Z', 'year') as year; + DATE_TRUNC_STR('2016-05-18T03:59:00Z', 'year') as year, + DATE_TRUNC_STR('05/18/2016 03:59:00', 'month', 'MM/DD/YYYY HH24:MI:SS') as month_custom; ---- .Results @@ -1848,7 +1877,8 @@ SELECT DATE_TRUNC_STR('2016-05-18T03:59:00Z', 'day') as day, { "day": "2016-05-18T00:00:00Z", "month": "2016-05-01T00:00:00Z", - "year": "2016-01-01T00:00:00Z" + "year": "2016-01-01T00:00:00Z", + "month_custom": "05/01/2016 00:00:00" } ] ---- @@ -2594,12 +2624,13 @@ AS Milliseconds; ==== [#fn-date-str-to-utc] -== STR_TO_UTC(date1) +== STR_TO_UTC(date1 [, [input-fmt,] fmt]) === Description Converts a date string into the equivalent date in UTC. -The output date format follows the date format of the date passed as input. +By default, the output date format follows the date format of the date passed as input. +In clusters running Couchbase Server 8.0 and later, you can specify a different output format if needed. === Arguments @@ -2609,6 +2640,20 @@ This is the date to convert to UTC. + If this argument is not a valid date format, then `null` is returned. +input-fmt:: +The format of the input string, `date1`. +This can be a string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string. ++ +*Optional argument*. +Only required if `date1` is not in a standard format or if the input and output formats are different. + +fmt:: +The format of the resulting UTC date. +This can be a string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string, and must be a <>. ++ +*Optional argument*. +If not specified, the output date format follows the date format of the input string, `date1`. + === Return Value A single date string representing the date string converted to UTC. @@ -2619,7 +2664,8 @@ A single date string representing the date string converted to UTC. [source,sqlpp] ---- SELECT STR_TO_UTC('1111-11-11T00:00:00+08:00') as full_date, -STR_TO_UTC('1111-11-11') as short_date; + STR_TO_UTC('1111-11-11') as short_date, + STR_TO_UTC('1111-11-11', 'YYYY-MM-DD', 'YYYY-MM-DD HH:MI:SS') as utc_date; ---- .Results @@ -2628,19 +2674,21 @@ STR_TO_UTC('1111-11-11') as short_date; [ { "full_date": "1111-11-10T16:00:00Z", - "short_date": "1111-11-11" + "short_date": "1111-11-11", + "utc_date": "1111-11-11 12:00:00" } ] ---- ==== [#fn-date-str-to-tz] -== STR_TO_TZ(date1, tz) +== STR_TO_TZ(date1, tz [, [input-fmt,] fmt]) === Description Converts a date string to its equivalent in the specified timezone. -The output date format follows the date format of the date passed as input. +By default, the output date format follows the date format of the date passed as input. +In clusters running Couchbase Server 8.0 and later, you can specify a different output format if needed. === Arguments @@ -2655,10 +2703,25 @@ A string, or any valid xref:n1ql-language-reference/index.adoc[expression] which + If this argument is not a valid timezone, then `null` is returned. +input-fmt:: +The format of the input string, `date1`. +This can be a string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string. ++ +*Optional argument*. +Only required if `date1` is not in a standard format or if the input and output formats are different. + +fmt:: +The format of the output date. +This can be a string, or any valid xref:n1ql-language-reference/index.adoc[expression] which evaluates to a string, and must be a <>. ++ +*Optional argument*. +If not specified, the output date format follows the date format of the input string, `date1`. + === Return Value A single date string representing the date string converted to the specified timezone. +[[ex-str-to-tz]] === Examples ==== @@ -2666,7 +2729,10 @@ A single date string representing the date string converted to the specified tim ---- SELECT STR_TO_TZ('1111-11-11T00:00:00+08:00', 'America/New_York') as est, STR_TO_TZ('1111-11-11T00:00:00+08:00', 'UTC') as utc, - STR_TO_TZ('1111-11-11', 'UTC') as utc_short; + STR_TO_TZ('1111-11-11', 'UTC') as utc_short, + STR_TO_TZ('1111-11-11', 'UTC', 'YYYY-MM-DD', 'YYYY-MM-DD HH:MI:SS') as utc_datetime, + STR_TO_TZ('1111-11-11T00:00:00+07:00', 'Europe/Paris', + "YYYY-MM-DDThh:mm:ssTZD", "YYYY-MM-DDThh:mm:ssTZN") as tzn; ---- .Results @@ -2674,9 +2740,11 @@ SELECT STR_TO_TZ('1111-11-11T00:00:00+08:00', 'America/New_York') as est, ---- [ { - "est": "1111-11-10T11:00:00-05:00", + "est": "1111-11-10T11:03:58-04:56", "utc": "1111-11-10T16:00:00Z", - "utc_short": "1111-11-11" + "utc_short": "1111-11-11", + "utc_datetime": "1111-11-11 12:00:00", + "tzn": "1111-11-10T17:09:21LMT" } ] ---- From b149bae60c283b2b4423e0411da5dcf0e1c95ac8 Mon Sep 17 00:00:00 2001 From: Ray Offiah <77050471+RayOffiah@users.noreply.github.com> Date: Wed, 30 Jul 2025 13:40:03 +0100 Subject: [PATCH 32/80] Merge pull request #385 * [DOC-13376]: Feedback on Read Data and Return Results | Couchbase Docs --- modules/guides/pages/select.adoc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/guides/pages/select.adoc b/modules/guides/pages/select.adoc index 889188f2e..9dc5f8508 100644 --- a/modules/guides/pages/select.adoc +++ b/modules/guides/pages/select.adoc @@ -56,7 +56,7 @@ The result includes each row found. [source,csharp] ---- -include::dotnet-sdk:hello-world:example$StartUsing.cs[tag=n1ql-query,indent=0] +include::dotnet-sdk:hello-world:example$StartUsing.csx[tag=n1ql-query,indent=0] ---- {github} @@ -301,7 +301,7 @@ Querying with SDKs: * xref:c-sdk:howtos:n1ql-queries-with-sdk.adoc[C] | xref:dotnet-sdk:howtos:n1ql-queries-with-sdk.adoc[.NET] | xref:go-sdk:howtos:n1ql-queries-with-sdk.adoc[Go] -| xref:java-sdk:howtos:n1ql-queries-with-sdk.adoc[Java] +| xref:java-sdk:howtos:sqlpp-queries-with-sdk.adoc[Java] | xref:nodejs-sdk:howtos:n1ql-queries-with-sdk.adoc[Node.js] | xref:php-sdk:howtos:n1ql-queries-with-sdk.adoc[PHP] | xref:python-sdk:howtos:n1ql-queries-with-sdk.adoc[Python] From 5bcb6305849b129b44e6bc5b3dc938aaae0b3530 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Tue, 9 Sep 2025 11:13:32 +0100 Subject: [PATCH 33/80] [DOC-10551] Additional object parameters and new object_filter function (#376) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/objectfun.adoc | 354 ++++++++++++++++-- 1 file changed, 326 insertions(+), 28 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc b/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc index 417aa4568..8931e86cc 100644 --- a/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/objectfun.adoc @@ -283,6 +283,171 @@ LIMIT 1; ---- ==== + +[[fn-obj-filter,OBJECT_FILTER()]] +== OBJECT_FILTER(`expression` [, `options`]) + +[.status]#Couchbase Server 8.0# + +=== Description +This function extracts and returns nested fields from an input object that match a specified pattern, while retaining their original hierarchical path structure in the output. +This is particularly useful when working with complex objects, as it allows you to filter fields based on patterns using either regular expressions or exact matches. + +=== Arguments +expression:: An expression representing an object. + +options:: [Optional] A JSON object specifying options for the function. + +=== Options + +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **pattern** + +__optional__ + +| The pattern to match. +This can be a regular expression or a simple string, depending on the `regex` parameter. +| String + +| **regex** + +__optional__ +| If `TRUE`, the pattern is treated as a regular expression. + +If `FALSE`, the pattern is treated as a simple string. + +*Default:* `TRUE` +| Boolean + +| **arraysubscript** + +__optional__ +| Specifies whether array subscripts are included in field names before applying the filter. + +If `TRUE`, array subscripts are included. + +If `FALSE`, array subscripts are replaced by `*`. + +*Default:* `TRUE` + +| Boolean + +| **composites** + +__optional__ +| Specifies whether the pattern should match field names that contain values requiring further processing, such as nested objects or arrays. + +If `TRUE`, the pattern is matched against every level of nested fields. + +If `FALSE`, the pattern is matched only against the deepest level of nested fields. + +*Default:* `TRUE` +| Boolean + +| **patternspace** + +__optional__ +| A string literal with two possible values. + +`"field"`: The pattern is matched against individual field names. + +`"path"`: The pattern is matched against composite path names. + +*Default:* `"path"` +| String + +| **exact** + +__optional__ +| Specifies whether the provided pattern must be an exact match for the field or path (as determined by the `patternspace` parameter). + +This is a short-cut for the regular expression start (^) and end ($) anchors, and can be used even when `regex` is set to `false`. + +If `TRUE`, the pattern must be an exact match. + +If `FALSE`, the pattern does not need to be an exact match. + +*Default:* `FALSE` +| Boolean + +| **ignorecase** + +__optional__ +| If `TRUE`, the pattern matching is case-sensitive. + +If `FALSE`, the pattern matching ignores case. + +*Default:* `FALSE` +| Boolean +|=== + +=== Return Value +An object containing only the fields that match the specified pattern. +Non-matching fields are excluded from the output. + +=== Examples + +[[obj-filter-ex1,OBJECT_FILTER() Example 1]] +.Filtering by field name +==== +.Query +[source,sqlpp] +---- +SELECT OBJECT_FILTER(t, {"pattern":"Business service"}) +FROM `travel-sample`.`inventory`.`hotel` t +WHERE type = 'hotel' +LIMIT 2; +---- +.Results +[source,json] +---- +[ + { + "$1": { + "reviews": [ + { + "ratings": { + "Business service (e.g., internet access)": 4 + } + } + ] + } + }, + { + "$1": null + } +] +---- +==== + +[[obj-filter-ex2,OBJECT_FILTER() Example 2]] +.Filtering by full path +You can use <> to generate the full path to a field, and then use that path in the `pattern` parameter. +==== +.Query +[source,sqlpp] +---- +SELECT OBJECT_FILTER(t, { "pattern": "reviews[1].ratings.Service", "regex": false }) +FROM `travel-sample`.`inventory`.`hotel` t +WHERE type = 'hotel' +LIMIT 1; +---- +.Results +[source,json] +---- +[ + { + "$1": { + "reviews": [ + { + "ratings": { + "Service": 3 + } + } + ] + } + } +] +---- +==== + + [[fn-obj-inner-pairs,OBJECT_INNER_PAIRS()]] == OBJECT_INNER_PAIRS(`expression`) @@ -827,23 +992,81 @@ If FALSE, only the deepest possible nested fields are returned. *Default:* `FALSE` | Boolean +| **types** + +__optional__ +| Determines whether to return field types or values. + +If TRUE, the function returns the name and type of each field. + +If FALSE, the function returns the name and value of each field. + +*Default:* `FALSE` +| Boolean + | **pattern** + __optional__ -| A regular expression used to filter the returned paths. -The pattern is matched against the composite path names, not the individual field names. +| The pattern used to filter the returned paths. + +It can be a regular expression or a simple string, depending on the `regex` parameter. | String -| **types** + +| **regex** + __optional__ -| Determines whether to return field types or values. +| If `TRUE`, the pattern is treated as a regular expression. -If TRUE, the function returns the name and type of each field. +If `FALSE`, the pattern is treated as a simple string. -If FALSE, the function returns the name and value of each field. +*Default:* `TRUE` +| Boolean + +| **patternspace** + +__optional__ +| A string literal with two possible values. + +`"field"`: The pattern is matched against individual field names. + +`"path"`: The pattern is matched against composite path names. + +*Default:* `"path"` +| String + +| **exact** + +__optional__ +| Determines whether the provided pattern must be an exact match for the field or path (as determined by the `patternspace` parameter). + +This is a short-cut for the regular expression start (^) and end ($) anchors, and can be used even when `regex` is set to `false`. + +If `TRUE`, the pattern must be an exact match. + +If `FALSE`, the pattern does not need to be an exact match. *Default:* `FALSE` | Boolean + +| **ignorecase** + +__optional__ +| If `TRUE`, the pattern matching is case-sensitive. + +If `FALSE`, the pattern matching ignores case. + +*Default:* `FALSE` +| Boolean + +| **report** + +__optional__ + +| Controls the output of the `name` field, allowing selection between the full path or the final field name. + +Possible values are: + +`"field"`: Outputs only the final field name. + +`"path"`: Outputs the full path to the field. + +*Default:* `"path"` + +| String |=== === Return Value @@ -888,7 +1111,10 @@ WITH input AS ({ SELECT OBJECT_PAIRS_NESTED(input) AS nested_pairs, OBJECT_PAIRS_NESTED(input, {"composites": true}) AS nested_pairs_comp, OBJECT_PAIRS_NESTED(input, {"pattern": "name"}) AS nested_pairs_pattern, - OBJECT_PAIRS_NESTED(input, {"types": true}) AS nested_pairs_types; + OBJECT_PAIRS_NESTED(input, {"types": true}) AS nested_pairs_types, + OBJECT_PAIRS_NESTED(input, {"pattern": "number", "patternspace":"field"}) AS filtered_fields, + OBJECT_PAIRS_NESTED(input, {"pattern": "-name$", "patternspace":"field", "regex":true}) + AS filtered_fields_regex; ---- .Results @@ -938,6 +1164,18 @@ SELECT OBJECT_PAIRS_NESTED(input) AS nested_pairs, "name": "attribute.flight-number", "type": "number" } + ], + "filtered_fields": [ + { + "name": "attribute.flight-number", + "val": 737 + } + ], + "filtered_fields_regex": [ + { + "name": "attribute.flight-name", + "val": "AI444" + } ] } ] @@ -1065,31 +1303,86 @@ A field in this context may be any attribute or element, nested at any level wit object:: An expression representing an object. -options:: [Optional] An object containing the following possible parameters: +options:: [Optional] An object containing the following possible parameters. + +=== Options + +[options="header", cols="1a,3a,1a"] +|=== +| Name | Description | Schema + +| **composites** + +__optional__ +| If `TRUE`, every level of every nested field is displayed. + +If `FALSE`, only the deepest possible nested fields are returned. + +*Default:* `TRUE` +| Boolean + +| **arraysubscript** + +__optional__ +| If `TRUE`, array subscripts are returned. + +If `FALSE`, array subscripts are replaced by `*`. -composites;; A boolean. -If `true`, every level of every nested field is displayed; if `false`, only the deepest possible nested fields are returned. -Default `true`. +*Default:* `TRUE` +| Boolean + +| **unique** + +__optional__ +| If `TRUE`, duplicate field names are collapsed to single unique field name. -arraysubscript;; A boolean. -If `true`, array subscripts are returned; if `false`, array subscripts are replaced by `*`. -Default `true`. +If `FALSE`, all duplicate field names are returned. -unique;; A boolean. -If `true`, duplicate field names are collapsed to single unique field name; if `false`, all duplicate field names are returned. Typically used when arrays are expanded and array subscripts are not returned. -Default `true`. -pattern;; A regular expression used to filter the returned paths. -Used in conjunction with the following setting. +*Default:* `TRUE` +| Boolean -patternspace;; A string literal with two possible values. -Default `"path"`. -+ -[horizontal] -`"field"`::: The pattern is matched against individual field names. +| **pattern** + +__optional__ +| A regular expression used to filter the returned paths. +Used in conjunction with the `patternspace` setting. -`"path"`::: The pattern is matched against composite path names. +| String + +| **patternspace** + +__optional__ + +| A string literal with two possible values. + +`"field"`: The pattern is matched against individual field names. + +`"path"`: The pattern is matched against composite path names. + +*Default:* `"path"` + +| String + +| **exact** + +__optional__ +| Determines whether the provided pattern must be an exact match for the field or path (as determined by the `patternspace` parameter). + +This is a short-cut for the regular expression start (^) and end ($) anchors, and can be used even when `regex` is set to `false`. + +If `TRUE`, the pattern must be an exact match. + +If `FALSE`, the pattern does not need to be an exact match. + +*Default:* `FALSE` +| Boolean + +| **ignorecase** + +__optional__ +| If `TRUE`, the pattern matching is case-sensitive. + +If `FALSE`, the pattern matching ignores case. + +*Default:* `FALSE` +| Boolean + +|=== === Return Value @@ -1181,7 +1474,7 @@ SELECT [[obj-paths-ex3,OBJECT_PATHS() Example 3]] .Pattern matching and pattern space ==== -This example searches for strings beginning with "n" in the given object paths. +This example searches for strings beginning with "n" and also fields that exactly match "name". .Query [source,sqlpp] @@ -1195,7 +1488,9 @@ SELECT OBJECT_PATHS(input, {"pattern": "^n", "patternspace": "field"}) AS field_starts_with_n, OBJECT_PATHS(input, {"pattern": "^n", "patternspace": "path"}) - AS path_starts_with_n; + AS path_starts_with_n, + OBJECT_PATHS(input, {"pattern": "name", "patternspace": "field", "exact": true}) + AS exact_field_name; ---- .Results @@ -1210,7 +1505,10 @@ SELECT "field_starts_with_n": [ "attribute.name" ], - "path_starts_with_n": [] + "path_starts_with_n": [], + "exact_field_name": [ + "attribute.name" + ] } ] ---- From 42297b154c0435641dc426533283317f00e75474 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Tue, 9 Sep 2025 11:16:32 +0100 Subject: [PATCH 34/80] [DOC-10590] Add EXCLUDE clause to SELECT (#382) --------- Co-authored-by: rakhi-prathap --- .../exclude-clause.png | Bin 0 -> 5906 bytes .../n1ql-language-reference/exclude-term.png | Bin 0 -> 4448 bytes .../n1ql-language-reference/select-clause.png | Bin 5817 -> 7603 bytes .../select-syntax.adoc | 18 +++- .../n1ql-language-reference/selectclause.adoc | 90 ++++++++++++++++++ modules/n1ql/partials/grammar/dql.ebnf | 10 +- 6 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/exclude-clause.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/exclude-term.png diff --git a/modules/n1ql/assets/images/n1ql-language-reference/exclude-clause.png b/modules/n1ql/assets/images/n1ql-language-reference/exclude-clause.png new file mode 100644 index 0000000000000000000000000000000000000000..cb7a8b1012ce74fa69a1aa1acd1aa6d340cbe400 GIT binary patch literal 5906 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/exclude-term.png b/modules/n1ql/assets/images/n1ql-language-reference/exclude-term.png new file mode 100644 index 0000000000000000000000000000000000000000..526de6c4f4c1877db3fec75d395112d4a842fe49 GIT binary patch literal 4448 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 diff --git a/modules/n1ql/pages/n1ql-language-reference/select-syntax.adoc b/modules/n1ql/pages/n1ql-language-reference/select-syntax.adoc index d4e426eec..38e219f73 100644 --- a/modules/n1ql/pages/n1ql-language-reference/select-syntax.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/select-syntax.adoc @@ -5,6 +5,7 @@ :page-topic-type: reference :expression: xref:n1ql-language-reference/index.adoc#N1QL_Expressions +:string-expression: xref:n1ql-language-reference/literals.adoc#strings :hints: xref:n1ql-language-reference/optimizer-hints.adoc :conventions: xref:n1ql-language-reference/conventions.adoc :number: xref:n1ql-language-reference/literals.adoc#numbers @@ -81,7 +82,7 @@ image::n1ql-language-reference/alias.png["Syntax diagram", align=left] [subs="normal"] ---- -select-clause ::= 'SELECT' {hints}[hint-comment]? <> +select-clause ::= 'SELECT' {hints}[hint-comment]? <> <>? ---- image::n1ql-language-reference/select-clause.png["Syntax diagram", align=left] @@ -109,6 +110,21 @@ path ::= {identifier}[identifier] ( '[' {expression}[expr] ']' )* ( '.' {identif image::n1ql-language-reference/path.png["Syntax diagram", align=left] +[#exclude-clause,reftext="exclude-clause",subs="normal"] +---- +exclude-clause ::= 'EXCLUDE' <> ( ',' <> )* +---- + +image::n1ql-language-reference/exclude-clause.png["Syntax diagram", align=left] + +[#exclude-term,reftext="exclude-term",subs="normal"] +---- +exclude-term ::= {identifier}[identifier] | {string-expression}[string-expr] +---- +image::n1ql-language-reference/exclude-term.png["Syntax diagram", align=left] + +[#hints,reftext="hints",subs="normal"] + [[from-clause,from-clause]] == FROM Clause diff --git a/modules/n1ql/pages/n1ql-language-reference/selectclause.adoc b/modules/n1ql/pages/n1ql-language-reference/selectclause.adoc index bd3f6e033..4373038b6 100644 --- a/modules/n1ql/pages/n1ql-language-reference/selectclause.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/selectclause.adoc @@ -34,6 +34,7 @@ image::n1ql-language-reference/select-clause.png["Syntax diagram", align=left] [horizontal.compact] hint-comment:: <> icon:caret-down[] projection:: <> icon:caret-down[] +exclude-clause:: <> icon:caret-down[] [#hint-comment] === Optimizer Hints @@ -155,6 +156,49 @@ If you do not explicitly give a field an alias, it is given an _implicit alias_. An implicit or explicit alias is returned in the result set, unless you suppress it using the <>. +[#sec_ExcludeClause] +=== EXCLUDE Clause + +[.status]#Couchbase Server 8.0# + +[source,ebnf] +---- +include::partial$grammar/dql.ebnf[tag=exclude-clause] +---- +image::n1ql-language-reference/exclude-clause.png["Syntax diagram", align=left] + +The EXCLUDE clause removes specific fields from your query's result set. + +Instead of listing every field you want to include in the SELECT statement, use EXCLUDE to specify only the ones you want to omit. +This is particularly useful when you use the star expression (`{asterisk}`) to select all fields, but want to exclude a few. + +The clause consists of one or more <>, separated by commas. + +[[exclude-term]] +==== EXCLUDE Term +[source,ebnf] +---- +include::partial$grammar/dql.ebnf[tag=exclude-term] +---- +image::n1ql-language-reference/exclude-term.png["Syntax diagram", align=left] + +An EXCLUDE term is a field that you want to exclude from the final projection. +It must exactly match the field name or alias as it appears in the projection. +Refer to <>. + +An EXCLUDE term can be: + +* An identifier, such as `hotel.name`. +* A string expression with one or more fields separated by commas, such as `"hotel.name, address"`. + +[NOTE] +==== +* If the field has an alias, you must use the alias as the term. +* When your query includes only one FROM term, fields are automatically qualified with it. +You can use the field name without the full identifier. +For example, `name` instead of `hotel.name`. +==== + [#sec_BestPractices] == Best Practices @@ -632,6 +676,52 @@ FROM hotel LIMIT 5; <.> With a select expression, you may optionally include the keyspace name; in either case, the keyspace name is not added to the results. ==== +[[ex-exclude-clause]] +.SELECT with an EXCLUDE clause +==== +.Query +[source,sqlpp] +---- +SELECT * EXCLUDE reviews,h.public_likes,"geo,description" +FROM `travel-sample`.inventory.hotel h +ORDER BY meta().id LIMIT 1; +---- + +.Results +[source,json] +---- +[ + { + "h": { + "address": "Capstone Road, ME7 3JE", + "alias": null, + "checkin": null, + "checkout": null, + "city": "Medway", + "country": "United Kingdom", + "directions": null, + "email": null, + "fax": null, + "free_breakfast": true, + "free_internet": false, + "free_parking": true, + "id": 10025, + "name": "Medway Youth Hostel", + "pets_ok": true, + "phone": "+44 870 770 5964", + "price": null, + "state": null, + "title": "Gillingham (Kent)", + "tollfree": null, + "type": "hotel", + "url": "http://www.yha.org.uk", + "vacancy": true + } + } +] +---- +==== + [#sec_RelatedLinks] == Related Links diff --git a/modules/n1ql/partials/grammar/dql.ebnf b/modules/n1ql/partials/grammar/dql.ebnf index 08b80d85d..6d37e54a1 100644 --- a/modules/n1ql/partials/grammar/dql.ebnf +++ b/modules/n1ql/partials/grammar/dql.ebnf @@ -71,10 +71,11 @@ anchor-select ::= select /* tag::recursive-select-term[] */ recursive-select-term ::= select-term /* end::recursive-select-term[] */ + /* SELECT Clause */ /* tag::select-clause[] */ -select-clause ::= 'SELECT' hint-comment? projection +select-clause ::= 'SELECT' hint-comment? projection exclude-clause? /* end::select-clause[] */ hint-comment ::= [https://github.com/couchbaselabs/docs-devex/blob/capella/modules/n1ql/partials/grammar/hints.ebnf] @@ -92,6 +93,13 @@ result-expr ::= ( path '.' )? '*' | expr ( 'AS'? alias )? path ::= identifier ( '[' expr ']' )* ( '.' identifier ( '[' expr ']' )* )* /* end::path[] */ +/* tag::exclude-clause[] */ +exclude-clause ::= 'EXCLUDE' exclude-term ( ',' exclude-term )* +/* end::exclude-clause[] */ + +/* tag::exclude-term[] */ +exclude-term ::= identifier | string-expression +/* end::exclude-term[] */ /* FROM Clause */ From 4fc9fb9dc871eba3fa8f957f2d2bc44ad76aac74 Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Tue, 9 Sep 2025 11:26:16 +0100 Subject: [PATCH 35/80] [DOC-10552] Changes to array operators and functions (#371) --------- Co-authored-by: rakhi-prathap --- .../n1ql-language-reference/slice-expr.png | Bin 5818 -> 5860 bytes .../n1ql-language-reference/arrayfun.adoc | 115 ++++++++++++++++++ .../n1ql-language-reference/nestedops.adoc | 6 +- modules/n1ql/partials/grammar/n1ql.ebnf | 2 +- 4 files changed, 121 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/assets/images/n1ql-language-reference/slice-expr.png b/modules/n1ql/assets/images/n1ql-language-reference/slice-expr.png index a02b7242c4c327b2ccc32098bfe431de415c4f9a..ad0efc41c02ba368a236d15247782985e175b912 100644 GIT binary patch delta 5798 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 literal 5818 zcmZ`-1yoee+g=nEK|!QsiG{@<$RZ-FbV+xYE8V?xNOyyDg90KTNY~PhH&v~93uB<5a6d#BW005rKNQ>AMx~n)zEQC}506DRY zxQM#@>|WMmoy2acUf;$6ZwTHitEFHaT0BT{vQ$Kx+4tmhOI2DE+N31djR4=^-+paq z6XXC29e+n8u0m(`>;W6$daT;}nN?vZ!A@LeWqG3z3TeLJeU_ExmWDUasEPsTJUF%#pkX@9o?J9hABqSjD^0}Zxs*;`YW7!)*1b* zL($OfnKarKM+UnMVM7G5iPV^esfz}Q2N+Kb&gQbn9140mrHym$fyUMc5dJ=xHvqLkKbUnu&u>|C4j8hHKNtOHC~myx!=R{ho!1gW3>W-mXtU3 z2*ST_8dT%o`uTn)^`N1pp}LixPj-Rz+z-OV%?0Tn>N)L*!ef;fmzQzjeLq<4QkQW4 z&(sGZ6XlEfZ9bN}7$5cw+~4pTCGWi8^bdDfAM8B(gN-yl&w!;$`6K z2J(;1A?D*Bw~3y=luO!F`rk22ikkjii&ND)me5Lk2Pm`FQU8!uB8&cgrs%MrGsXOq zd|TTxbb`beUw6JGVnb);@>TPXF38&3u}F!>j^Bhck&4DT_c@P?CyATKYXJ zE@#|XFoA_fWoK5(t_Q`1UP<__@!-atdxpg9DlHy|CuysT2Y0P7@dNt3(F( z1r*-X$dKro2O&gT0kyX2%VwewE<526w?z-)+7gkCU4D09@awAq9G{uyGt%9?65?yS z*NT}9LCK4yFND8y4-U!4W~PVRmeBj==}Ya-J3W8!Aov9*_h&J2Ne_CG6KgW2iZh&)_}EyaL`yFPVv^`YzdO)!19HNkm!>PXz%dhoPYI+;6#^R(>P zDpX7gx$3Kb0~!9Oz+@#9Z}MrP%l0bK}rGR1O^X^+vmjj!hkzWoMdIM0~*7_E*D~y}&!gQuTqH z9Q1>B@qoQ!iN?wS57{Tmyi`U#_hG8lKo97UPVZWgbvI&TXxkXeBpg0`KXeCzh6`Cu z*Ba6I$q!~WK5(KqAf@RrQ^;gLUO?0ne}Rm_Z?149WAvjWg!e=w%?S4wn+x2y@WZ9M zLl(FlgcuWW<(?_Mhxx?w8|y30o3PGu*@t5BBuz;n0zNQw4H>U~Sd0HFa+%=$FAs{; z1$#i`w1I+`9qjalL>pevd(96A+nTx?%cD7?j?7yKQXUefV@Y7?ZlOi!&4mTv*PD@p zx7HW-4mLL6&RUlQP8F^kL3gJ9u<#(M9IineH}96PJ(xy{%F<6y?41T31k_AM!FN z#c`RBSZ5u!&uAS_N$yA6c7Z$0Gg+m}aaC%DVdpX%9oOpjptR9Z1M7*Ah7U5$a-5Yk zDADVVI;Ipq|9;AsOCga^zqC110$pTFX;ZV1)3bg71?`t9c5V{mxaZ_ecXmFGzl_8= zKLmqZ*TizEp(LvihhG;L^2^)U1)5oIDFP*m>iu(^rsiys0>bPUBr_yanm0*NI;CA} zme%%%zj&*U9VPZYT2V2R$|?YvLO)Gpl*Nda8O;AAX^bZb7uReq~($#91 zccP-bIY5;CC%cV31=i`9I{6yQq)2^^!vX8#X0jJtXviw%b#<7&b61~?+?Z@i=OTx3IxGEl3Fh0HSP*5=9qBd0cOe%SS#ryrXm$cWw ztkQKtPyZOT8WWKyl44Gv_DPH4@_hGBq1H5^wktJ@OICZ10@!UiRzM0P8UH$B|HjQkl zUGI-1hr77sa%bhRwe@I9tG?6Ah2dwBo)ODO?gdCavM)C?6!he7wpXSc4bE2nXTo~d zBiJmNrnG%WFUi8DZ}@WO-r(NQ-tZpMrR}86MMW>PgeY;1NesCn;A=jl4Nbz&fHl}8 z^R!e;r%`kWdZeL~lg!!RSpC(2uQ_O3)|U zzRfF@hr0|Q%&I(Rbm*t(ezgaB=C}eD$l&h!3qpwIUH35Tia;#Rh zzkoV0U(X6DP#-0&EL?ao=UzNXw%aZU>{@x7>!^dc*8<$%;o3LCw}D1}#WEXl?c%}O zsfnE=JL?&^mV|5Mg<;1Fp?l5j#mfFlpyX|QW{#6x z`hdQkU--Q$Y$bH`5ZhKtNwiLL;_7E{?Bw`&dDC7P1lkw!wrSDR7UJE@p2_KHsbzjW z=zJMN3K!EuJr1`t%0?lwvo@$(T{e&7KGi41`+F$5z7|b3nk!3?_~_&`ej_hca)Zgc zNkmdOX7RmyBvW_r70!G#o&tRzXu?H%?OW?AVdaCsUomY=5oR)|CxJ%8?@#fX`RIe<43uUl^66 zC_J#y&#hXkgC;TAh67E9v7;Qalj2wXmI0_o3hJy=pHj1IV=BB>Z+zL7o=k=r($j8! z6(=x5TeS)> zQZR~dx=zcp`Er45R3myvCO8mc04^FjG;rOcQ!(^W*lci@V)M3Q+hSJX^Q*~sknH%W z^HXniEp1}uv)Avc0IMwLd^ryzf8+!5v--HnCq!^9xV{xzAM?)B(;5Y$&>(BK5CdOn zqd&bSr@5gKv8B$kN*lbnPaajKi>xS{{CnslE%@3HcGaM%>Af5aZds4{>PIiditg2! zR_?+n8LftI1*?CIT1KNv%wki?ey7aJIrd+)-zhUj#<9bvjb&E(*uE<8KB%zGZFuI6 z%8#)N{?YY)X~G#OuKFL(AbQM<5YvK(^$EK%H_HxO`E-Bk(nG!>|3K}Df#lD~a{e!o zKp$Y4^Hq8B=BkK^RO7cF+@qYESp;vVGCS8(10wL|Hd*#BC?kc-_FP${%S0)*98$K%6DFt9?Oh?~1^Ev;mklT%;v8iu6Px$om1@W*)s`|jU;;}n@ zRM=d?>ph*ScDh3<9Rcw_e1)CwkxTmeO4&xp>u+sTGvutqN{9(8f_DzB$bUiWfaBR0 z^Q~BR=LhguJ!u4*&7!0sz?V2HC+OJU{jlKXUH&m3jn1oi6o@})7Mk@E^0MM%l_?v4 z68=B7TS=V|uHdZChFgxX_1c7cnh*v7s-j?8(C^VD7mc4DW3qwX?^2_#Nu8@ta+)VF z(rK?k$JGe(K&X*s3;iWpWe$wAENL1U$%lvh$g^brqIg3O9@Y+eNEyr6xSFhkl=c^} znV2P;^#t=yLc4W*?xZjFBwz8`oQ^-f6feM8_n(n%>i{~u0J;MCJ5i6zYZ^f3Ogw8f zepooh%GJkAf-9m9!q5Om#F(FigFQFY6k^pF@kDQ=`>Fy+Gy<2EO^~EN9y|8qifmFs z=p-5aDJFxK+xGhQWI06?)9CO7#qLp~=cu+XQN&+jA0l*Q9%@k46qmF7%XuX#09Fd7 z&(b~d)Wcv>zSAvh&Z^ld8A_Qcc~mpqrE(mbs{k4{%`kpG8FH;=((80=fs7EDvw4o2 z1O27$u20_{&b7}&Lm9m=>9PDM9T#ii(w|S1l zW!L7GeZgKX%Jz;->nnezeWmfCr{AZ-iKU*?rDtA(pZGABXv&r+sOua5=5#OU%HuM! zx>r$rSHt{5P^E8odP-kaAY7CVzFS>l!f2R^>|14U`$v5u zuhD8|`Qp`v|5KYl9Q)~C5LW|Ki*UU?YdVL86^**ny;pQJHQ!tiV#qm))Oj39HVTs> z#?T3N3yQtgV&=IO*1Gb*8;ClDY!S$--{k38Z!p|JGt(d^_>|wS@6EDJ23ILl4Ek*W zb~I6=L&VKviXfq&w3~jzkC(nT?@s)zB*mwPM-4Vk!iC{%aPHey3a+HeDRK9?*>Ci^ z{9X4CQ{>8Lrd}A&xf=))2od!s)^7p>cQSA!H1rNckDrR`Mo4X5!#e&rc61n*o9pv1 z;+_!qju$-XVHu=%8iVeGu_%_6qm8T_i?PCN9^}@Am)xLUxtQANese)=iWZ&F+}vFG z5o`HIo$m-b-}MDoedKuyP2?|aL4IO~X?RuTwo%_ad#+k+LPF?X>z6iAM#~8H&2YLY z$fIj@ajH!7#4ZesS&6Ddfd0C818&+;d@Ce!mvxv?Ep7An&QWcG_;62FL5)?)8= zyWv}6sOQd`?DM=1>)j*w{3k;z0!u5}-HkrF4VhtUiShz-SL2~Apo!LmjVgIpU**x+ zS!zc_gZ?uoUYwszx^k~Q&-9n26$Z$^EG%r_vT~A)S0U{;^AtHU=7xq5jfibQF1~8p z7-Bou&P2*qgR>qs18ZxT5hhwE^YGv|&k#GPp;R_hXUZ71I??E&Yp&HaSmKx|(JN?4 zn3l;Q@+<_%iSk`hO5!JtPN?A!W6+YKo;lG#^m~t>)6#(qEc|s{)dL$3uF(7}a!_23 zg3IMgZ%_sk_W|uS-?MP?>^C2puj#x#a=xj+@^AevFSh+zb5X$5rXl?976H1{qW_(} zwk2ofq#vA%mW-R1C8yP8*+H@1n@>16CXVVJ5q=5QQMuUkc+U;OHem2dQSwt>z35;J z_8mG8sg;x0%EVQM!DZ?+J{;%~BU(rH50e}exmA|?45&2Cccw&1$K5U?$gnLmPwT(g zVdq5G3k>E#>XEHM+9%JG!_HDcrsZi2Lj^DcxhMNAp5yO1_;i~Uw~33!wN~?2OU5H~ zgKNj*n`$%RQj~O0z`-KfI%^hH5Vs^2U`Nhb2OpJQ^X1=^dPOSx&3rBF)7A|I61UHnKsFEArws(f+FZ zvkSkdAAWRrVlSD=#xVoGamEX|Ao`)|1d{|$^=|?DUqCMMtSb-;BIrSYFnJnMw||TQ NG7^g7rJ@D_{{|>3UN!&# diff --git a/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc b/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc index 775589b7a..7cfac84e0 100644 --- a/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc @@ -1497,6 +1497,121 @@ SELECT array_star(children).age FROM contacts WHERE fname = "Dave" ---- ==== +=== Empty Array Subscripts + +[.status]#Couchbase Server 8.0# + +You can use an empty array subscript (`[ ]`) to return an array that includes only defined elements. + +The rules governing its use are as follows: + +[cols="1a,2a"] +|==== +| Expression | Description + +| `field[]` +|* If `field` is not an array, it returns `NULL`. +* If `field` is an array, it returns the array as is. + + +| `field[][]` +|* If `field` is not an array, it returns `NULL`. +* If `field` contains only unnamed arrays, it returns `field` as is. +Otherwise, it returns `NULL`. + +| `field[].field2` +|* If `field` is not an array, it returns `MISSING`. +* If `field` is an array, it extracts `field2` from each element in `field` and returns a new array with those values. +* If `field` contains unnamed arrays, they are flattened by one level. +Then from the resulting array, it extracts `field2` from each object where it is present. + +| `field[][].field2` +|* If `field` is not an array, it returns `MISSING`. +* If every element in `field` is not an unnamed array, it returns `MISSING`. +* If `field` contains unnamed arrays, they are flattened by one level. +Then from the resulting array, it extracts `field2` from each object where it is present. + + +| `field[].field2[].field3` +|* Returns an array of `field3` values by traversing two levels of arrays. +First it extracts `field2` from each element of `field`, then extracts `field3` from each element of the resulting `field2` array. +* If `field` and `field2` contain unnamed arrays, they are flattened by one level. +Then from the resulting `field2` array, it extracts `field3` from each object where it is present. + +|==== + +NOTE: If you use more that two empty array subscripts (for example, `field[][][]`), the function considers only the first two subscripts and ignores the rest. + +==== Example + +==== +Given the following sample document: + +[source,json] +---- +{ + "a": { + "airline": "AF", + "airlineid": "airline_003", + "destinationairport": "SFO", + "distance": 2481.617376098415, + "equipment": "320", + "id": 3, + "schedule": [ + { + "day": 0, + "flight": "AF198", + "utc": "10:13:00" + }, + { + "flight": "AF250", + "utc": "12:59:00" + }, + { + "day": 2, + "flight": "AF223", + "special_flights": [ + { + "a": "SA" + }, + { + "b": [ + [ + { + "c": "SC1" + }, + { + "c": "SC2" + } + ], + [ + { + "c": "SC3" + } + ] + ] + } + ], + "utc": "19:41:00" + } + ], + "sourceairport": "DFW" + } +} +---- + +Here's how different array subscripts evaluate: + +* `a.airline[]`: Returns `NULL` (not an array). +* `a.schedule[]`: Equivalent to `a.schedule`, returns the array. +* `a.schedule[].day`: Returns `[0, 2]`. This is in contrast to `a.schedule[*].day`, which returns `[0, null, 2]`. +* `a.schedule[].special_flights[].a`: Returns `["SA"]`. +* `a.schedule[][].utc`: Returns `MISSING`. +* `a.schedule[].special_flights[].b[][].c`: Returns `["SC1", "SC2", "SC3"]`. +* `a.schedule[].special_flights[].b[].c`: Also returns `["SC1", "SC2", "SC3"]`, as the unnamed arrays are flattened. + +==== + [[fn-array-sum,ARRAY_SUM()]] == ARRAY_SUM([.var]`expr`) diff --git a/modules/n1ql/pages/n1ql-language-reference/nestedops.adoc b/modules/n1ql/pages/n1ql-language-reference/nestedops.adoc index d9540795f..a07fdca28 100644 --- a/modules/n1ql/pages/n1ql-language-reference/nestedops.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/nestedops.adoc @@ -132,7 +132,7 @@ expr:: An expression resolving to an array. start-expr:: -A numeric expression specifying a start position in the array, counting from 0. +[Optional] A numeric expression specifying a start position in the array, counting from 0. Negative positions are counted backwards from the end of the array. end-expr:: @@ -144,6 +144,8 @@ Negative positions are counted backwards from the end of the array. A new subset of the source array, containing the elements from the start position to the end position minus 1. The element at the start position is included, while the element at the end position is not. +If the start position is omitted, the subset starts from the beginning of the source array. + If the end position is omitted, all elements from the start position to the end of the source array are included. === Example @@ -164,4 +166,6 @@ Given the following data: The expression `revisions[1:3]` evaluates to the array value `[2012, 2011]`. The expression `revisions[1:]` evaluates to the array value `[2012, 2011, 2010]`. + +The expression `revisions[:2]` evaluates to the array value `[2013, 2012]`. ==== diff --git a/modules/n1ql/partials/grammar/n1ql.ebnf b/modules/n1ql/partials/grammar/n1ql.ebnf index fab0a51c7..69da310ee 100644 --- a/modules/n1ql/partials/grammar/n1ql.ebnf +++ b/modules/n1ql/partials/grammar/n1ql.ebnf @@ -260,7 +260,7 @@ element-expr ::= expr '[' position ']' /* end::element-expr[] */ /* tag::slice-expr[] */ -slice-expr ::= expr '[' start-expr ':' end-expr? ']' +slice-expr ::= expr '[' start-expr? ':' end-expr? ']' /* end::slice-expr[] */ start-expr ::= expr From 42890f7dbc3b22c0092fb6dbe16a149f04ce1e64 Mon Sep 17 00:00:00 2001 From: Pallavi-Janardhan Date: Tue, 26 Aug 2025 18:35:07 +0530 Subject: [PATCH 36/80] DOC-13470: add example code snippet for on deploy (#401) * Doc_13470_Adding example code snippet for OnDeploy * DOC_13470_Adding more info from the SME Changed the info according to SME comments and created a hyperlink to another file. * Added an xref link to another topic in a diff file * Added an xref link to the function settings section in a diff file * Added an xref link to the function settings section in a diff file * DOC_13470 Adding info on OnDeploy Timeout as per the SME --- .../pages/eventing-Terminologies.adoc | 11 +++++-- .../pages/eventing-language-constructs.adoc | 32 +++++++++++++++++-- .../eventing/pages/eventing-lifecycle.adoc | 12 +++++-- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/modules/eventing/pages/eventing-Terminologies.adoc b/modules/eventing/pages/eventing-Terminologies.adoc index bad109365..cb21541c4 100644 --- a/modules/eventing/pages/eventing-Terminologies.adoc +++ b/modules/eventing/pages/eventing-Terminologies.adoc @@ -61,9 +61,9 @@ It is not possible to get the value of a document that has been deleted or expir [.status]#Couchbase Server 8.0# -The `OnDeploy` handler runs once when an Eventing function is deployed or resumed. +The `OnDeploy` handler runs once when an Eventing function is deployed or resumed, before any mutations are processed. -The entry point `OnDeploy(action)` receives an `action` parameter, like `deploy` or `resume`, indicating the reason for invocation. It also includes a `delay` value (in milliseconds), showing the time since the function was paused. For deployment operations, this value is `0` +The entry point `OnDeploy(action)` receives an `action` parameter, like `deploy` or `resume`, indicating the reason for invocation. It also includes a `delay` value (in milliseconds), showing the time since the function was paused. For deployment operations, this value is `0`. *Limitation*: Avoid long-running operations within the `OnDeploy` as they can delay function deployment. @@ -338,6 +338,13 @@ Versions 6.0.0 and 6.5.0 filter all binary documents out of the DCP mutation str The entry points into the handler processing for each mutation must run from start to finish before the specified timeout duration. The default number of seconds is `60`. +|OnDeploy Timeout +|The number of seconds to elapse before the OnDeploy entry point times out and terminates. + +The timeout is set to `60` seconds, by default. + +The OnDeploy Timeout defines the maximum duration allowed for an Eventing Function to complete its initialization during deployment or resumption. + |Time Context Max Size |The size limit of the context for any Timer created by the Eventing Function. diff --git a/modules/eventing/pages/eventing-language-constructs.adoc b/modules/eventing/pages/eventing-language-constructs.adoc index 4b491736c..37924ff1e 100644 --- a/modules/eventing/pages/eventing-language-constructs.adoc +++ b/modules/eventing/pages/eventing-language-constructs.adoc @@ -558,17 +558,18 @@ The Eventing Service calls the following JavaScript functions on events like mut * <> * <> +* <> * <> [#onupdate_handler] === OnUpdate Handler -The `OnUpdate` handler is called when you create or modify a document using an operation like insert or update. +The `OnUpdate` handler is called when you create or modify a document. The entry point `OnUpdate(doc, meta)` listens to mutations in the associated source bucket. The `OnUpdate` handler has the following limitations: -* If a document is modified several times in a short period of time, the handler calls might be combined into a single event due to deduplication. +* If a document is modified several times in a short period of time, the handler calls can merge into a single event due to deduplication. * You cannot distinguish between a Create and an Update operation. [source,javascript] @@ -618,6 +619,33 @@ function OnDelete(meta) { } ---- +[#ondeploy_handler] +=== OnDeploy Handler + +[.status]#Couchbase Server 8.0# + +The `OnDeploy` handler is invoked once when an Eventing function is deployed or resumed, before any mutations are processed. +The entry point `OnDeploy(action)` is used for one-time setup tasks like resource initialization, creation of timers, and so on. + +The `OnDeploy` handler has a limitation. Avoid any long-running operations within the `OnDeploy` as they can delay function deployment. + +The timeout for OnDeploy execution is configurable separately in the xref:eventing:eventing-Terminologies.adoc#function-settings[Eventing Function Settings]. + +---- +function OnDeploy(action) { + log("OnDeploy triggered. Reason:", action.reason, "Delay (ms):", action.delay); + + if (action.reason === "deploy") { + // Perform operations for fresh deployment (like timer creation, resource initialisation) + log("Deploy: perform first time setup for function"); + } + else if (action.reason === "resume") { + // Function was paused and resumed: refresh any cached information + log("Resume: perform operations before function resumption"); + } +} +---- + [#timer_callback_handler] === Timer Callback Handler diff --git a/modules/eventing/pages/eventing-lifecycle.adoc b/modules/eventing/pages/eventing-lifecycle.adoc index 3db4de8c5..97940ed8c 100644 --- a/modules/eventing/pages/eventing-lifecycle.adoc +++ b/modules/eventing/pages/eventing-lifecycle.adoc @@ -127,10 +127,14 @@ The minimum value is 1 (the default) and the recommended maximum is 64. If the semantics of a language construct change in any given release the “Language compatibility” setting will ensure an older Eventing Function will continue to see the runtime behavior that existed at the time it was authored, until such behavior is deprecated and removed. Note 6.0.0, 6.5.0, and 6.6.2 (the default) are the only currently defined versions. * *Script Timeout*: Script Timeout provides a timeout option to terminate a non-responsive Function. -The entry points into the Eventing Function, like OnUpdate and OnDelete, processing for each mutation must complete from start to finish prior to this specified timeout duration. The default is 60 seconds. In addition an Timer callback must also complete within this period. +The entry points into the Eventing Function, like OnUpdate and OnDelete, processing for each mutation must complete from start to finish prior to this specified timeout duration. +The default is 60 seconds. +In addition an Timer callback must also complete within this period. * *OnDeploy Timeout*: OnDeploy Timeout defines the maximum duration allowed for an Eventing Function to complete its initialization during deployment or resumption. -The OnDeploy entry point must complete execution, from start to end, within the specified timeout period. If the runtime exceeds the specified duration, the function is reverted to its previous state. By default, the timeout is set to 60 seconds. +The OnDeploy entry point must complete execution, from start to end, within the specified timeout period. +If the runtime exceeds the specified duration, the function is reverted to its previous state. +By default, the timeout is set to 60 seconds. * *Timer Context Max Size*: Timer Context Max Size limits the size of the context for any Timer created by the Function. Eventing Timers can store and access a context which can be any JSON document, the context is used to store state when the timer is created and retrieve state when the timer fires. By default the size is 1024 bytes, but this can be adjusted on a per Function basis. @@ -147,7 +151,9 @@ Currently Eventing Functions support the following binding types: * *Constant Bindings*: to pass global settings/constants into the function. -An Eventing Function can have no bindings, just one binding, or several bindings. For more information on Bindings, refer to xref:eventing-Terminologies.adoc#section_mzd_l1p_m2b[Terminologies - Bindings]. +An Eventing Function can have no bindings, just one binding, or several bindings. +For more information on Bindings, refer to xref:eventing-Terminologies.adoc#section_mzd_l1p_m2b[Terminologies - Bindings]. + |=== . In the *ADD FUNCTION* dialog, configure the following information: From c9eb6df12d000d48708a33d8d5dd76ff337ca76c Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Thu, 28 Aug 2025 16:14:06 +0530 Subject: [PATCH 37/80] [DOC-12664] Automatic Workload Repository (AWR) (#342) --- modules/n1ql/pages/n1ql-intro/sysinfo.adoc | 1 + modules/n1ql/pages/n1ql-manage/index.adoc | 2 + modules/n1ql/pages/n1ql-manage/query-awr.adoc | 478 ++++++++++++++++++ modules/n1ql/partials/nav.adoc | 1 + 4 files changed, 482 insertions(+) create mode 100644 modules/n1ql/pages/n1ql-manage/query-awr.adoc diff --git a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc index 4c4f4cba8..e15b22e0c 100644 --- a/modules/n1ql/pages/n1ql-intro/sysinfo.adoc +++ b/modules/n1ql/pages/n1ql-intro/sysinfo.adoc @@ -57,6 +57,7 @@ xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-active-req[system:active_re xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-prepared[system:prepareds] xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[system:completed_requests] xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-history[system:completed_requests_history] +xref:n1ql:n1ql-manage/query-awr.adoc[system:awr] a| [%hardbreaks] <> diff --git a/modules/n1ql/pages/n1ql-manage/index.adoc b/modules/n1ql/pages/n1ql-manage/index.adoc index 5b6a0ffa5..b6bbde96b 100644 --- a/modules/n1ql/pages/n1ql-manage/index.adoc +++ b/modules/n1ql/pages/n1ql-manage/index.adoc @@ -29,6 +29,7 @@ You can query the system namespace to get this information. You can monitor and manage queries using {sqlpp}. * xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc[] +* xref:n1ql:n1ql-manage/query-awr.adoc[] == Manage Primary and Secondary Indexes @@ -45,3 +46,4 @@ endif::flag-devex-rest-api[] request-level query parameters. * xref:n1ql:n1ql-manage/query-settings.adoc[] + diff --git a/modules/n1ql/pages/n1ql-manage/query-awr.adoc b/modules/n1ql/pages/n1ql-manage/query-awr.adoc new file mode 100644 index 000000000..19c8ed422 --- /dev/null +++ b/modules/n1ql/pages/n1ql-manage/query-awr.adoc @@ -0,0 +1,478 @@ += Automatic Workload Repository +:page-status: Couchbase Server 8.0 +:description: Monitor and optimize query performance and workload using Automatic Workload Repository (AWR). +:page-toclevels: 2 + +[abstract] +{description} + +== Overview + +Automatic Workload Repository (AWR) is a feature that captures and maintains performance statistics for queries executed on your Couchbase cluster. +It acts as a centralized repository for query performance data, enabling you to monitor and analyze query activity and workload over time. + +By providing a historical view of query behavior, AWR makes it easier to identify trends and performance bottlenecks. +For example, some queries may run efficiently with minimal overhead, while others may consume more resources or take longer to complete. +With AWR, you can understand these differences and optimize your queries accordingly. + +When enabled, AWR automatically gathers detailed metrics from the Query Service for every query that you run on your cluster. +This includes metrics such as execution time, CPU usage, memory consumption, number of executions, and more. +It then aggregates this data into <> and stores them in a <>. + +You can access the collected data by directly querying the <> or by using Couchbase's report generation tool to generate reports and compare query performance across different time periods. +For more information, see <>. + +== Use Cases + +Here are some scenarios where AWR can be effectively utilized to enhance query performance and workload: + +* **Troubleshooting Real-Time Issues**: +You can quickly identify slow running queries or instances of high resource usage. +You can extract the SQL ID of the problematic query from the AWR report and use it to trace the query in xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests]. + +* **Analyzing Performance**: +When rolling out changes, such as introducing new microservices, AWR lets you compare query performance before and after the update. +This helps you identify affected queries and optimize their performance accordingly. + +* **Analyzing Upgrade Impacts**: +You can assess query performance before and after a cluster upgrade to identify queries impacted by the new version. + +[#workload-repository] +== Workload Repository + +The workload repository is a centralized storage location where all snapshots are collected and maintained. +It is a user-defined location that can be a bucket or a collection, but not a scope. + +Before AWR can start collecting data, you must configure the repository location in the <> catalog. +Until this specified location is available, AWR remains in a quiescent (inactive) state. +Once the location becomes accessible, AWR transitions to an active state and begins collecting data. +If the location becomes unavailable at any point, AWR returns to the quiescent state and resumes activity only when the location is accessible again. + +For more information about setting up the repository location, see <>. + +[#snapshots] +== Snapshots + +AWR stores query performance data in the form of snapshots. +For each unique statement executed within a specified reporting interval, AWR generates a snapshot. +This snapshot contains aggregate metrics for all executions of that statement during the interval. +These metrics include execution time, CPU usage, memory consumption, and other performance indicators. + +Snapshots are stored as individual documents in the workload repository. +Each document is uniquely identified by its document key (ID), that includes the start time of the reporting interval, making it easier to filter and analyze data. + +=== Snapshot Retention Management + +To facilitate long-term analysis and performance comparisons across different periods, AWR retains snapshot documents in the repository. +By default, AWR does not automatically enforce retention policies on these documents. +Instead, you need to configure a Time-To-Live (TTL) or expiration for the AWR location. +The TTL specifies how long the documents remain in that location before the system automatically purges them. + +For example, setting a TTL of 180 days on a given bucket ensures that all snapshot documents older than 180 days within the bucket are automatically deleted. +This mechanism allows you to manage storage usage effectively while retaining relevant history of query performance data. +For more information about configuring the TTL, see xref:server:learn:data/expiration.adoc[Expiration]. + +[#enable-configure-awr] +== Enable and Configure AWR + +AWR is an opt-in feature that you must explicitly enable and configure. +Once enabled, AWR starts collecting data as soon as the repository location is set and is available. + +You can manage these settings through the <> catalog. + +[#system-awr] +=== system:awr + +This catalog determines how AWR functions including where it stores snapshots, how often it collects statistics, and which queries to include in the report. +You can adjust the AWR settings at any time to align with your monitoring needs. + +NOTE: Only admins or users with the `query_manage_system_catalog` role can modify settings in `system:awr`. +For more information, see xref:n1ql:n1ql-intro/sysinfo.adoc#authentication-and-client-privileges[Authentication and Client Privileges]. + +The catalog consists of the following attributes: + +[cols="1a,4a,1a"] +|=== +| Name | Description | Schema + +|**enabled** + +| Indicates whether AWR is enabled or disabled. + +*Default*: `FALSE` + +| Boolean + +| **location** + +| The target keyspace (repository) where the snapshots are stored. +This can only be a path to a bucket or collection; it cannot be a scope. +For more information about the repository, see <>. + +AWR checks the availability of the location only once per interval. + +*Example*: `"bucket1.scope1.collection1"` + +| String + +|**interval** + +|The duration of the reporting interval. +That is, the time between each snapshot collection. +If the interval is set to 10 minutes, AWR captures snapshots every 10 minutes. + +The interval must be at least 1 minute. + +*Default*: `"10m0s"` + +**Example**: `"1m30s"` + +|String (duration) + +|**threshold** + +|The minimum time a statement must take to complete for it be captured and included in the snapshot. + +The threshold must be at least 0 seconds. + +*Default*: `"0s"`, so that by default, all statements are captured by AWR regardless of their execution time. + +**Example**: `"1m30s"` +|String (duration) + +| **num_statements** + +| The maximum number of unique statements for which aggregate data is collected during each interval. + +Once the specified limit is reached during a reporting interval, AWR does not generate snapshots for any additional unique statements within that same interval. + +*Default*: `10000` + +*Max*: `100000` + +| Positive integer + +| **queue_len** + +| Length of the processing queue. +It is recommended not to change this value. + +The default value and maximum allowable value for `queue_len` are internally calculated based on system resources. + +| Positive integer +|=== + +=== Examples + +.Enable AWR and set the repository location +==== +The following query enables AWR and sets the repository location to `default.s1.awr`. +It also sets the reporting interval to 1 minute and threshold to 0 seconds. + +[source,sqlpp] +---- +UPDATE system:awr SET enabled = true, location = "default.s1.awr", +interval = "1m", threshold = "0s"; +---- +==== + +.Retrieve current AWR settings +==== +The following query retrieves the current AWR configuration settings. +[source,sqlpp] +---- +SELECT * FROM system:awr; +---- +==== + +[#monitor-awr] +== Monitor AWR + +The current status of AWR is recorded in the `query.log`. +You can view this information in the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#vitals[system:vitals] output by using the following query: + +[source,sqlpp] +---- +SELECT awr FROM system:vitals; +---- + +[#view-awr-data-and-reports] +== View AWR Data and Reports + +You can access the AWR data by: + +* <> +* <> + +[#report-generation-tool] +=== Report Generation Tool + +You can generate AWR reports using Couchbase's `cbqueryreportgen` tool. +It provides comprehensive and user-friendly reports by executing SQL++ queries against the collected AWR data. + +For optimal query performance with the this tool, it is recommended to create an index on the document key (`META().id`) in your configured AWR location. +If this index is not present, the tool will use sequential scans, which can impact performance. + +For example, if the snapshots are stored in the `default:bucket1.scope1.awr` keyspace, you can create the recommended index as follows: + +[source,sqlpp] +---- +CREATE INDEX idx_awr ON default:bucket1.scope1.awr(META().id); +---- + +This index enables the `cbqueryreportgen` tool to efficiently query and retrieve AWR data for generating reports. +//For more information about the tool and its usage, see cbqueryreportgen. +// TODO: Add link to the CLI Reference section. + +[#query-awr-data-directly] +=== Querying AWR Data Directly + +You can also query AWR data directly from the workload repository using SQL++ queries. +When doing so, it is important to understand the data format, which is optimized to minimize the storage size. + +To query AWR data, access the specific target keyspace where the snapshots are stored. +The document keys (IDs) of the snapshot documents include the timestamp of the reporting interval's start time. +This allows you to filter documents based on time ranges without requiring additional indexes, as sequential scans support range-based key patterns. +However, if needed, you can define and add indexes to further optimize your queries. + +Each document contains the following fields: + +[cols="1a,4a,1a"] +|=== +| Name | Description | Schema + +| **cnt** + +| The number of times the statement was executed. +| Number + +| **from** + +| The start time of the interval, represented as an Epoch timestamp in milliseconds. +| Number + +| **to** + +|The end time of the interval, represented as an Epoch timestamp in milliseconds. +| Number + +| **pln** + +|An array containing the encoded, compressed outlines of the execution plan for both the minimum and maximum execution times of the statement. + +This is just the outline of the plan listing operators and significant objects used. +For full execution details, configure the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-config[completed_requests] system keyspace to capture the executions of the statement. + +You can use xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] to decompress the execution plan strings, and then pass them to xref:n1ql:n1ql-language-reference/jsonfun.adoc[DECODE_JSON()] for formatting, if needed. + +| Array of strings + +| **qc** + +| The query context value. +| String + +| **sqlID** + +| The unique hash identifier of the statement. + +This can be used to aggregate information across different reporting periods for the same statement. +It is also included in the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests] entries (collected independently of AWR). +| String + +| **sts** + +| An ordered array of 51 entries representing the total, min, and max values of 17 statistics. +That is, each statistic is represented by three consecutive entries in the array: the total value, the minimum value, and the maximum value. +These values have fixed array positions and appear in the sequence specified in the <> array. + +For example, the second statistic in the list is the CPU time. Therefore, + +-- +* `sts[3]` represents the total CPU time. +* `sts[4]` represents minimum CPU time. +* `sts[5]` represents the maximum CPU time. +-- +|<> array + +|**txt** + +| The statement text, possibly in a compressed format. + +Typically, this field is accessed using the xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] function, and the function returns the raw text if it isn't compressed. + +| String + +|**ver** + +| The version of the data record. + +For this release, the value is always 1. + +| Number + +|=== + +[[Stats]] +==== Statistics +[cols="1a,4a,1a"] +|=== +| Name | Description | Schema + +| **total time** + +| The total time taken for the request, that is the time from when the request was received until the results were returned. + +It includes time spent in the queue and is analogous to `elapsedTime` in the xref:n1ql-rest-query:index.adoc#Metrics[Query REST API] response. + +| Number + +| **cpu time** + +| The amount of time the operators in the execution plan spent executing operator code. + +It is analogous to `cpuTime` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response when xref:n1ql-rest-query:index.adoc#Profile[profiling] is enabled. + +| Number + +| **memory usage (quota)** + + +|The amount of document memory used to execute the request. +A request will return its document memory usage only if `memory-quota` is set for the query, or if both `node-quota` and `node-quota-val-percent` are set. +For more information about these settings, see xref:n1ql:n1ql-manage/query-settings.adoc[]. + +It is analogous to `usedMemory` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. + +| Number + + +| **result count** + +| The total number of objects in the results. + +It is analogous to `resultCount` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. +| Number + + +| **result size** + +|The total number of bytes in the results. + +It is analogous to `resultSize` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. +| Number + + +| **error count** + +| The number of errors that occurred during the request. + +It is analogous to `errorCount` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. +| Number + + +| **run time** + +| The total amount of time taken to execute the query. It does not include time spent in the queue. +| Number + + +| **fetch time** + +| The total amount of time spent fetching data from the Data service. + +It includes the time spent executing `Fetch` operator code and waiting for data from the Data service. +| Number + + +| **primary scan time** + +| The total amount of time spent by primary scan operations. + +It includes the time spent executing the `PrimaryScan` operator code and waiting for data from the Index service. +| Number + + +| **sequential scan time** + +| The amount of time spent by sequential scan operations. + +It includes the time spent executing the `PrimaryScan` operator code and waiting for data from the Data service. +| Number + + +| **primary scan count** + +| The total number of index keys returned by primary index scans and processed by the Query engine. +| Number + + +| **sequential scan count** + +| The total number of document keys returned by sequential scans and processed by the Query engine. +| Number + + +| **index scan count** + +| The total number of items returned by index scans and processed by the Query engine. +| Number + + +| **fetch count** + +| The total number of documents fetched from the Data service and processed by the Query engine. +| Number + +| **order count** + +| The number of items that were sorted. +| Number + + +| **primary scan ops** + +| The number of primary scan operators in the execution plan. +| Number + + +| **sequential scan ops** + +| The number of sequential scan operators in the execution plan. +| Number + +|=== + +=== Example +==== +The following example fetches AWR data for a specific SQL ID, including the statement text, max execution plan, number of executions, total time, and max CPU usage. + +.Query +[source,sqlpp] +---- +SELECT + text, + max_plan, + the_count, + avg_total_time, + max_cpu +FROM + default.s1.awr +LET + text = uncompress(txt) +WHERE + sqlID = 'fcff011269f93c3b7903d746c2914dab' +GROUP BY + sqlID, text +LETTING + the_count = SUM(cnt), + max_plan = json_decode(uncompress(MAX(pln[1]))), + avg_total_time = duration_to_str(SUM(sts[0])/SUM(cnt)), + max_cpu = duration_to_str(MAX(sts[5])); +---- + +.Result +[source,json] +---- +[ + { + "text": "select awr from system:vitals;", + "max_plan": { + "#operator": "Sequence", + "~children": [ + { + "#operator": "PrimaryScan", + "index_id": "#primary", + "keyspace": "vitals" + }, + { + "#operator": "Fetch", + "keyspace": "vitals" + }, + { + "#operator": "InitialProject" + }, + { + "#operator": "Stream" + } + ] + }, + "the_count": 2, + "avg_total_time": "38.844257ms", + "max_cpu": "193.409µs" + } +] +---- +==== + +== Limitations + +When working with Couchbase transactions, AWR collects performance statistics for all individual statements, and you may notice that the COMMIT statement often shows the highest elapsed time. +However, from the AWR report alone, you will not be able to get insights into why the COMMIT statement took so long to execute. \ No newline at end of file diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index 5157a5c37..e022f9c0f 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -38,6 +38,7 @@ endif::flag-devex-javascript-udfs[] ** xref:n1ql:n1ql-manage/index.adoc[] *** xref:n1ql:n1ql-intro/sysinfo.adoc[] *** xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc[] + *** xref:n1ql:n1ql-manage/query-awr.adoc[] *** xref:clusters:index-service/manage-indexes.adoc[] *** xref:n1ql:n1ql-manage/query-settings.adoc[] ** xref:n1ql:n1ql-language-reference/index.adoc[] From fa83d18b95bc653987a87111a895c31919a7063f Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Thu, 28 Aug 2025 12:44:22 +0100 Subject: [PATCH 38/80] DOC-13306: Add documentation for indexer level scan timeout (#399) * Replace Defer Index Builds example with link * Replace Indexer Scan Timeout example with link --- .../n1ql-language-reference/createindex.adoc | 21 ++----------------- .../pages/n1ql-language-reference/insert.adoc | 19 ++++------------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index 1f2667117..c7f657419 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -429,25 +429,8 @@ In Couchbase Server 7.6.2 and later, you can change the default setting for the If you change the default setting for `defer_build` to `true`, index creation operates in deferred build mode by default. -To change the default setting for deferred builds, use the REST API to set the `indexer.settings.defer_build` property. -For example, - -[source,sh] ----- -curl http://$BASEURL:9102/settings -u $USER:$PASSWORD \ --d '{"indexer.settings.defer_build": true}' ----- - -Use the following command to retrieve the indexer settings: - -[source,sh] ----- -curl -X GET http://$BASEURL:9102/settings -u $USER:$PASSWORD ----- - -* `$BASEURL` is the base URL for the API call, for example: `localhost`. -* `$USER` is the username, for example: `Administrator`. -* `$PASSWORD` is the password. +To change the default setting for deferred builds, use the Index Settings REST API to set the `indexer.settings.defer_build` property. +For an example, see xref:index-rest-settings:index.adoc#ex-defer-build[Defer Index Builds by Default]. endif::flag-devex-rest-api[] == Examples diff --git a/modules/n1ql/pages/n1ql-language-reference/insert.adoc b/modules/n1ql/pages/n1ql-language-reference/insert.adoc index d1560b1dc..6d9d3b219 100644 --- a/modules/n1ql/pages/n1ql-language-reference/insert.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/insert.adoc @@ -379,22 +379,11 @@ The INSERT statement returns an error if the keyspace does not exist. If you are inserting multiple documents, the statement aborts at the first error encountered. * Timeouts can affect the completion of an INSERT statement, especially when performing bulk inserts. Ensure that the timeout is set to a reasonable value that allows the bulk insert operation to complete. +ifdef::flag-devex-rest-api[] + -To set the indexer timeout, use the REST API to set the `indexer.settings.scan_timeout` property. -For example, -+ -[source,sh] ----- -curl http://localhost:9102/settings -u Administrator:password \ --d '{"indexer.settings.scan_timeout": 1200}' ----- -+ -Use the following command to retrieve the indexer settings: -+ -[source,sh] ----- -curl -X GET http://localhost:9102/settings -u Administrator:password ----- +To set the indexer timeout, use the Index Settings REST API to set the `indexer.settings.scan_timeout` property. +For an example, see xref:index-rest-settings:index.adoc#ex-scan-timeout[Set the Indexer Scan Timeout]. +endif::flag-devex-rest-api[] * When inserting multiple documents, no cleanup or rollback is done for the already inserted documents if the INSERT operations hits an error. This means, when you are inserting 10 documents, if the INSERT operation fails when inserting the 6th document, the operator quits and exits. From bb5bdd96c165a2939b9c8e2dc6e3870051ad6238 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Mon, 1 Sep 2025 16:10:16 +0100 Subject: [PATCH 39/80] DOC-13111: cCURL add options cert, key, passphrase for client certificate (#411) * Preliminary fixes * Add new points for cacert * Add cert, key, and passphrase options --- .../pages/n1ql-language-reference/.curl.adoc | 161 +++++++++++------- 1 file changed, 102 insertions(+), 59 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/.curl.adoc b/modules/n1ql/pages/n1ql-language-reference/.curl.adoc index aa7ab4860..399fa35a1 100644 --- a/modules/n1ql/pages/n1ql-language-reference/.curl.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/.curl.adoc @@ -21,18 +21,18 @@ For example, you can use the CURL function with the INSERT-SELECT statement to i == Syntax -[subs=normal] -.... -CURL(__url__, [__options__]) -.... +[source,ebnf] +---- +curl-function ::= 'CURL' '(' url (',' options)? ')' +---- === Arguments -`url`:: A string representing the URL of the data source. +url:: A string representing the URL of the data source. The URL needs to point to a JSON endpoint and must be either `http://` or `https://` only. No other protocol is supported. -The redirection of URL is not allowed. -`options`:: An optional JSON object representing various supported options. +The redirection of URLs is not allowed. +options:: An optional JSON object representing various supported options. This includes options and parameters to be sent to the URL source endpoint. === Options @@ -42,38 +42,84 @@ This includes options and parameters to be sent to the URL source endpoint. |=== | Option | Description | Value -| `user` -| Server user name and password. -| USERNAME[:PASSWORD] +| *user* +| Server user name and password, in the form `USERNAME[:PASSWORD]` +| String -| `basic` +| *basic* | Use HTTP Basic Authentication. | Boolean -| `insecure` +| *insecure* | Allow connections to SSL sites without certificates (H). | Boolean -| `anyauth` +| *anyauth* a| CURL to figure out authentication method by itself, and use the most secure one. NOTE: This supports only basic authentication. | Boolean -| `cacert` +| *cacert* a| -Specify CA signed certificate file name. +The CA signed certificate file name. Certificates should be stored on the local machine, on each query node within a cluster. -* To store certificates, access [.path]_/Couchbase/var/lib/couchbase/n1qlcerts_. +* To store certificates, access [.path]`/Couchbase/var/lib/couchbase/n1qlcerts`. This is not visible to the user. * The file name cannot contain a path. -* If the certificate is not a match to the existing contents of [.path]_n1qlcerts_ directory, the function returns an error. +* If the certificate is not a match to the existing contents of [.path]`n1qlcerts` directory, the function returns an error. * All expired and invalid certificates return an error. -| FILENAME +* When you add a new node, the `cacert` file must be copied to the new node and must have read access. +* If this option is omitted, the `insecure` option must be true. For example, this is the certificate `.pem` file for AWS. +| String + +| *cert* +a| +The chain certificate file name. +Certificates should be stored on the local machine, on each query node within a cluster. + +* To store certificates, access [.path]`/Couchbase/var/lib/couchbase/n1qlcerts`. +This is not visible to the user. +* The file name cannot contain a path. +* If the certificate is not a match to the existing contents of [.path]`n1qlcerts` directory, the function returns an error. +* All expired and invalid certificates return an error. +* When you add a new node, the `cert` file must be copied to the new node and must have read access. +* If this option is omitted, the `insecure` option must be true. + +Example: `"chain.pem"` +| String + +| *key* +a| +The client key file name. +Key files should be stored on the local machine, on each query node within a cluster. + +If the key file is encrypted, it should use PKS8 v2, and you must supply the passphrase to decrypt it. + +* To store key files, access [.path]`/Couchbase/var/lib/couchbase/n1qlcerts`. +This is not visible to the user. +* The file name cannot contain a path. +* If the key file is not a match to the existing contents of [.path]`n1qlcerts` directory, the function returns an error. +* All expired and invalid certificates return an error. +* When you add a new node, the `key` file must be copied to the new node and must have read access. +* If this option is omitted, the `insecure` option must be true. + +Example: `"client.key"` +| String + +| *passphrase* +a| +The the passphrase to decrypt the key file. +Owing to its sensitive nature, you are recommended to use a named parameter for this option. + +The parameter name should start and end with an underscore `_` to mask the parameter value in request catalogs, cbq shell history, query logs, and so on. + +Example: `$_passphrase_` +| String |=== .Transfer-related Options @@ -81,78 +127,75 @@ For example, this is the certificate `.pem` file for AWS. |=== | Option | Description | Value -| `get` -| The Get request for CURL. -| BOOLEAN +| *get* +| If true, perform a GET request. -Example: `{"get": true}` +Example: `true` +| Boolean -| `request` +| *request* | Sets the request method. This only accepts GET or POST requests. This is case sensitive. -| String -Example: `{"request":"POST"}` +Example: `"POST"` +| String -| `connect-timeout` +| *connect-timeout* | The maximum time allowed for connection in seconds. -| Integer -Example: `{"connect-timeout":30}` +Example: `30` +| Integer -| `max-time` +| *max-time* | The maximum time allowed for the transfer in seconds. -| Integer -Example: `{"max-time":30}` +Example: `30` +| Integer -| `data` +| *data* | POST data to be sent to the HTTP/REST service. The string data should be formatted exactly same as HTTP POST data. -| String or [\...string, string….] -Example: `{"data":"address=Half+Moon+Bay"}` +Examples: `"address=Half+Moon+Bay"` -`{"data":"address=Half+Moon+Bay,california"}` +`"address=Half+Moon+Bay,california"` +| String or array of strings -| `header` +| *header* | Passes custom header line to the server. -| String or [\...string, string….] +To send the user-agent string to the server, add the value to this parameter. -Example: `{"header":"Content-Type: application/json"}` +Examples: `"Content-Type: application/json"` -`{"header":["Content-Type: application/json", "Content-Length: 115"]}` +`["Content-Type: application/json", "Content-Length: 115"]` -| `show-error` -| Displays error message. -| Boolean +`["user-agent: bsmith","Content-Type: application/json"]` +| String or array of strings -Example: `{"show-error": true}` +| *show-error* +| If true, display error message. -| `silent` -| The silent mode. +Example: `true` | Boolean -Example: `{"silent": false}` - -| `keepalive-time` -| The number of seconds to wait between the `keepalive` probes. -| Integer +| *silent* +| If true, use silent mode. -Example: `{"keepalive-time":20}` +Example: `false` +| Boolean -| `user-agent` -| The value for the user-agent to send it to the server. -| String +| *keepalive-time* +| The number of seconds to wait between the `keepalive` probes. -Example: `{"header":[ "user-agent: bsmith","Content-Type: application/json"]}` +Example: `20` +| Integer -| `data-urlencode` -| Encode the data and send it to the server. +| *data-urlencode* +| Like the `data` option, but URL-encodes the data. -This is a test \=> this%20is%20a%20test -| String or [\...string, string….] +For example, `this is a test` is encoded as `this%20is%20a%20test` +| String or array of strings |=== === Return Value From 59cb0970427712f334fcd361bb7ee509f81ad29c Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Tue, 2 Sep 2025 12:27:31 +0530 Subject: [PATCH 40/80] [DOC-11953] New options for INFER - 8.0 (#410) --- .../pages/n1ql-language-reference/infer.adoc | 763 ++++++++++++------ 1 file changed, 500 insertions(+), 263 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/infer.adoc b/modules/n1ql/pages/n1ql-language-reference/infer.adoc index 9d7e085d5..ce3e79471 100644 --- a/modules/n1ql/pages/n1ql-language-reference/infer.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/infer.adoc @@ -81,6 +81,10 @@ An object with one or more of the following properties to guide the INFER statem The default sample size is 1000 documents. If a keyspace contains fewer documents than the specified [.var]`sample_size`, then all the documents in the keyspace will be used. +[.var]`array_sample_size`:: Specifies the number of array elements to sample when inferring an array attribute. +If set to a non-negative value, the statement trims the array samples to this value when their length exceeds it. +The resulting array includes a `sampleSize` field indicating that this option was applied. + [.var]`num_sample_values`:: Specifies the number of sample values for each attributes to be returned. The sample values provide examples of the data format. The default value is 5. @@ -90,6 +94,31 @@ The `similarity_metric` is the degree of similarity that two schemas must have t You can specify a real number between 0 and 1 indicating the percentage match (of attributes) required to establish similarity between two documents. The default value is 0.6, which means two documents are considered similar if 60% of the top-level attributes are the same. +[.var]`max_nesting_depth`:: Specifies the maximum depth of nested fields to explore during schema inference. +If set to a non-negative value, the statement skips fields that are at a nesting depth greater than or equal to this value. +The resulting field includes a `nestingDepth` property indicating the depth of the field, with `0` indicating a top-level field. + +[[infer-flags]] +[.var]`flags`:: An array of strings representing flags that can control the behavior of the INFER statement. +You can specify one or more of the following flags: ++ +[cols="1,2", options="header"] +|=== +| Flag | Description + +| `allow_dups` +| Allows including duplicate documents in the infer analysis. + +When multiple retrieval methods (such as secondary index, primary index, sequential scan, random scan, or random entry provider) are used, this flag prevents deduplication and ensures all retrieved documents are included, even if they share the same key. + +| `include_xattrs` +| Includes schema information for the extended attributes (xattrs) of each document in the output. + +| `include_key` +| Includes schema information for the document keys in the output. +If specified, it adds a `~meta` attribute, which contains the `id` property representing the document keys. +|=== + [.var]`dictionary_threshold`:: Sometimes JSON documents follow the dictionary pattern, where a field has sub-fields that are key-value pairs, instead of general field-name and value pairs. For example, consider a sub-document called "ratings", where the name of each rating object is a user ID: + @@ -147,6 +176,19 @@ Details for Documents and Subdocuments:: [.out]`$schema`;; Specifies the version of the JSON Schema standard. [.out]`Flavor`;; Specifies the flavor of a document or sub-document. +Details for Document Keys:: +[.out]`~meta`;; Contains the `id` property that holds the document keys. ++ +By default, the INFER statement includes this attribute in the output. +However, you can control this behavior using the `flags` option in the WITH clause. ++ +-- +* If you do not use `flags`, INFER automatically includes the `~meta` attribute. +* If you add any value for `flags`, INFER will not return `~meta` unless you explicitly specify the `include_key` flag. +For more information about the available flags, see <>. +-- +NOTE: The `~meta` attribute is only available in Couchbase Server 8.0 and later. + == Examples [[ex-1]] @@ -158,7 +200,354 @@ include::ROOT:partial$query-context.adoc[tag=example] [source,sqlpp] ---- INFER route -WITH {"sample_size": 10000, "num_sample_values": 2, "similarity_metric": 0.1}; +WITH {"sample_size": 1000, "num_sample_values": 2, "similarity_metric": 0.1}; +---- + +.Results +[source,json] +---- +[ + [{ + "#docs": 1000, + "$schema": "http://json-schema.org/draft-06/schema", + "Flavor": "`stops` = 0, `type` = \"route\"", + "properties": { + "airline": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + "AS", + "DY" + ], + "type": "string" + }, + "airlineid": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + "airline_3737", + "airline_439" + ], + "type": "string" + }, + "destinationairport": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + "ANC", + "PDX" + ], + "type": "string" + }, + "distance": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + 527.1102210477263, + 787.4315848714039 + ], + "type": "number" + }, + "equipment": { + "#docs": [ + 1, + 999 + ], + "%docs": [ + 0.1, + 99.9 + ], + "nestingDepth": 0, + "samples": [ + [ + null + ], + [ + "DH4", + "SF3" + ] + ], + "type": [ + "null", + "string" + ] + }, + "id": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + 11629, + 12027 + ], + "type": "number" + }, + "schedule": { + "#docs": 1000, + "%docs": 100, + "items": { + "#docs": 21104, + "$schema": "http://json-schema.org/draft-06/schema", + "properties": { + "day": { + "nestingDepth": 2, + "type": "number" + }, + "flight": { + "nestingDepth": 2, + "type": "string" + }, + "utc": { + "nestingDepth": 2, + "type": "string" + } + }, + "type": "object" + }, + "maxItems": 31, + "minItems": 9, + "nestingDepth": 0, + "sampleSize": 0, + "samples": [ + [{ + "day": 0, + "flight": "AS801", + "utc": "02:11:00" + }, + { + "day": 0, + "flight": "AS337", + "utc": "22:04:00" + }, + { + "day": 0, + "flight": "AS194", + "utc": "00:57:00" + }, + { + "day": 1, + "flight": "AS415", + "utc": "13:27:00" + }, + { + "day": 1, + "flight": "AS036", + "utc": "08:47:00" + }, + { + "day": 1, + "flight": "AS787", + "utc": "06:06:00" + }, + { + "day": 2, + "flight": "AS054", + "utc": "09:31:00" + }, + { + "day": 2, + "flight": "AS629", + "utc": "11:16:00" + }, + { + "day": 3, + "flight": "AS662", + "utc": "05:27:00" + }, + { + "day": 3, + "flight": "AS025", + "utc": "15:24:00" + }, + { + "day": 4, + "flight": "AS671", + "utc": "09:52:00" + }, + { + "day": 4, + "flight": "AS391", + "utc": "18:28:00" + }, + { + "day": 5, + "flight": "AS624", + "utc": "21:10:00" + }, + { + "day": 5, + "flight": "AS162", + "utc": "14:11:00" + }, + { + "day": 6, + "flight": "AS547", + "utc": "16:24:00" + }, + { + "day": 6, + "flight": "AS154", + "utc": "05:07:00" + } + ], + [{ + "day": 0, + "flight": "AS844", + "utc": "23:22:00" + }, + { + "day": 0, + "flight": "AS611", + "utc": "22:13:00" + }, + { + "day": 0, + "flight": "AS181", + "utc": "16:33:00" + }, + { + "day": 1, + "flight": "AS944", + "utc": "16:11:00" + }, + { + "day": 2, + "flight": "AS855", + "utc": "01:18:00" + }, + { + "day": 3, + "flight": "AS763", + "utc": "22:32:00" + }, + { + "day": 3, + "flight": "AS463", + "utc": "21:54:00" + }, + { + "day": 3, + "flight": "AS010", + "utc": "09:15:00" + }, + { + "day": 3, + "flight": "AS186", + "utc": "06:48:00" + }, + { + "day": 4, + "flight": "AS652", + "utc": "18:43:00" + }, + { + "day": 5, + "flight": "AS204", + "utc": "15:30:00" + }, + { + "day": 5, + "flight": "AS450", + "utc": "09:03:00" + }, + { + "day": 6, + "flight": "AS135", + "utc": "04:46:00" + }, + { + "day": 6, + "flight": "AS673", + "utc": "23:17:00" + }, + { + "day": 6, + "flight": "AS436", + "utc": "02:48:00" + }, + { + "day": 6, + "flight": "AS174", + "utc": "03:47:00" + } + ] + ], + "type": "array" + }, + "sourceairport": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + "DLG", + "STS" + ], + "type": "string" + }, + "stops": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + 0 + ], + "type": "number" + }, + "type": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "samples": [ + "route" + ], + "type": "string" + }, + "~meta": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 0, + "properties": { + "id": { + "#docs": 1000, + "%docs": 100, + "nestingDepth": 1, + "samples": [ + "route_11629", + "route_12027" + ], + "type": "string" + } + }, + "samples": [{ + "id": "route_11629" + }, + { + "id": "route_12027" + } + ], + "type": "object" + } + }, + "type": "object" + }] +] +---- +==== + +[[ex-2]] +.Infer metadata for a keyspace containing multiple document flavors +==== + +include::ROOT:partial$query-context.adoc[tag=unset] + +[source,sqlpp] +---- +INFER `beer-sample` +WITH {"sample_size": 1500, "num_sample_values": 5, "similarity_metric": 0.0}; ---- .Results @@ -167,138 +556,89 @@ WITH {"sample_size": 10000, "num_sample_values": 2, "similarity_metric": 0.1}; [ [ { - "#docs": 10000, + "#docs": 1500, "$schema": "http://json-schema.org/draft-06/schema", - "Flavor": "`type` = \"route\"", + "Flavor": "", "properties": { - "airline": { - "#docs": 10000, - "%docs": 100, - "samples": [ - "DL", - "WS" - ], - "type": "string" + "abv": { + "#docs": 1209, + "%docs": 80.6, + "samples": [0, 4, ...], + "type": "number" }, - "airlineid": { - "#docs": 10000, - "%docs": 100, - "samples": [ - "airline_2009", - "airline_5416" - ], - "type": "string" + "address": { + "#docs": 291, + "%docs": 19.4, + "samples": [["1201 First Avenue South"], ...], + "type": "array" }, - "destinationairport": { - "#docs": 10000, - "%docs": 100, - "samples": [ - "DFW", - "JFK" - ], + "brewery_id": { + "#docs": 1209, + "%docs": 80.6, + "samples": ["boston_beer_company", ...], "type": "string" }, - "distance": { - "#docs": 10000, - "%docs": 100, - "samples": [ - 682.2052742100271, - 2819.371084516147 - ], - "type": "number" - }, - "equipment": { - "#docs": [ - 9, - 9991 - ], - "%docs": [ - 0.09, - 99.91 - ], - "samples": [ - [ - null - ], - [ - "738", - "ERJ" - ] - ], - "type": [ - "null", - "string" - ] - }, - "id": { - "#docs": 10000, - "%docs": 100, - "samples": [ - 20436, - 64755 - ], - "type": "number" + "category": { + "#docs": 914, + "%docs": 60.93, + "samples": ["British Ale", ...], + "type": "string" }, - "schedule": { - "#docs": 10000, - "%docs": 100, - "items": { - "#docs": 210598, - "$schema": "http://json-schema.org/draft-06/schema", - "properties": { - "day": { - "type": "number" - }, - "flight": { - "type": "string" - }, - "utc": { - "type": "string" - } + "geo": { + "#docs": 261, + "%docs": 17.4, + "properties": { + "accuracy": { + "#docs": 261, + "%docs": 100, + "samples": ["APPROXIMATE", ...], + "type": "string" + }, + "lat": { + "#docs": 261, + "%docs": 100, + "samples": [8.4841, ...], + "type": "number" }, - "type": "object" + "lon": { + "#docs": 261, + "%docs": 100, + "samples": [-122.445, ...], + "type": "number" + } }, - "maxItems": 34, - "minItems": 9, - "samples": [ - [ - { - "day": 0, - "flight": "DL070", - "utc": "07:46:00" - }, - ... - ], - ... - ], - "type": "array" + "type": "object" }, - "sourceairport": { - "#docs": 10000, + "name": { + "#docs": 1500, "%docs": 100, - "samples": [ - "CLE", - "YVR" - ], + "samples": ["Eldridge, Pope and Co.", ...], "type": "string" }, - "stops": { - "#docs": 10000, - "%docs": 100, - "samples": [ - 0, - 1 - ], - "type": "number" + "style": { + "#docs": 914, + "%docs": 60.93, + "samples": ["American-Style Amber/Red Ale", ...], + "type": "string" }, "type": { - "#docs": 10000, + "#docs": 1500, "%docs": 100, - "samples": [ - "route" - ], + "samples": ["beer", "brewery"], "type": "string" - } + }, + "~meta": { + "#docs": 1500, + "%docs": 100, + "properties": { + "id": { + "samples": ["eldridge_pope_and_co", ...], + "type": "string" + } + }, + "type": "object" + }, + ... }, "type": "object" } @@ -307,162 +647,59 @@ WITH {"sample_size": 10000, "num_sample_values": 2, "similarity_metric": 0.1}; ---- ==== -[[ex-2]] -.Infer metadata for a keyspace containing multiple document flavors +[[ex-3]] +.Infer metadata for a keyspace using flags ==== - include::ROOT:partial$query-context.adoc[tag=unset] - [source,sqlpp] ---- INFER `beer-sample` -WITH {"sample_size": 10000, "num_sample_values": 5, "similarity_metric": 0.0}; +WITH {"sample_size": 1500, "num_sample_values": 10, "similarity_metric": 0.0, + "flags": ["allow_dups", "include_xattrs"]}; ---- - .Results [source,json] ---- [ - [ - { - "#docs": 823, - "$schema": "http://json-schema.org/draft-06/schema", - "Flavor": "type = \"beer\"", - "properties": { - "abv": { - "#docs": 823, - "%docs": 100, - "samples": [ - 0, - 9, - 9.5, - 8, - 7.7 - ], - "type": "number" - }, - "brewery_id": { - "#docs": 823, - "%docs": 100, - "samples": [ - "san_diego_brewing", - "drake_s_brewing", - "brouwerij_de_achelse_kluis", - "niagara_falls_brewing", - "brasserie_des_cimes" - ], - "type": "string" - }, - "category": { - "#docs": 612, - "%docs": 74.36, - "samples": [ - "North American Ale", - "British Ale", - "German Lager", - "Belgian and French Ale", - "Irish Ale" - ], - "type": "string" - }, - "description": { - "#docs": 823, - "%docs": 100, - "samples": [ - "Robust, Dark and Smooth, ho...", - "\"Pride of Milford\" is a very s...", - "Mogul is a complex blend of 5 ...", - "Just like our Porter but multi...", - "" - ], - "type": "string" - }, - "ibu": { - "#docs": 823, - "%docs": 100, - "samples": [ - 0, - 55, - 35, - 20 - ], - "type": "number" - }, - "name": { - "#docs": 823, - "%docs": 100, - "samples": [ - "Old 395 Barleywine", - "Jolly Roger", - "Trappist Extra", - "Maple Wheat", - "Yeti" - ], - "type": "string" - }, - "srm": { - "#docs": 823, - "%docs": 100, - "samples": [ - 0, - 6, - 45, - 30 - ], - "type": "number" - }, - "style": { - "#docs": 612, - "%docs": 74.36, - "samples": [ - "American-Style Pale Ale", - "Classic English-Style Pale Ale", - "American-Style India Pale Ale", - "German-Style Pilsener", - "Other Belgian-Style Ales" - ], - "type": "string" - }, - "type": { - "#docs": 823, - "%docs": 100, - "samples": [ - "beer" - ], - "type": "string" - }, - "upc": { - "#docs": 823, - "%docs": 100, - "samples": [ - 0, - 2147483647 - ], - "type": "number" - }, - "updated": { - "#docs": 823, - "%docs": 100, - "samples": [ - "2010-07-22 20:00:20", - "2010-12-13 19:33:36", - "2011-05-17 03:27:08", - "2011-04-17 12:25:31", - "2011-04-17 12:33:50" - ], - "type": "string" - } - } - }, - { - "#docs": 177, - "$schema": "http://json-schema.org/draft-06/schema", - "Flavor": "type = \"brewery\"", - "properties": { - ... - } - } - ] + [ + { + "#docs": 1500, + "$schema": "http://json-schema.org/draft-06/schema", + "properties": { + "abv": { + "#docs": 1199, + "%docs": 79.93, + "samples": [0, 3.5, 5, 5.3, 5.5, ...], + "type": "number" + }, + "brewery_id": { + "#docs": 1199, + "%docs": 79.93, + "samples": ["anchor_brewing", "brasserie_duyck", ...], + "type": "string" + }, + "name": { + "#docs": 1500, + "%docs": 100, + "samples": ["All Saints Belgian Golden Ale", "Cornhusker Lager", ...], + "type": "string" + }, + "type": { + "#docs": 1500, + "%docs": 100, + "samples": ["beer", "brewery"], + "type": "string" + }, + "xattrs": { + "#docs": 1500, + "%docs": 100, + "samples": [null, null, ...], + "type": "missing" + } + }, + "type": "object" + } + ] ] ---- -==== +==== \ No newline at end of file From 12d6fa2a96652f8d020e06133662042f748e6598 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Mon, 8 Sep 2025 14:30:26 +0530 Subject: [PATCH 41/80] [DOC-13464] Updates to the USING AI statement (#412) --- .../images/n1ql-language-reference/advise.png | Bin 9836 -> 11286 bytes .../n1ql-language-reference/using-ai.png | Bin 8979 -> 11605 bytes .../pages/n1ql-language-reference/advise.adoc | 6 +- .../n1ql-language-reference/using-ai.adoc | 393 +++++++++++++++++- modules/n1ql/partials/grammar/utility.ebnf | 4 +- 5 files changed, 379 insertions(+), 24 deletions(-) diff --git a/modules/n1ql/assets/images/n1ql-language-reference/advise.png b/modules/n1ql/assets/images/n1ql-language-reference/advise.png index eed8b247c6466954010fffc65c1180ecf13eb634..8b4972a144b226723ad63cc59190e52fc94007e8 100644 GIT binary patch literal 11286 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 literal 9836 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 literal 8979 zcmZXa1yCG8*RDxIf;(i9;7)LY%LaD{4#9%Ey9Zw&cyMOQ8cVFa^@B6Fn zf9uxtNKf}ncXhSA=jjvnO+gY3nGhKc4h~IPN=z9J?k(->vpC|1*K6#hM8WHg%t%UE z9uCfv1`h6L5FFgY>#Lu8aBwcHaBv4d;NbX@;ot!F=`BhEuLNfEe;@lX4&kq?Hll45W#|BmeTqJPOq_EK6-aB%2-|IRlFpV5h4i-VIE6IOL! zJkCJS!5ds0$Wqyp-&a><{Hcqnq;y1GokYYbk;j%;T)iy;zK&qih@V$xd8LQGo0ihc8$clyzX98AOt0M@J89!+y*%PSJ$ef-jQJW85T#9c zF$->u%YlLw;1)NaZTd@Z5KT2w3g2Y)eq3Yw&oRpbW1>Ba{nLSi46#StTj~@afNH-2#wUhX6C(oHbig5H;mH>1^Ud)tA3Mho8k& zt!Och=)?s;mE*5KMx4wXOOYe;Iw5sv= zwFUEe7)bd;Trgs;VTp}@C5_@Ixe&5aYNAGBY?pLJ#Y}_Yw8hFg3XXO+@Ux)ytpI+t zr;^t%B1;q-Ci>-U%Xh>DJeEl~VBnm9GY05Z^lL~zNQ)r49Pw=PhEK2MHG zZK^7E|Ia0>6>LC?4)e-#B0TcHHr>d-I$NL1Gb641#6O)FBux)LlH46hR0=Y0NE2}IPrL^Wu#2RfoR;cl3@l}I(TbI<2L>u z*tTd^b5sS<)H&;sH_fRqC8)?rt;&H zY(6iFYRd-P?z)HHd)8l7?~HQAREeS>%Xcr^*>;b}0XiA2itfRIF~-*O1n|*B)l%{r zRo8sxrdB~1A=9Bo5vjpD+kqZ>QqrR#7HBrsPvg?H%oGg7S>F5cc3w6%^fwg_^xt)N z7L`hZO7i0b&XdSMHPnKXIFeCb23r&3+YQkfFy`)CTg2J&)W;E<9me@^w+9}>D-g3P zT|yAQZ_d!zkVq?6f{~n<#dW~LZ7$oWGFi_g32d8vjFE0KcQy%7*4+=BGwQny%4Y;$ zOn_9Yby8pw5iw_~S0rvo4q;m6-{#=1tq#L%Dpow^H|v~Fe*WPBpa?!`9uOzN-^r(DS*24Pho zcKj5p7xW`4=`xaXNf4@tInVR0OCN2%Dxrh2a{IbXZ?vj(G#OH$l4t) zxJ!MsrrWZIhc3Q*ho)*>84+(eI$Fqsr2V+99&74|ubkBsUv?>Wy4Ik*M_M_bRq6jTy0u&!472LyoQql-( z*Z6X*c6X>pWbLJ>8cuj3hW6a|%txUc%cw>Y&cR|7-SI^ZJf0&&3T55PH-lP}CSUG* zh4%KWi|(JGo0&Ym4=wW@KCJ^)tQ_54&&ODJ89zIt^m>0I`EV{hHyjEq>!kG-W>VYM zv>oxTGdFN>O^H^X*qqstN`f02PXw^_vS}5Kpa+K0&ZYocoa;z3V5VQiy|BI_0_iWu zQ8zgj>U*q?J;_X4ls;3&7HLsFuDbAk;+ZXEoXrI)EQqnne(Z<>{@ zE7Zu-TnwS{wqXsjK@W>82u6}XJ%Cq9Y(QAz5~M^~tK<(NkOr3{X$^0>j~Wj2H0=f3bfR555@@9>qD}~ za($A`p(LsAKcBSKJ(nsn<{Gm1xvu%FDpShwWDtX^JPrP66oT7X2bl%%C@f~)&bT5d zhEj5HgjUSLpL2!9gK1eUc04t;rn`Q2DBM}}Vx{vO=UGg<2M!bMk)OJDb?1?2Hs7#R zkN3#U6zDcK5FE^~g;qp;^tMH){_s~j-c`c$qk8QJh6vqkUjAFX9$0(_0L{x#nPKWL zN3gm1Y#sVQ^ojq@&Gp%N(V@ewuX)%-Pk(H43YG-=evpvhVoh5{-%ZADe+!7VTC>Fw zBk{!I`QUWBWrb;1ejdMrEz5rr$~n;UBg6|u(^lMB zn!C~6#l$8o$99mzpP#Png2_=i8}=ANH`eTLHf*Y+c1@=H)QVM>a7jDXaIoaE%U0~= z;>XMG)7G61$qVHVLZ9203`WYbf*CJ3`2 zgbakPzJsd;@$V|uP_dVqT`b6jB+>VE%4{WS zTZFu3-KR&Az$$Zh&-dm#y8L|Ei7w9}(QA{JVWgjdrb##Q3+Er$l_o@~i#7Awy$;P% zkKJB82%i0+_QsuBx1(&2r?8T}>28Hh;k&`!)B20)RxhF}XB7(8J)~CYX_3Q3v;|+% z8k6!Whov=q?$WdYm8ppVY(Li60VK~WTn&Mf-or-*sMdzPzuQ%Q5*^0L@bJ(#k0~Zb zxe2hEi4)H39qCG|6r$vKBC(lRN0HC8;+UJgb$H;Qz&dy&76liIws226w5_ZZvK(>A zw`{!KB|dh8Rx3{6W*@|($E*jtwv1>B!o513L9e$;*|~J(ou9#3;oByNR+XR--+P}} zk8{-UcnA=ruB29&u7bCf@%J5}m^Cw_Og^p~+a#v)7#A*3PTBQ(K9-ZObMQ6O_{4vU z3lLb4cHvNmuUPeo0kQbCg%bZ+>YROc|9WIb%H2O_^;Bi*^$d6>Br28bfA`&kjPcg< zj3+k#H{&Gd@8tBS5$D^j{VAyKH%o_}&ZK%CgYE46QJ}D@-bFYHrKq6sXH^o_7X;{? z@#+WHmH3_tX<}#xMCtczaMs5ZmA^yUQY_jSMzE8v;m=N|RG2EacXH)aGgMQPe zRA|x=VUnBPPj7c7Vip8KlF$KMI;;!a<+MT44oL3!{zb9pd(&RN9ouL&WkFAps0W~N zpO1(vxBwRw+8dk|e!IA-Iu;$4s?-kH7Nx|T- zeoIsD6J+?%G$yN0faePvFG_TeGBlOHi<(M6+e^?NlckBc1T5kJX?&QR(5#LKIC&EV0I@$La#;bg&_Fc8lD`5b~~!}Ig!zg~}2 zcpBcSZyJ{=ducgeSL}#89OmyM;fKC-R}Gd_t)>E&$V9=o=+>ho)|-=MtS3VW$tND9 zZ>F6w?Qq6j%~P4WJzYuae(ZKLyPELPj&`?yc!RirKsN#l0BKzqvF zP{KDa87>=OBvE5PxB$AKt_`$#{cSKxT7b2(W`_{0(?+v(!{};nQO4;Lq(8G_&yyZe zl!m>m+;aUO1@C>uT8-_1)k17hZ|h2j?qj#?p*t#Obft%hM{Q@>QGlIsGot145Mj~t zLuuFbpG1YOT*&kL(=`8FnDx$XT9w(7S@ZPvtD#}L#eG!4907;dEEI# z7!OYiFZj|;BHRA1*Cw;B5q;)<53-5Q)Cl|O);fos`LW}1pxr$|1Wg9}av9}0nR6bVoVH$}PpABs zJ^R}hh-^yaR41hhN{Q>@tjg^o@Ga5njSRA#@r=be4=PFDJ)gb7#%xJ5;>q?suipXy zhAwzJb#_O10$tZbM90wc!7gbTcO)NdRdB9TgKY~}bDzRn`HuFlLv;deOl zt7DN+Cl0CK8m8(Ed&UoezqV9v{HD}PA(Tses zij)`J6ZD!KiQMjr!a@czoeMZ!i9hv!#8ES^86 znpu3B^}KLiQNcN8l7GAhcO5uBHlETVp2~UP;3GbZ6%-sFi2+uGTxs`3NN_i7&XVco zgJX3+4LS%b6GZL*wRm?1t>c`pf2m2f+y9ZLH7Jfk+RSD?&5qBW({q~Z!ZUA#EweuAhc#AoAFL9M!FYcFr=X!J5 zxg5nt>ci3!`?)N-rtUq5+Z$p~Hl~iqXcR_7uSW=em zgiEuKzBZNy=$}*9S6h`?>>zqg0o&vL>Qdei7eH##->v}kg~i^jbUlyHw{4<+TG>G| zaJ%T*82OeFF^$qZy5nl@zpaHl<~JEnG3?TtUn9mPb zg;V6oZb1CG{cT{6`w>F)8|dL3*ESMH%yw=lkVRa-(NOY?4~m?%MN z*#SC0{d4FI>Z4YlOG+HRKDwA?=Ve}<=&#~8{5(pS>)?q+LfOOi$0GlnDoDH!lr3+x zIp;-<=r>}eUbsCV%k#FQgi;ku=N&$69?u;dtx5)FvkLK;yeMTr)sk6dT0^4Vvv z);yM#zJ5yz?iEK~>Q-$aox#^>MnyxB%`d*Td&>-WWrgQ^F~d5G{WmSUtzS|6$L|m| zY0um=PwM^$w zXIU>xnm+NJ_~+5KPiA)%xSJxLKJ(OgDRtN&qugxikqNaU+O-w=H7LO^jU;RGxo;6B z`taTq9FI`M{9c3a9J!H@7-O!)r|c2r6;B|zCBf_a)2C`Mcu`1SqBnFXjkUj}r8ylv zf@(W7=MyBT#4}8EGgyY+%>)oK#b!dFQv})m92`ObE}c)pQvsp#w|lbM2f_Q zFlY(*;mV;PMlmr9bh&QKXHsNJXlqCLbb=*umco5>-rc71eED-b``hL}KmzZAIgxN+ zae)nqz!617mrqu9I8ZXoBrO|z_ji|d4Wp8-!F6k%SQzOrHXg#Q4l2=}^3MK6MU~ry z08;~d_Q^PTxCf3B7C$HZL^y_Ds?03QI{`Zjif#`x=MqW$s}-0i#Nvvx2k;@U zRsfk)`c`jQ;kdZlsZ@doD9 zFBdKB(|*)D4DKVLPmFFBMp3WGZgP4SpQ|2i?Vv|m9ungBjY7aqV)K_5JPz&fJ@eesaVtkL9;OKl&57dMK;&C*Pr)XQIrA+Y6tClwLpq{A zmH_ij5*jj~?bs>@(1yq*_i^x_H41q!m}qY3z7Nz-7^%$nnmbynHSEp6G74QV?C-gm zn2l2pGurJ5Q!GD{XR}aMxj)J4W=?ZMSaz^1`LuKVhetRm?m~R!Ov4r970AApRy<7X z(o@7z0xHGONw!|O{LyzHemq&D1!hRYU@jg&s~6WsP+1{}s3dl9>@q&}A_EL+qa)D< z(DCORzul1UYIWo~MaQqcKq+EilDp`+thNn{kYi4=wLOGG=KBwb6;Z`=KRcYPjn;@F zw$!!>lGgKQH?^k>)1kQUAAa*xQit?!#9(gc(|!wyuG-CWd@CAyqh-yhEgbJ|rb^=~K z!W8Nov|eHH-NvcTo_u}rl==xtt}hO}Qb}w)5(qFHYY1$G0T;^OJUc;^_F=nD|DnW# zbI%TRxG;sF9AVvek4;iD9F7-LD*tFM0qm)Qlpl15{<2Q>YJH%Di3O~6+C^`7-fiAI z1$kS53D@9P-8Rl3*JhQ=YpeClcP1K`<9cBt+yIoZ=c+Kx%-EE`TcLKEj>_-z$dNYT zzJu|6elpZ@)M|TeGSc9#VGbdDq2fH#g{;tuu2;mH=*`yhea1>X%O(Cde(!-BkZ<%q z&E3C_(d|?hY8OW$WK=7=HtlPrb->Ps^{#TsLG#%|cF$baVb3{8bKtz02qTHBu<7Vp zj|x0@(<~O+Idu|0_^GPDN&j4Tqg+B7QWh;a#CchRN~eua}W22>A1Wy z;M2Ic+6WILW&v8Yot1A8L!9$d@y;C_TJZ5f_t_Xl!;x1WvXE}dzb*qWTG)pg z3_rKH04;?0eDcA89nH_8F3QCio9?V9>I*D3viDP0?q*`RotlZHyDx{UtsuFv0EUZ(v$H{G8pBIIB%iB6tk| zf;W3fCuW#T;qwh~TL4PZ=~r3V4=_^~HeWf6y?x8h^M|p6bGRF}q!}v!Un^4Xg(w@X zn7{j~O^o9@JkRjBb5n)YeT=(Us~5Aj5FIl! zQ3*#wG-n9wu#w$?9U5QH$~8Oq3V9bE367pdb<38jVQ+n(HW?+*kN?5JE(j16OVMzx zSl7LM`#NdPNH5Eyy|6ZoY{*GO)xdVSSIdmQ$yl~(RSf0t(t;7-H_!hvi9NGyiN}Hw z&u=1e9B9(%^N2P=Z7}+35Xgr?AQ=EjqQddmh;^qMDOGq0gX5(u>mzB9!EK^PjMeZ& zNg%N;yMOf|WHgz>CuV*pKKj9EV9TxVRvk=~y#}Jzd;*I#xmdhO5gUOQ+kN|2$o`7q zD0RB~Nby6sN74;=qU6@QN&h-9?T_WxISj^(aps#1ud_U<SY&Ml>Z$iF$ra#PrVw7owqHvxa3!!MOm zG@i_Bo+tN6-+30i@OE@|4UidMhnjE$?Jng$88CV&u`h!i=V%THGA{pBR!7~_L(zvg zV6OdTcbxFpx>qhJ@{Kr2Bcr3jjwIAXF~}{{+T=s@yi(<08CFqlKr4$$NQq2N&d>d8 zYM3Xzx#%$!o9&RdNMTdY1J&iR{1thHMU=$Yp@_eP6K`4}IvSPLQ!Q_VN-*(8boKaK zg)5q};1g#M@#H&o{>mMxiD*N)|ICfL?R1beT-^#Zm(Tn-$*Ja)>@>vHnJL94IT5C4 zkwIUf8^&wrtO=q03vF_jX4x!%okY|@IQ~^!E=eOk zb3Nqw+W5TE-$(WN2!y-}t#h_Q?+4)gye6nAdXlmwSEF%PaS~|1Mffb>oUlME`)gyN z&9p^RFE8Yc1e%-pDS3oJc4fr%pQ0_fEHf3jl8aY%aG^n&pHI)F~cD- zW_Q>A`PCUg@1HM#JjyNmIexsxKnm_#0DCYo&Z}Y!!^ss{cc7|-A;L;!9A(rC1RHK8 zTe|0^q8TXuE%JyW@@PiKN6A5`&A}zM_2A7w$pmh=q`}BnovT`s_MQEW(kecId4DKS zzI@i>s;z+FxF z{yo9Nt8J@fNXyhe0qy2d|E-kx*_qlWMTOC4_mQ5@BlVs4Ii&;H|G#o)uz20epAv@f zlCRPU-By8zg(O=xyL!=DF%U*|7nAd{v~|DKbB4&<^vZaQmFzE^VaNpSg3Z$%qJL~q z@xFY}NtT)rrRat~<#(4Vkb5-(`1S+cW31zn840>UbwFD>RIrg06GA_yn{=$ XkvwwvnEUFA0w*o5AXXvrBjEo4!M2cF diff --git a/modules/n1ql/pages/n1ql-language-reference/advise.adoc b/modules/n1ql/pages/n1ql-language-reference/advise.adoc index 19191ab3d..602be0110 100644 --- a/modules/n1ql/pages/n1ql-language-reference/advise.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/advise.adoc @@ -15,6 +15,7 @@ :collection-op-in: {n1ql}/collectionops.adoc#collection-op-in :collection-op-any: {n1ql}/collectionops.adoc#collection-op-any :schema-output: {n1ql}/infer.adoc#schema-output +:using-ai: {n1ql}/using-ai.adoc // Aggregate function cross-references :min: {n1ql}/aggregatefun.adoc#min @@ -47,6 +48,7 @@ You can use the ADVISE statement with any of the following types of query: * {update}[UPDATE] queries * {delete}[DELETE] queries * {merge}[MERGE] queries +* {using-ai}[USING AI] queries (available in Couchbase Server 8.0 and later) The index advisor can recommend regular secondary indexes, partial indexes, and array indexes for the following predicates and conditions: @@ -76,7 +78,9 @@ include::partial$grammar/utility.ebnf[tag=advise] image::n1ql-language-reference/advise.png["Syntax diagram: refer to source code listing", align=left] -The statement consists of the `ADVISE` keyword, and optionally the `INDEX` keyword, followed by the query for which you want index advice -- a {select}[SELECT] query, an {update}[UPDATE] query, a {delete}[DELETE] query, or a {merge}[MERGE] query. +The statement consists of the `ADVISE` keyword, and optionally the `INDEX` keyword, followed by the query for which you want index advice -- a {select}[SELECT] query, an {update}[UPDATE] query, a {delete}[DELETE] query, a {merge}[MERGE] query, or a {using-ai}[USING AI] query. + +NOTE: You can use `ADVISE` with `USING AI` only in Couchbase Server 8.0 and later. == Usage diff --git a/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc b/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc index 0533a0323..4c821141a 100644 --- a/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc @@ -2,6 +2,7 @@ :page-status: Couchbase Server 8.0 :page-topic-type: reference :description: The USING AI statement allows you to generate SQL++ queries from natural language prompts. +:example-note: Copy the following commands and paste it into a xref:n1ql:n1ql-intro/cbq.adoc[cbq shell] with version 8.0 or later. [abstract] {description} @@ -16,11 +17,17 @@ For example, you can input prompts such as `How many airlines are based in Europ If USING AI generates a SELECT query, it automatically executes it and returns the results. For all other query types, it returns the generated query as a string without executing it. -IMPORTANT: With the introduction of the USING AI statement, you might notice that AI is now recognized as a keyword. +[IMPORTANT] +==== +* With the introduction of the USING AI statement, you might notice that AI is now recognized as a keyword. However, this change has been implemented in a way that does not break existing queries or applications where "ai" is used as a field name or identifier. For example, queries like `SELECT ai FROM XYZ` will continue to work without any issues. AI is treated as a keyword only when used in conjunction with the USING AI statement. +* Currently, the Couchbase Server Web Console does not support the USING AI statement. +You can execute it only through the CBQ shell, REST APIs, or SDKs. +==== + == Prerequisites Before using the USING AI statement, make sure you have: @@ -39,16 +46,24 @@ include::partial$grammar/utility.ebnf[tag=using-ai] image::n1ql-language-reference/using-ai.png["Syntax diagram: refer to source code listing", align=left] -natural-language-request:: A natural language prompt that you want to convert into a SQL++ query. +prompt:: +[Required] A natural language request that you want to convert into a SQL++ query. options:: - [Optional] A JSON object specifying additional <> to guide the statement execution. -By default, the statement uses the `natural_orgid`, `natural_cred`, and `natural_context` request parameters to determine the organization ID, credentials, and keyspaces for the request. -However, you can override these defaults by using the <> object. ++ +By default, the statement uses the `natural_orgid`, `natural_cred`, and `natural_context` parameters. +These parameters determine the organization ID, credentials, and keyspaces for the request. +You can override them by using the <> object. //TODO: Add links to `natural_orgid`, `natural_cred` and `natural_context` when available in the 8.0 documentation. +=== FLEXINDEX / FTS + +Use the optional `FLEXINDEX` or `FTS` keyword to generate a query that uses an FTS or flex index. +This hint appends a `USE INDEX (USING FTS)` clause to all `FROM` keyspaces in the generated query. +Refer to <>. + [[optional-parameters]] === Options @@ -98,18 +113,56 @@ If specified, this value overrides the `natural_orgid` parameter, which by defau | **execute** + __optional__ -| Indicates if the generated statement should be executed. +| Indicates if the generated statement should be executed immediately. + +If `TRUE`, the Query Service executes the generated statement and returns the results. -If `TRUE`, the generated statement is executed immediately and the results are returned. +This applies only if the statement is a SELECT query. +For other statement types, such as INSERT, UPDATE, DELETE, UPSERT, or CREATE FUNCTION, the Query Service returns the statement without executing it, even if `execute` is `TRUE`. +Refer to <>. -If `FALSE`, the generated statement is returned as a string without execution. +If `FALSE`, the Query Service returns the generated statement as a string without executing it. *Default:* `TRUE` | Boolean + +| **output** + +__optional__ +| A string specifying the type of output to generate. + +Possible values are: +-- +* `sql` - Generates a standard SQL++ query. + +* `jsudf` - Generates a CREATE FUNCTION statement. +You can use this to create a SQL++ managed JavaScript user-defined function. ++ +The Query Service does not execute the CREATE FUNCTION, even if `execute` is `TRUE`. +You must run the generated statement separately to create the function. + +* `ftssql` - Generates a SQL++ query optimized for FTS or flex indexes. +The Query Service appends a `USE INDEX (USING FTS)` clause to all `FROM` keyspaces in the generated query. +This enables the query to use a flex index if it's available. +-- + +The Query Service returns an error if you specify a value not included in this list. + +*Default:* `sql` +| String + |=== -=== Handling Passwords Securely +TIP: You can prefix a USING AI statement with EXPLAIN or ADVISE to get the query plan or index recommendations for your generated query. +Refer to <>. + +== Result + +A JSON object containing the generated statement, execution status, and metrics. + +If the generated statement is a SELECT query and the `execute` option is `TRUE` (default), the output includes the query results as well. + +== Handling Passwords Securely Use `creds` and `natural_cred` parameters with caution to avoid exposing password information through history files or logs. When working with the cbq shell, avoid passing passwords directly on the command line. @@ -134,10 +187,10 @@ If security is a concern, consider using an HTTPS connection. In the following examples, replace `natural_cred` and `natural_orgid` with your Capella credentials and organization ID, respectively. +[[example-1]] .Natural language prompt with default request parameters ==== -Copy the following sequence and paste it into the xref:n1ql:n1ql-intro/cbq.adoc[cbq shell]. -Note that you must be using cbq shell version 8.0 or later. +{example-note} .Request [source, console] @@ -176,10 +229,10 @@ USING AI How many hotels provide free parking?; ---- ==== +[[example-2]] .Natural language prompt with a custom keyspace ==== -Copy the following sequence and paste it into the xref:n1ql:n1ql-intro/cbq.adoc[cbq shell]. -Note that you must be using cbq shell version 8.0 or later. +{example-note} .Request [source, console] @@ -196,7 +249,8 @@ How many airlines are based in United Kingdom?; { "requestID": "a6dfea34-6445-4e66-9127-9bdfbe5f7585", "status": "success", - "generated_statement": "SELECT COUNT(*) AS `airlines_based_in_uk` FROM `travel-sample`.`inventory`.`airline` + "generated_statement": "SELECT COUNT(*) AS `airlines_based_in_uk` + FROM `travel-sample`.`inventory`.`airline` AS `a` WHERE `a`.`country` = \"United Kingdom\"", "metrics": { "elapsedTime": "2.485615126s", @@ -210,10 +264,10 @@ How many airlines are based in United Kingdom?; ---- ==== +[[example-3]] .Natural language prompt with all parameters directly in the statement, overriding the default ones ==== -Copy the following sequence and paste it into the xref:n1ql:n1ql-intro/cbq.adoc[cbq shell]. -Note that you must be using cbq shell version 8.0 or later. +{example-note} .Request [source, console] @@ -240,8 +294,10 @@ List the names of all hotels in the same city as an airport; { "requestID": "e154f6d5-0fa0-4de3-8824-3ebb73cb49f2", "status": "success", - "generated_statement": "SELECT `h`.`name` FROM `travel-sample`.`inventory`.`hotel` AS - `h` JOIN `travel-sample`.`inventory`.`airport` AS `a` ON `h`.`city` = `a`.`city`", + "generated_statement": "SELECT `h`.`name` + FROM `travel-sample`.`inventory`.`hotel` AS `h` + JOIN `travel-sample`.`inventory`.`airport` AS `a` + ON `h`.`city` = `a`.`city`", "metrics": { "elapsedTime": "4.032734417s", "executionTime": "0s", @@ -254,6 +310,7 @@ List the names of all hotels in the same city as an airport; ---- ==== +[[example-4]] .Natural language prompt submitted directly to the Query REST API ==== .Request @@ -263,9 +320,10 @@ echo -n "Enter your password: " read -s p echo curl -s -d "natural_cred=username@example.com:${p}" \ - -d 'pretty=true&statement=USING AI WITH {"keyspaces":"travel-sample.inventory.landmark","orgId":"5c670d3e-12a3-456b-7c89-123456789ab"} \ - How many landmarks are in the western hemisphere?' \ - http://localhost:8093/query/service -u username:password + -d 'pretty=true&statement=USING AI WITH {"keyspaces":"travel-sample.inventory.landmark", + "orgId":"5c670d3e-12a3-456b-7c89-123456789ab"} \ + How many landmarks are in the western hemisphere?' \ + http://localhost:8093/query/service -u username:password ---- .Response [source,json] @@ -294,4 +352,297 @@ curl -s -d "natural_cred=username@example.com:${p}" \ } } ---- +==== +[[example-5]] +.Natural language prompt generating an INSERT statement +==== +{example-note} + +.Request +[source, console] +---- +\set -natural_cred rakhi.prathap@couchbase.com:Couchbase123#; +\set -natural_orgid 7a99d00c-f55b-4b39-bc72-1b4cc68ba894; +USING AI WITH {"keyspaces":["travel-sample.inventory.hotel"], "execute": true} \ +Insert a new hotel named "Sunset Inn" in "Miami, Florida" with a rating of 4; +---- + +.Response +[source,json] +---- +{ + "requestID": "28a3f92e-0595-4a80-b35f-0606751e4d51", + "status": "success", + "generated_statement": "INSERT INTO `travel-sample`.`inventory`.`hotel` + (KEY, VALUE) VALUES (UUID(), + {\"name\": \"Sunset Inn\", + \"city\": \"Miami\", + \"state\": \"Florida\", + \"rating\": 4, + \"type\": \"hotel\"})", + "metrics": { + "elapsedTime": "2.007107125s", + "executionTime": "0s", + "resultCount": 0, + "resultSize": 0, + "serviceLoad": 0, + "naturalLanguageProcessingTime": "2.005838959s" + } +} +---- +If you examine the `hotel` keyspace, you will see that this document is not inserted, even though `execute` was set to `TRUE`. +This is because the Query Service executes the generated statement only if it is a SELECT statement. +==== + +[[example-6]] +.USING AI with flex index hint +==== +{example-note} + +.Request +[source, console] +---- +\set -natural_cred username@example.com:P@ssw0rd; +\set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; +USING AI FOR FLEXINDEX WITH {"keyspaces":["travel-sample.inventory.hotel"]} \ +How many hotels are located in California?; +---- +.Response +[source,json] +---- +{ + "requestID": "d5746585-4589-4703-a4cd-5acac3897c6f", + "generated_statement": "SELECT COUNT(*) + FROM `travel-sample`.`inventory`.`hotel` AS `h` + USE INDEX (USING FTS) WHERE `h`.`state` = \"California\"", + "signature": { + "$1": "number" + }, + "results": [ + { + "$1": 361 + } + ], + "status": "success", + "metrics": { + "elapsedTime": "2.528830585s", + "executionTime": "67.032959ms", + "resultCount": 1, + "resultSize": 25, + "serviceLoad": 3, + "naturalLanguageProcessingTime": "2.46060671s" + } +} +---- +==== + +[[example-7]] +.USING AI with output type `ftssql` +==== +{example-note} + +This example uses the same prompt as <> but specifies the `output` option instead of the `FLEXINDEX` keyword. + +.Request +[source, console] +---- +\set -natural_cred username@example.com:P@ssw0rd; +\set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; +USING AI WITH {"keyspaces":["travel-sample.inventory.hotel"], "output":"ftssql"} \ +How many hotels are located in California?; +---- + +.Response +[source,json] +---- +{ + "requestID": "c6fcaed5-23fa-4dc5-936c-febc6b5cb222", + "generated_statement": "SELECT COUNT(*) + FROM `travel-sample`.`inventory`.`hotel` AS `h` + USE INDEX (USING FTS) WHERE `h`.`state` = \"California\"", + "signature": { + "$1": "number" + }, + "results": [ + { + "$1": 361 + } + ], + "status": "success", + "metrics": { + "elapsedTime": "2.921005918s", + "executionTime": "29.772792ms", + "resultCount": 1, + "resultSize": 25, + "serviceLoad": 3, + "naturalLanguageProcessingTime": "2.889671542s" + } +} +---- +==== + +[[example-8]] +.USING AI with output type `jsudf` +==== +{example-note} + +.Request +[source, console] +---- +\set -natural_cred username@example.com:P@ssw0rd; +\set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; +USING AI WITH {"keyspaces":["travel-sample.inventory.hotel"], "output":"jsudf"} \ +Create a function to list all hotels in California; +---- + +.Response +[source,json] +---- +{ + "requestID": "731a896e-f4b8-4b3b-893a-2fbf38dfedc8", + "status": "success", + "generated_statement": "CREATE FUNCTION listHotelsInCalifornia() + LANGUAGE JAVASCRIPT AS 'function listHotelsInCalifornia() { + /* Define the query to select hotels in California */ + var q = SELECT `name`, `city`, `state`, `country` + FROM `travel-sample`.`inventory`.`hotel` + AS `h` WHERE `h`.`state` = \"CA\"; + /* Initialize an empty array to store the results */ + var res = []; + /* Iterate over the query results and push each hotel into the results array */ + for (const doc of q) { + var hotel = {}; + hotel.name = doc.name; + hotel.city = doc.city; + hotel.state = doc.state; + hotel.country = doc.country; + res.push(hotel); + } + /* Return the array of hotels in California */ + return res; + }'", + "metrics": { + "elapsedTime": "4.10252771s", + "executionTime": "0s", + "resultCount": 0, + "resultSize": 0, + "serviceLoad": 0, + "naturalLanguageProcessingTime": "4.102134168s" + } +} +---- +==== + +[[example-9]] +.Using EXPLAIN with USING AI +==== +{example-note} + +.Request +[source, console] +---- +\set -natural_cred rakhi.prathap@couchbase.com:Couchbase123#; +\set -natural_orgid 7a99d00c-f55b-4b39-bc72-1b4cc68ba894; +EXPLAIN USING AI WITH {"keyspaces":["travel-sample.inventory.hotel"]} \ +List the names and cities of hotels with a rating greater than 4; +---- + +.Response +[source,json] +---- +{ + "requestID": "98ea3e33-7ad9-4606-ae95-26b68463498e", + "generated_statement": "explain SELECT `h`.`name`, `h`.`city` + FROM `travel-sample`.`inventory`.`hotel` AS `h` + WHERE ANY `review` IN `h`.`reviews` + SATISFIES `review`.`rating` \u003e 4 END", + "signature": "json", + "results": [ + { + "plan": { + "#operator": "Sequence", + "~children": [ + { + "#operator": "PrimaryScan3", + "as": "h", + "bucket": "travel-sample", + "index": "def_inventory_hotel_primary", + "index_projection": { + "primary_key": true + }, + "keyspace": "hotel", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 917, + "cost": 303.73468119182434, + "fr_cost": 12.318140328453461, + "size": 11 + }, + "scope": "inventory", + "using": "gsi" + }, + { + "#operator": "Fetch", + "as": "h", + "bucket": "travel-sample", + "early_projection": [ + "city", + "name", + "reviews" + ], + "keyspace": "hotel", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 917, + "cost": 6989.182886677501, + "fr_cost": 31.59561928754362, + "size": 4377 + }, + "scope": "inventory" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [ + { + "#operator": "Filter", + "condition": "any `review` in (`h`.`reviews`) + satisfies (4 \u003c (`review`.`rating`)) end" + }, + { + "#operator": "InitialProject", + "discard_original": true, + "preserve_order": true, + "result_terms": [ + { + "expr": "(`h`.`name`)" + }, + { + "expr": "(`h`.`city`)" + } + ] + } + ] + } + } + ] + }, + "text": "SELECT `h`.`name`, `h`.`city` + FROM `travel-sample`.`inventory`.`hotel` AS `h` + WHERE ANY `review` IN `h`.`reviews` + SATISFIES `review`.`rating` \u003e 4 END" + } + ], + "status": "success", + "metrics": { + "elapsedTime": "2.524200293s", + "executionTime": "7.078542ms", + "resultCount": 1, + "resultSize": 2825, + "serviceLoad": 3, + "naturalLanguageProcessingTime": "2.516578959s" + } +} +---- ==== \ No newline at end of file diff --git a/modules/n1ql/partials/grammar/utility.ebnf b/modules/n1ql/partials/grammar/utility.ebnf index 3fbaa746c..f2dfcf515 100644 --- a/modules/n1ql/partials/grammar/utility.ebnf +++ b/modules/n1ql/partials/grammar/utility.ebnf @@ -8,7 +8,7 @@ utility-statement ::= advise | using-ai /* tag::advise[] */ -advise ::= 'ADVISE' 'INDEX'? ( select | update | delete | merge ) +advise ::= 'ADVISE' 'INDEX'? ( select | update | delete | merge | using-ai ) /* end::advise[] */ /* tag::explain[] */ @@ -99,5 +99,5 @@ delete-all ::= 'ALL' | 'STATISTICS' ***********************/ /* tag::using-ai[] */ -using-ai ::= 'USING AI' ( 'WITH' options )? natural-language-request +using-ai ::= 'USING AI' ( 'FOR' ( 'FLEXINDEX' | 'FTS' ) )? ( 'WITH' options )? prompt /* end::using-ai[] */ \ No newline at end of file From 5622ac76c46f64e289225b48ff21fa078200a4af Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Wed, 10 Sep 2025 17:20:52 +0100 Subject: [PATCH 42/80] DOC-13542: Update Capella REST API builds for Morpheus - Hide additional description in query settings - Include credentials in query settings - Prepare Query AWR for Data API --- modules/n1ql/pages/n1ql-manage/query-awr.adoc | 34 +++++++++++++------ .../pages/n1ql-manage/query-settings.adoc | 6 +++- 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/modules/n1ql/pages/n1ql-manage/query-awr.adoc b/modules/n1ql/pages/n1ql-manage/query-awr.adoc index 19c8ed422..a1e245c6d 100644 --- a/modules/n1ql/pages/n1ql-manage/query-awr.adoc +++ b/modules/n1ql/pages/n1ql-manage/query-awr.adoc @@ -298,23 +298,28 @@ For this release, the value is always 1. |=== [[Stats]] -==== Statistics +==== Statistics + +// TODO: Remove `flag-devex-rest-api` feature flag when Data API is released. + [cols="1a,4a,1a"] |=== | Name | Description | Schema | **total time** + -| The total time taken for the request, that is the time from when the request was received until the results were returned. - -It includes time spent in the queue and is analogous to `elapsedTime` in the xref:n1ql-rest-query:index.adoc#Metrics[Query REST API] response. +| The total time taken for the request -- that is, the time from when the request was received until the results were returned, including time spent in the queue. +ifdef::flag-devex-rest-api[] +It is analogous to `elapsedTime` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. +endif::flag-devex-rest-api[] | Number | **cpu time** + | The amount of time the operators in the execution plan spent executing operator code. -It is analogous to `cpuTime` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response when xref:n1ql-rest-query:index.adoc#Profile[profiling] is enabled. - +ifdef::flag-devex-rest-api[] +It is analogous to `cpuTime` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response when profiling is enabled. +endif::flag-devex-rest-api[] | Number | **memory usage (quota)** + @@ -323,29 +328,36 @@ It is analogous to `cpuTime` in the xref:n1ql-rest-query:index.adoc#Metrics[Quer A request will return its document memory usage only if `memory-quota` is set for the query, or if both `node-quota` and `node-quota-val-percent` are set. For more information about these settings, see xref:n1ql:n1ql-manage/query-settings.adoc[]. -It is analogous to `usedMemory` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. - +ifdef::flag-devex-rest-api[] +It is analogous to `usedMemory` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. +endif::flag-devex-rest-api[] | Number | **result count** + | The total number of objects in the results. -It is analogous to `resultCount` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. +ifdef::flag-devex-rest-api[] +It is analogous to `resultCount` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. +endif::flag-devex-rest-api[] | Number | **result size** + |The total number of bytes in the results. -It is analogous to `resultSize` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. +ifdef::flag-devex-rest-api[] +It is analogous to `resultSize` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. +endif::flag-devex-rest-api[] | Number | **error count** + | The number of errors that occurred during the request. -It is analogous to `errorCount` in the xref:n1ql-rest-query:index.adoc#Metrics[Query Service API] response. +ifdef::flag-devex-rest-api[] +It is analogous to `errorCount` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. +endif::flag-devex-rest-api[] | Number diff --git a/modules/n1ql/pages/n1ql-manage/query-settings.adoc b/modules/n1ql/pages/n1ql-manage/query-settings.adoc index 1341b7fc7..ace989e97 100644 --- a/modules/n1ql/pages/n1ql-manage/query-settings.adoc +++ b/modules/n1ql/pages/n1ql-manage/query-settings.adoc @@ -163,7 +163,11 @@ endif::flag-devex-rest-api[] The table below contains details of all request-level parameters, along with examples. .Request-Level Parameters -include::n1ql-rest-query:index.adoc[tag=Request] +include::n1ql-rest-query:index.adoc[tags=Request;!desc-more] + +[[Credentials,Credentials]] +**Credentials** +include::n1ql-rest-query:index.adoc[tag=Credentials] [discrete#transactional-scan-consistency] ===== Transactional Scan Consistency From 1ce770643d70559470cda5ed1f106b77fea45cfa Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Thu, 11 Sep 2025 12:58:40 -0400 Subject: [PATCH 43/80] [AV-110437] Vector Search Index Architecture (#416) * [AV-110437] Porting over changes from Server for vector search index architecture * [AV-110437] Addressing comments from SME review --- .../search/pages/type-mapping-options.adoc | 2 +- .../vector-search-index-architecture.adoc | 156 ++++++++++++++++++ modules/vector-search/partials/nav.adoc | 1 + 3 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 modules/vector-search/pages/vector-search-index-architecture.adoc diff --git a/modules/search/pages/type-mapping-options.adoc b/modules/search/pages/type-mapping-options.adoc index 5dff2a213..674d20630 100644 --- a/modules/search/pages/type-mapping-options.adoc +++ b/modules/search/pages/type-mapping-options.adoc @@ -232,7 +232,7 @@ a| include::partial$vector-search-field-descriptions.adoc[tag=similarity_metric] In the previous version of the Search Service UI, this option had the same name. -|Optimized For (Vector Fields Only) +|[[optimized]]Optimized For (Vector Fields Only) a| include::partial$vector-search-field-descriptions.adoc[tag=optimized_for] In the previous version of the Search Service UI, this option had the same name. diff --git a/modules/vector-search/pages/vector-search-index-architecture.adoc b/modules/vector-search/pages/vector-search-index-architecture.adoc new file mode 100644 index 000000000..f28b2d97a --- /dev/null +++ b/modules/vector-search/pages/vector-search-index-architecture.adoc @@ -0,0 +1,156 @@ += Vector Search Index Architecture +:page-topic-type: concept +:description: Vector Search indexes use features from traditional Search indexes, with unique indexing algorithms and features that allow you to compare vectors in nearest neighbor searches. +:page-toclevels: 3 + +[abstract] +{description} + +A Vector Search index still relies on <> and uses <> to manage merging and persisting data to disk in your cluster. +All changes from Database Change Protocol (DCP) and the Data Service are introduced to a Search index in batches, which are further managed by segments. + +[#sync] +== Synchronization with Database Change Protocol (DCP) and the Data Service + +The Search Service uses batches to process data that comes in from xref:server:learn:clusters-and-availability/intra-cluster-replication.adoc#database-change-protocol[DCP] and the xref:cloud:clusters:databases.adoc#couchbase-services[Data Service]. +DCP and Data Service changes are introduced gradually, based on available memory on Search Service nodes, until reindexing operations for an index are complete. + +The Search Service can merge batches into a single batch before they're sent to the disk write queue, to reduce the resources required for batch processing. + +The Search Service maintains index snapshots on each Search index partition. +These snapshots contain a representation of document mutations on either a write queue, or in storage. + +If the Search Service loses connection to the Data Service, the Search Service compares its rollback sequence numbers in its snapshots with the Data Service when the connection is reestablished. +If the index snapshots on the Search Service are too far ahead, the Search Service performs a full rollback to get back in sync with the Data Service. + +[#segments] +== Search Index Segments + +Search and Vector Search indexes are built with index snapshots, which contain data segments. + +All Search indexes contain a root index snapshot. +This snapshot maps to all segments that contain the latest version of data for your Search index. +The data in newer segments can overwrite the data in older segments. +The Search Service maintains time-spaced snapshots to support partial index rollbacks, in case of data sync issues between the Data Service and the Search Service. + +The stale segments in a snapshot are eventually removed by the Search Service's persister or merger routines -- unless these segments are needed to restore an index snapshot. + +The persister reads in-memory segments from the disk write queue and flushes them to disk, completing batch operations as part of <>. +The merger flushes consolidated files to disk and updates the root index snapshot. + +The persister and merger interact to continuously flush and merge new in-memory segments to disk, and remove stale segments. + +Segments are marked as stale when they're replaced by a new merged segment created by the merger. +Stale segments are deleted when they're no longer used by any new queries. + +As smaller segments are merged together through the merger routine, the Search Service automatically runs any needed retraining for Vector Search indexes. +The segments for a Vector Search index can contain different index types and use a separate indexing pipeline, choosing the appropriate indexing algorithm based on the size of your available documents. + +== Vector Search and FAISS + +Vector Search specifically uses https://faiss.ai/index.html[FAISS^] indexes. +Any vectors inside your documents are indexed using FAISS, to create a new query vector that can be searched for similar vectors inside your Vector Search index. +These FAISS indexes are embedded within segments alongside any text indexes and other data structures. + +Vector Search chooses the best https://github.com/facebookresearch/faiss/wiki/Faiss-indexes[FAISS index class^], or vector search algorithm, for your data, and automatically tunes parameters to provide a balance of recall and latency. +You can choose to prioritize recall, latency, or memory efficiency with the xref:search:type-mapping-options.adoc#optimized[Optimized For] setting on your index. +You can also choose to xref:fine-tune-vector-search.adoc[fine tune your Vector Search queries] to override the default balancing for your index, and change the number of centroids or probes searched in a query. + +The FAISS indexes created for your vector data can be: + +* <> +* <> + +The specific type of index used depends on the number of vectors in your dataset: + +|==== +| Vector Count | Index Types | Description + +| >=10,000 +| IVF with scalar quantization +a| Vectors are indexed with <> indexes and <>. + +If xref:search:type-mapping-options.adoc#optimized[Optimized For] is set to *recall* or *latency*, Vector Search uses 8bit scalar quantization. +If set to *memory-efficient*, Vector Search uses 4bit scalar quantization. + +| >=1000 +| IVF with Flat +| Vectors are indexed with <> combined with <>. +Indexes do not use <>. + +| <1000 +| Flat +| Vectors are indexed with <>. +Indexes do not use <>. +|==== + +[#flat] +=== FLAT Indexes + +The most basic kind of index that Vector Search can use for your vectors is a flat index. + +Vector Search uses flat indexes for data that contains less than 1000 vectors. + +Flat indexes are a list of vectors. +Searches run on a nearest neighbor process, based on examining the query vector against each vector in the index and calculating the distance. +Results for flat indexes are very accurate, but performance does not scale well as a dataset grows. + +If a Vector Search index uses only flat indexes, no training is required - IDs are mapped directly to vectors with exact vector comparisons, with no need for preprocessing or learning on the data. + +[#ivf] +=== Inverted File Index (IVF) + +For reduced latency, Vector Search can also use Inverted File Indexes (IVF). + +Vector Search uses a combination of IVF and flat indexes for data that contains between 1000 and 9999 vectors. +For even larger datasets, Vector Search uses IVF indexes with <>. + +IVF creates partitions called Voronoi cells in an index. +The total number of cells is the *nlist* parameter. + +Every cell has a centroid. +Every vector in the processed dataset is assigned to a cell that corresponds to its nearest centroid. + +In an IVF index, Vector Search first tries to find a centroid vector closest to the query vector. +After finding this closest centroid vector, Vector Search uses the default `nprobe` and `max_codes` values to search over adjoining cells to the closest centroid and finds the top `k` number of vectors. + +IVF index searches are not exhaustive searches. +You can increase accuracy by changing the `max_nprobe_pct` parameter or `max_codes_pct` when you xref:fine-tune-vector-search.adoc[fine tune your Vector Search queries]. + +The Search Service automatically trains larger IVF indexes to learn the data distribution of your vectors, and the centroids of cells in your dataset. +The training data helps to encode and compress the vectors in your index with <>. +All training occurs during building and merging <>. + +IVF indexes that also use flat indexing automatically train to determine the centroids of cells, but still use exact vector comparisons within each cell. +Training still occurs while building and merging <>. + +[#scalar-quant] +==== Scalar Quantization + +Vector Search uses scalar quantization on large datasets to reduce the size of your indexes. + +Scalar quantization is an important data compression technique that turns the floating point values that could be present in a large vector into low-dimensional integers. +For example, a float32 value could be reduced to an int8 value. + +Scalar quantization in Vector Search does not have a significant effect on the recall, or accuracy, of query results on large datasets. + +Vector Search uses both 8bit and 4bit scalar quantization for indexes, based on your xref:search:type-mapping-options.adoc#optimized[Optimized For] setting. + +== Search Request Processing + +The Search Service uses a scatter-gather process for running all Search queries, when there are multiple nodes in the cluster running the Search Service. + +The Search Service node that receives the Search request is assigned as the coordinating node. +Using https://grpc.io/[gRPC^], the coordinating node scatters the request to all other partitions for the Search or Vector Search index in the request across other nodes. +The coordinating node applies filters to the results received from the other partitions, and returns the final result set. + +Results are scored, and based on the xref:search:search-request-params.adoc#sort[Sort Object] provided in the Search request, returned in a list. + +For a Vector Search query, search results include the top `k` nearest neighbor vectors to the vector in the Search query. +For more information about how results are scored and returned for Search requests, see xref:search:run-searches.adoc#scoring[Scoring for Search Queries]. + +== See Also + +* xref:fine-tune-vector-search.adoc[] +* xref:search:search-request-params.adoc[] +* xref:create-vector-search-index-ui.adoc[] \ No newline at end of file diff --git a/modules/vector-search/partials/nav.adoc b/modules/vector-search/partials/nav.adoc index d76ee5320..bdc038bed 100644 --- a/modules/vector-search/partials/nav.adoc +++ b/modules/vector-search/partials/nav.adoc @@ -1,6 +1,7 @@ * xref:cloud:vector-search:vector-search.adoc[] ** xref:cloud:vector-search:create-vector-search-index-ui.adoc[] ** xref:cloud:vector-search:pre-filtering-vector-search.adoc[] +** xref:cloud:vector-search:vector-search-index-architecture.adoc[] ** xref:cloud:vector-search:run-vector-search-ui.adoc[] ** xref:cloud:vector-search:run-vector-search-sdk.adoc[] ** xref:cloud:vector-search:fine-tune-vector-search.adoc[] From d2fdc958c060c245452718928c86c20d422a74d4 Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:05:18 -0400 Subject: [PATCH 44/80] [AV-104760] 8.0 on Capella - Search Request Partition Selection (#397) * [AV-104760] First draft of searching replica partitions documentation for Capella * [AV-104760] Addressing comments from SME review on DOC-12755 * [AV-104690] Add HEAD.yml for previews --- .../examples/run-search-full-request.jsonc | 1 + .../search/pages/search-request-params.adoc | 30 +++++++++++++++++-- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/modules/search/examples/run-search-full-request.jsonc b/modules/search/examples/run-search-full-request.jsonc index c2389966e..f1411b215 100644 --- a/modules/search/examples/run-search-full-request.jsonc +++ b/modules/search/examples/run-search-full-request.jsonc @@ -63,6 +63,7 @@ // tag::ctl[] "ctl": { "timeout": 10000, + "partition_selection": "local", // tag::consistency[] "consistency": { // tag::vectors[] diff --git a/modules/search/pages/search-request-params.adoc b/modules/search/pages/search-request-params.adoc index 1713e39c7..f4b7b3a96 100644 --- a/modules/search/pages/search-request-params.adoc +++ b/modules/search/pages/search-request-params.adoc @@ -38,9 +38,10 @@ For more information about how to configure the objects inside a `knn` array, se |ctl |Object |No a| -An object that contains properties for query consistency. +An object that contains properties for query consistency. +Depending on your version of Couchbase Server, the `ctl` object can also validate Search queries or choose specific Search index partitions for a query. -For more information about how to configure Search query consistency inside the `ctl` object, see <>. +For more information about how to configure the `ctl` object, see <>. |[[size-limit]]size/limit |Integer |No a| @@ -1910,7 +1911,8 @@ include::example$query-analytic.jsonc[tag=match_prefix_length] [#ctl] == Ctl Object -Use the `ctl` object to make sure that the Search Service runs your Search query against the latest version of the documents in your database. +Use the `ctl` object to make sure that the Search Service runs your Search query against the latest version of the documents in your cluster. +As of Couchbase Server version 8.0 and later, you can also use it to control which replica partition the Search Service uses to find results for a query. The `ctl` object and its properties cause the Search Service to run your query against the latest version of a document written to a xref:server:learn:buckets-memory-and-storage/vbuckets.adoc[vBucket]. The Search Service uses a consistency vector to synchronize the last document write to a vBucket from the Data Service with the Search index. @@ -1953,6 +1955,28 @@ For example, the Search Service can tell you through the Web Console or the REST err: query_validate: field not indexed, field: ratings.Cleanliness, type: number ---- +|partition_selection |String |No a| + +[.status]#Couchbase Server 8.0# + +If your Search index is configured with xref:customize-index.adoc#replica[partitions and replicas], add the `partition_selection` property to choose how the Search Service selects the partitions to search for your Search query: + +* `""`: The Search Service targets only active partitions. +Active partitions are the partitions currently being used to serve Search requests. +This is the default setting. +* `"local"`: The Search Service targets all active or replica partitions, local to the coordinator node. +If the required Search index partition for a query is not available on the coordinator node, the Search Service looks for the partition within the node's xref:clusters:databases.adoc#couchbase-services[Service Group]. +If the Search Service still cannot find the partition, then it chooses a random node in the cluster that's running the Search Service, that contains the correct active or replica partition. +* `"local_only"`: The Search Service targets all active or replica partitions, local to the coordinator node. +If the required Search index partition for a query is not available on the coordinator node, the Search Service looks for the partition within the node's xref:clusters:databases.adoc#couchbase-services[Service Group]. +If the Search Service still cannot find the partition, then the query returns partial results. +* `"random"`: The Search Service chooses a random selection of partitions from local and remote nodes for the Search query. +* `"random_balanced"`: The Search Service tries to choose a node that is not already serving a Search request. +If the Search Service cannot find an available node, it defaults to a random node with the correct partition or replica. +This mode is designed to keep the number of query handling partitions per node the same. + +For more information about how to configure partitions and replicas on your Search index, see xref:create-search-index-ui.adoc[] or xref:search-index-params.adoc#planparams[planParams Object]. + |==== [#consistency] From 148526a06591a0b79be551212f861ae546d9503c Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Wed, 24 Sep 2025 16:26:15 -0400 Subject: [PATCH 45/80] [AV-104692] 8.0 on Capella - FTS Scoring Models (#395) * [AV-104692] First draft of bm25 documentation for Capella * [AV-104692] Comment from SME review * [AV-104692] Copying applicable comment from DOC-12753 * [AV-104692] Add mention of scoring model to create-search-indexes.adoc * [AV-104692] Quick consistency edit --- .../examples/autocomplete-search-index.jsonc | 1 + .../complex-search-index-payload.jsonc | 1 + .../examples/geospatial-search-index.jsonc | 1 + .../examples/run-search-full-request.jsonc | 3 +- .../simple-search-index-payload.jsonc | 3 +- .../search/pages/create-search-index-ui.adoc | 17 +++--- .../search/pages/create-search-indexes.adoc | 1 + modules/search/pages/customize-index.adoc | 18 +++++++ modules/search/pages/run-searches.adoc | 54 +++++++++++++++++-- modules/search/pages/search-index-params.adoc | 12 +++++ .../search/pages/search-request-params.adoc | 11 ++++ ...bal-scoring-vector-search-payload-ui.jsonc | 27 ++++++++++ .../sample-vector-search-index-payload.json | 1 + .../vector-search-index-payload.jsonc | 1 + .../pages/run-vector-search-ui.adoc | 23 ++++++++ 15 files changed, 161 insertions(+), 13 deletions(-) create mode 100644 modules/vector-search/examples/run-global-scoring-vector-search-payload-ui.jsonc diff --git a/modules/search/examples/autocomplete-search-index.jsonc b/modules/search/examples/autocomplete-search-index.jsonc index 5733dcffc..2c3b6f96f 100644 --- a/modules/search/examples/autocomplete-search-index.jsonc +++ b/modules/search/examples/autocomplete-search-index.jsonc @@ -52,6 +52,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": true, + "scoring_model": "tfidf", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/search/examples/complex-search-index-payload.jsonc b/modules/search/examples/complex-search-index-payload.jsonc index 7e3826fbf..58879d162 100644 --- a/modules/search/examples/complex-search-index-payload.jsonc +++ b/modules/search/examples/complex-search-index-payload.jsonc @@ -154,6 +154,7 @@ "default_type": "_default", "docvalues_dynamic": true, "index_dynamic": true, + "scoring_model": "tfidf", "store_dynamic": true, "type_field": "_type", "types": { diff --git a/modules/search/examples/geospatial-search-index.jsonc b/modules/search/examples/geospatial-search-index.jsonc index 242fe86ac..393c1ab2c 100644 --- a/modules/search/examples/geospatial-search-index.jsonc +++ b/modules/search/examples/geospatial-search-index.jsonc @@ -26,6 +26,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": true, + "scoring_model": "tfidf", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/search/examples/run-search-full-request.jsonc b/modules/search/examples/run-search-full-request.jsonc index f1411b215..5dea5db81 100644 --- a/modules/search/examples/run-search-full-request.jsonc +++ b/modules/search/examples/run-search-full-request.jsonc @@ -78,7 +78,8 @@ "results": "complete" }, // end::consistency[] - "validate": true + "validate": true, + "global_scoring": true }, // end::ctl[] "size": 10, diff --git a/modules/search/examples/simple-search-index-payload.jsonc b/modules/search/examples/simple-search-index-payload.jsonc index 180f5aa77..6a9de5158 100644 --- a/modules/search/examples/simple-search-index-payload.jsonc +++ b/modules/search/examples/simple-search-index-payload.jsonc @@ -204,11 +204,12 @@ "default_type": "_default", "docvalues_dynamic": true, "index_dynamic": true, + "scoring_model": "bm25", "store_dynamic": true, "type_field": "_type", // tag::types[] "types": { - // end::mapping[] + // end::mapping[] // tag::scope_collection[] "inventory.hotel": { "dynamic": false, diff --git a/modules/search/pages/create-search-index-ui.adoc b/modules/search/pages/create-search-index-ui.adoc index 86cdc641c..faaaa072e 100644 --- a/modules/search/pages/create-search-index-ui.adoc +++ b/modules/search/pages/create-search-index-ui.adoc @@ -49,23 +49,26 @@ If you select specific collections, you can only use documents from these collec . Click *Index everything from: $COLLECTION_NAME*. . Click btn:[Index All Fields]. . Click btn:[Add to Index]. -. (Optional) <>. +. (Optional) <>. . (Optional) Expand *Replicas & Partitions* and configure your *Number of Replicas* and *Number of Partitions*. + For more information, see xref:customize-index.adoc#replica[Replica and Partition Settings]. . Click btn:[Create Index]. [#configure-settings] -=== Configure Global Search Index Settings +=== Configure Additional Search Index Settings -To configure global settings for your Search index: +To configure additional settings for your Search index: -. Expand *Global Index Settings*: -.. [[default-analyzer]]In the *Default Analyzer* list, select the xref:customize-index.adoc#analyzers[default analyzer] to assign to new xref:customize-index.adoc#type-mappings[type mappings] in your index. -.. [[date-time]]In the *Default Date/Time Parser* list, select the xref:customize-index.adoc#date-time[default date/time parser] to use for date data in your index. +. [[default-analyzer]]In the *Default Analyzer* list, select the xref:customize-index.adoc#analyzers[default analyzer] to assign to new xref:customize-index.adoc#type-mappings[type mappings] in your index. +. [[date-time]]In the *Default Date/Time Parser* list, select the xref:customize-index.adoc#date-time[default date/time parser] to use for date data in your index. + TIP: If you're editing your index in xref:create-search-indexes.adoc#advanced-mode[Advanced Mode Editing], you can also choose to xref:create-custom-analyzer.adoc[] or xref:create-custom-date-time-parser.adoc[]. -. (Advanced Mode Only) In the *Configured Type Mappings* pane, under *Choose Document Filter*, xref:set-type-identifier.adoc[configure a document filter] for your Search index. +. (Advanced Mode Only) Under *Document Filter*, xref:set-type-identifier.adoc[configure a document filter] for your Search index. +. (Advanced Mode Only) Under *Scoring Model*, choose the scoring model to use for your Search index. +For more information, see xref:run-searches.adoc#scoring[Scoring for Search Queries] or xref:customize-index.adoc#scoring-model[Scoring Model]. ++ +TIP: If you choose the `bm25` scoring model, make sure to include the xref:search-request-params.adoc#global_scoring[`global_scoring`] property in Search queries for this index. == Next Steps diff --git a/modules/search/pages/create-search-indexes.adoc b/modules/search/pages/create-search-indexes.adoc index b4413a5ac..33b98f41e 100644 --- a/modules/search/pages/create-search-indexes.adoc +++ b/modules/search/pages/create-search-indexes.adoc @@ -44,6 +44,7 @@ If you select *Enable Advanced Options* to enable Advanced Mode in the Search in * Creating xref:customize-index.adoc#type-mappings[mappings] for objects and fields that do not yet exist in your document schema * Configuring a xref:customize-index.adoc#type-identifiers[document filter] * As of Couchbase Server version 8.0, configuring a xref:synonyms/synonyms-search.adoc[synonym source] +* As of Couchbase Server version 8.0, changing your Search index's xref:customize-index.adoc#scoring-model[scoring model] All initial editing options remain available in Advanced Mode editing. diff --git a/modules/search/pages/customize-index.adoc b/modules/search/pages/customize-index.adoc index e5b2fe5e1..c23aaec22 100644 --- a/modules/search/pages/customize-index.adoc +++ b/modules/search/pages/customize-index.adoc @@ -14,6 +14,7 @@ You can add the following components and configure the following options for a S * <> * <> * <> +* <> * <> * <> * <> @@ -36,6 +37,23 @@ When you create a custom analyzer, you can choose these components. For more information about Search analyzer components, see <>. For more information about how to create a custom analyzer, see xref:create-custom-analyzer.adoc[]. + +[#scoring-model] +== Scoring Model + +[.status]#Couchbase Server version 8.0# + +As of Couchbase Server version 8.0, in Advanced Mode editing, you can choose the specific scoring model you want to use for a Search index. +Your scoring model changes the calculation the Search Service uses for scoring documents and ranking them in your search results. + +The following scoring model algorithms are available: + +* `tfidf`: The standard scoring model for the Search Service. +A higher tf-idf score for a document places that document higher in your search results. +* `bm25`: A scoring model better suited to hybrid searches with the Search Service. +A hybrid Search query uses xref:vector-search:vector-search.adoc[Vector Search] together with a standard Search query. + +For more information about the calculations for scoring for each algorithm, see xref:run-searches.adoc#scoring[Scoring for Search Queries]. [#date-time] == Default Date/Time Parser diff --git a/modules/search/pages/run-searches.adoc b/modules/search/pages/run-searches.adoc index 2efa18a3f..38c83bdf9 100644 --- a/modules/search/pages/run-searches.adoc +++ b/modules/search/pages/run-searches.adoc @@ -26,7 +26,18 @@ To run a Search query against multiple Search indexes at once, xref:create-searc [#scoring] == Scoring for Search Queries -To determine a document's score in search results, the Search Service uses the https://en.wikipedia.org/wiki/Tf%E2%80%93idf[tf-idf^] algorithm. +As of Couchbase Server version 8.0, you can choose between 2 scoring algorithms for your Search index: + +* <> +* <> + +TIP: Scoring can also change based on whether you're using synonyms in your Search index. +For more information, see xref:synonyms/synonyms-search.adoc#run-synonym-search[Running a Search for Synonyms]. + +[#tf-idf] +=== tf-idf Search Scoring + +To determine a document's score in search results, the Search Service can use the https://en.wikipedia.org/wiki/Tf%E2%80%93idf[tf-idf^] algorithm. `tf-idf` increases the score of a document based on term frequency, or the number of times a term appears in a document divided by the total number of terms in the document. It penalizes document frequency, or how often a term appears across all documents. @@ -46,12 +57,47 @@ hit_score = (query_1_boost * query_1_hit_score) + (knn_boost * knn_distance) When running a hybrid search with the <> or <>, the Search Service displays results as a disjunct (`OR`) between your regular Search and Vector Search queries. -TIP: When running a hybrid Search query, you should add a `boost` value to your regular Search query to level the `tf-idf` score with the `knn` distance. +TIP: When running a hybrid Search query and the `tf-idf` algorithm, you should add a `boost` value to your regular Search query to level the `tf-idf` score with the knn distance. Otherwise, you might see unexpected search results. This is because of the differences in the scoring algorithms between the 2 query types. -Scoring can also change based on whether you're using synonyms in your Search index. -For more information, see xref:synonyms/synonyms-search.adoc#run-synonym-search[Running a Search for Synonyms]. +[#bm25] +=== bm25 Search Scoring + +[.status]#Couchbase Server version 8.0# + +As of Couchbase Server version 8.0, you can choose to use the https://en.wikipedia.org/wiki/Okapi_BM25[bm25^] algorithm instead of `tf-idf` for your Search index. + +`bm25` ranks documents based on the query terms that appear in each document, regardless of proximity. +It calculates the number of times a term appears in a document, with penalties for more common terms like `tf-idf`, but also includes: + +* Diminishing returns for a term that continues to frequently appear in documents, based on a saturation parameter (`k1`). +* An adjustment to the resulting score, based on the total length of the current document field, divided by a normalized average length of the field across all documents (`b`). + +The value of `k1` limits just how much a single query term's frequency can affect the scoring of a document. +`k1` reduces the effect of term repetition and the risk of documents with excessively repeated content inflating your relevance scores. +For example, spam or clickbait content would have reduced scores in `bm25` over the same document sentence being scored with `tf-idf`. + +The Search Service chooses reasonable defaults for the value of `k1` and `b`. + +Unlike `tf-idf`, `bm25` rewards term frequency, but penalizes document frequency. + +The calculation for a basic Search query is still based on the document's score for a query multiplied by any xref:search-request-params.adoc#boost[boost] parameters: + +---- +hit_score = (query_1_boost * query_1_hit_score) + (query_2_boost * query_2_hit_score) +---- + +The calculation when running a hybrid Search query, that includes xref:vector-search:vector-search.adoc[a Vector Search query], is still: + +---- +hit_score = (query_1_boost * query_1_hit_score) + (knn_boost * knn_distance) +---- + +When running a hybrid search with the <> or <>, the Search Service displays results as a disjunct (`OR`) between your regular Search and Vector Search queries. + +`bm25` supports better hybrid search results and richer result rankings. +It also gives more stable result ordering across Search index partitions, when xref:search-request-params.adoc#global_scoring[`global_scoring`] is enabled. [#ui] == Run a Search with the {page-ui-name} diff --git a/modules/search/pages/search-index-params.adoc b/modules/search/pages/search-index-params.adoc index 2573d902b..66784b0f3 100644 --- a/modules/search/pages/search-index-params.adoc +++ b/modules/search/pages/search-index-params.adoc @@ -679,6 +679,18 @@ To index any fields in the Search index where `dynamic` is `true`, set `index_dy To exclude dynamic fields from the index, set `index_dynamic` to `false`. +|scoring_model |String |Yes a| + +[.status]#Couchbase Server 8.0# + +Choose the specific scoring model you want to use for scoring search results for this Search index: + +* `tfidf`: The standard scoring model for the Search Service. +A higher tf-idf score for a document places that document higher in your search results. +* `bm25`: A scoring model better suited to hybrid searches with the Search Service. +A hybrid Search query uses xref:vector-search:vector-search.adoc[Vector Search] together with a standard Search query. +For more information about the calculations for scoring for each algorithm, see xref:run-searches.adoc#scoring[Scoring for Search Queries]. + |store_dynamic |Boolean |Yes a| To return the content from an indexed field in the Search index, set `store_dynamic` to `true`. diff --git a/modules/search/pages/search-request-params.adoc b/modules/search/pages/search-request-params.adoc index f4b7b3a96..8769a50c6 100644 --- a/modules/search/pages/search-request-params.adoc +++ b/modules/search/pages/search-request-params.adoc @@ -1977,6 +1977,17 @@ This mode is designed to keep the number of query handling partitions per node t For more information about how to configure partitions and replicas on your Search index, see xref:create-search-index-ui.adoc[] or xref:search-index-params.adoc#planparams[planParams Object]. +|[[global_scoring]]global_scoring |Boolean |No a| + +[.status]#Couchbase Server 8.0# + +Add the `global_scoring` property with a value of `true` to ensure consistent and stable result ordering with the xref:run-searches.adoc#bm25[bm25 scoring algorithm], when you have a large, partitioned Search index. +`global_scoring` aggregates document scoring across partitions to help maintain relative scoring, but uses more compute resources and increases search times. +If you do not use `global_scoring`, result ordering can change based on your Search index's partition count. + +You can only use `global_scoring` if you're using the xref:run-searches.adoc#bm25[bm25 scoring algorithm]. +The setting has no effect if your `scoring_model` is set to `tfidf`. + |==== [#consistency] diff --git a/modules/vector-search/examples/run-global-scoring-vector-search-payload-ui.jsonc b/modules/vector-search/examples/run-global-scoring-vector-search-payload-ui.jsonc new file mode 100644 index 000000000..ee35739bb --- /dev/null +++ b/modules/vector-search/examples/run-global-scoring-vector-search-payload-ui.jsonc @@ -0,0 +1,27 @@ +{ + "fields": ["description", "price", "product_name"], + "query": { + "conjuncts": [ + { + "term": "Electronics", + "field": "category" + }, + { + "field": "price", + "min": 100.00, + "max": 300.00, + "inclusive_max": true + } + ] + }, + "knn": [ + { + "k": 5, + "field": "embedding", + "vector": [0.23, -0.75, 0.61, ...] + } + ], + "ctl": { + "global_scoring": true + } +} \ No newline at end of file diff --git a/modules/vector-search/examples/sample-vector-search-index-payload.json b/modules/vector-search/examples/sample-vector-search-index-payload.json index daa18b953..6158ce6cb 100644 --- a/modules/vector-search/examples/sample-vector-search-index-payload.json +++ b/modules/vector-search/examples/sample-vector-search-index-payload.json @@ -19,6 +19,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": true, + "scoring_model": "bm25", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/vector-search/examples/vector-search-index-payload.jsonc b/modules/vector-search/examples/vector-search-index-payload.jsonc index fe4ccce3a..5b70f0f21 100644 --- a/modules/vector-search/examples/vector-search-index-payload.jsonc +++ b/modules/vector-search/examples/vector-search-index-payload.jsonc @@ -26,6 +26,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": false, + "scoring_model": "bm25", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/vector-search/pages/run-vector-search-ui.adoc b/modules/vector-search/pages/run-vector-search-ui.adoc index 96bcc1c03..7a9ee8256 100644 --- a/modules/vector-search/pages/run-vector-search-ui.adoc +++ b/modules/vector-search/pages/run-vector-search-ui.adoc @@ -72,6 +72,9 @@ If the same documents match the `knn` and `query` objects, the Search Service ra The document for the color `navy` should be the first result, followed by colors that are similar and match the `brightness` field query. +TIP: If you want to run a hybrid Search query on a large, partitioned Search index and your cluster is on Couchbase Server version 8.0 or later, use the `bm25` scoring model for your Search index. +For more information, see xref:search:create-search-index-ui.adoc#configure-settings[Configure Additional Search Index Settings], xref:run-searches.adoc#scoring[Scoring for Search Queries], or xref:customize-index.adoc#scoring-model[Scoring Model]. + [#large] === Example: Running a Semantic Search Query with a Large Embedding Vector @@ -120,6 +123,26 @@ include::example$run-vector-search-payload-base64-ui.jsonc[] NOTE: You can only use base64 encoded strings in your Vector Search queries if your documents use base64 encoded strings, indexed with the *vector_base64* field data type. You cannot search for and return vectors you indexed as arrays with the *vector* field data type by using a Search query with a base64 encoded string. +=== Example: Use global_scoring With a bm25 Search Index + +In the following example, the Search query uses both a `query` and `knn` object to run both a Vector Search and traditional Search query on an index named `products-index`. + +The query searches for a specific embedding vector generated from an ecommerce website's product description. +The Search vector is generated from the phrase `long battery life wireless earbuds`. +The `query` object specifically searches for documents that have `Electronics` as their category, with a price between `100.00` and `300.00`. +The query returns the `description`, `price`, and `product_name` fields in results. +Since the query is on a large, partitioned index and uses the `bm25` scoring algorithm, the query also uses `global_scoring` to keep document scores consistent across the Search index's partitions: + +[source,json] +---- +include::example$run-global-scoring-vector-search-payload-ui.jsonc[] +---- + +NOTE: The vector embedding has been truncated for this example. +The vector embedding in your Search query must match the configured dimension and similarity metric for your Search index. + +For more information about the `bm25` scoring algorithm, see xref:search:run-searches.adoc#scoring[Scoring for Search Queries]. + == Next Steps If you do not get the search results you were expecting, you can change the xref:search:search-request-params.adoc[JSON payload for your Search query]. From 56886807a23389b8c7bf19e3089f2b15d58cb16c Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:36:38 -0400 Subject: [PATCH 46/80] [AV-112236] Replace instances of tfidf with tf-idf (#435) --- modules/search/examples/autocomplete-search-index.jsonc | 2 +- modules/search/examples/complex-search-index-payload.jsonc | 2 +- modules/search/examples/geospatial-search-index.jsonc | 2 +- modules/search/examples/synonyms/synonym-index.json | 2 +- modules/search/pages/customize-index.adoc | 2 +- modules/search/pages/search-index-params.adoc | 2 +- modules/search/pages/search-request-params.adoc | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/modules/search/examples/autocomplete-search-index.jsonc b/modules/search/examples/autocomplete-search-index.jsonc index 2c3b6f96f..58cc66ec4 100644 --- a/modules/search/examples/autocomplete-search-index.jsonc +++ b/modules/search/examples/autocomplete-search-index.jsonc @@ -52,7 +52,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": true, - "scoring_model": "tfidf", + "scoring_model": "tf-idf", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/search/examples/complex-search-index-payload.jsonc b/modules/search/examples/complex-search-index-payload.jsonc index 58879d162..5ce49d2ea 100644 --- a/modules/search/examples/complex-search-index-payload.jsonc +++ b/modules/search/examples/complex-search-index-payload.jsonc @@ -154,7 +154,7 @@ "default_type": "_default", "docvalues_dynamic": true, "index_dynamic": true, - "scoring_model": "tfidf", + "scoring_model": "tf-idf", "store_dynamic": true, "type_field": "_type", "types": { diff --git a/modules/search/examples/geospatial-search-index.jsonc b/modules/search/examples/geospatial-search-index.jsonc index 393c1ab2c..7a1743637 100644 --- a/modules/search/examples/geospatial-search-index.jsonc +++ b/modules/search/examples/geospatial-search-index.jsonc @@ -26,7 +26,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": true, - "scoring_model": "tfidf", + "scoring_model": "tf-idf", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/search/examples/synonyms/synonym-index.json b/modules/search/examples/synonyms/synonym-index.json index 251b14a0e..c1d0d5517 100644 --- a/modules/search/examples/synonyms/synonym-index.json +++ b/modules/search/examples/synonyms/synonym-index.json @@ -35,7 +35,7 @@ "default_type": "_default", "docvalues_dynamic": false, "index_dynamic": true, - "scoring_model": "tfidf", + "scoring_model": "tf-idf", "store_dynamic": false, "type_field": "_type", "types": { diff --git a/modules/search/pages/customize-index.adoc b/modules/search/pages/customize-index.adoc index c23aaec22..d3b7741f0 100644 --- a/modules/search/pages/customize-index.adoc +++ b/modules/search/pages/customize-index.adoc @@ -48,7 +48,7 @@ Your scoring model changes the calculation the Search Service uses for scoring d The following scoring model algorithms are available: -* `tfidf`: The standard scoring model for the Search Service. +* `tf-idf`: The standard scoring model for the Search Service. A higher tf-idf score for a document places that document higher in your search results. * `bm25`: A scoring model better suited to hybrid searches with the Search Service. A hybrid Search query uses xref:vector-search:vector-search.adoc[Vector Search] together with a standard Search query. diff --git a/modules/search/pages/search-index-params.adoc b/modules/search/pages/search-index-params.adoc index 66784b0f3..b66c2e193 100644 --- a/modules/search/pages/search-index-params.adoc +++ b/modules/search/pages/search-index-params.adoc @@ -685,7 +685,7 @@ To exclude dynamic fields from the index, set `index_dynamic` to `false`. Choose the specific scoring model you want to use for scoring search results for this Search index: -* `tfidf`: The standard scoring model for the Search Service. +* `tf-idf`: The standard scoring model for the Search Service. A higher tf-idf score for a document places that document higher in your search results. * `bm25`: A scoring model better suited to hybrid searches with the Search Service. A hybrid Search query uses xref:vector-search:vector-search.adoc[Vector Search] together with a standard Search query. diff --git a/modules/search/pages/search-request-params.adoc b/modules/search/pages/search-request-params.adoc index 8769a50c6..519a40dc0 100644 --- a/modules/search/pages/search-request-params.adoc +++ b/modules/search/pages/search-request-params.adoc @@ -1986,7 +1986,7 @@ Add the `global_scoring` property with a value of `true` to ensure consistent an If you do not use `global_scoring`, result ordering can change based on your Search index's partition count. You can only use `global_scoring` if you're using the xref:run-searches.adoc#bm25[bm25 scoring algorithm]. -The setting has no effect if your `scoring_model` is set to `tfidf`. +The setting has no effect if your `scoring_model` is set to `tf-idf`. |==== From 2bbbb0fc910468fbbbd70872b4f8adab1fdc63dd Mon Sep 17 00:00:00 2001 From: Ray Offiah <77050471+RayOffiah@users.noreply.github.com> Date: Thu, 2 Oct 2025 14:34:10 +0100 Subject: [PATCH 47/80] [DOC-13535/release/8.0]: Update import guide to use updated Java SDK paths (#438) --- modules/guides/pages/import.adoc | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/guides/pages/import.adoc b/modules/guides/pages/import.adoc index 1c109c673..8aa1c5056 100644 --- a/modules/guides/pages/import.adoc +++ b/modules/guides/pages/import.adoc @@ -301,17 +301,17 @@ To parse CSV and TSV data, use the http://opencsv.sourceforge.net/[opencsv^] lib [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=csv-tsv-import,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=csv-tsv-import,indent=0] ---- [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importCSV,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importCSV,indent=0] ---- [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importTSV;!omit,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importTSV;!omit,indent=0] ---- If you are using the *Reactor API* then, as OpenCSV doesn't have a built-in converter, @@ -319,12 +319,12 @@ use the https://projectreactor.io/docs/core/release/api/reactor/core/publisher/F [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importCSV_batch;!omit,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importCSV_batch;!omit,indent=0] ---- [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importTSV_batch;!omit,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importTSV_batch;!omit,indent=0] ---- {github} @@ -411,33 +411,33 @@ To parse *JSON* data, read the file as a string, then use the built-in Couchbase [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=json-jsonl-import,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=json-jsonl-import,indent=0] ---- [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importJSON,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importJSON,indent=0] ---- If you are using the *Reactor API* then, once you've read the JSON array, use the https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#fromIterable-java.lang.Iterable-[`Flux::fromIterable`] method to convert it into streams: [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importJSON_batch;!omit,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importJSON_batch;!omit,indent=0] ---- To parse *JSONL* data: do the same, but read the file line-by-line. [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importJSONL;!omit,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importJSONL;!omit,indent=0] ---- If you are using the *Reactor API* then open the JSONL file as a stream using the https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Flux.html#using-java.util.concurrent.Callable-java.util.function.Function-java.util.function.Consumer-[`Flux::using`] method. [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=importJSONL_batch;!omit,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=importJSONL_batch;!omit,indent=0] ---- {github} @@ -519,14 +519,14 @@ Java:: -- [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=connect,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=connect,indent=0] ---- If you are using the xref:java-sdk:howtos:concurrent-async-apis.adoc#reactive-programming-with-reactor[Reactive API], then use the reactive collection instead: [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=reactiveCollection,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=reactiveCollection,indent=0] ---- {github} @@ -604,7 +604,7 @@ For the blocking API, use the method below. [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=upsertDocument,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=upsertDocument,indent=0] ---- The *Reactive API* examples above already include a call to `ReactiveCollection::upsert`. @@ -613,12 +613,12 @@ In both cases, you must provide a preprocess routine which returns a key-value t [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=JsonDocument,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=JsonDocument,indent=0] ---- [source,java] ---- -include::java-sdk:howtos:example$Import.java[tags=preprocess,indent=0] +include::java-sdk:devguide:example$java/Import.java[tags=preprocess,indent=0] ---- {github} From f28a4d6ce2e62bb150af89da9de7fcd560bb5086 Mon Sep 17 00:00:00 2001 From: Hakim Date: Tue, 23 Sep 2025 12:35:31 +0100 Subject: [PATCH 48/80] DOC-13429 SQL++ errors generation (#424) * Update SQL++ Error Codes using template blocks with metadata * Resize columns * Replace "Reason" and "User Action" titles with bold text * Add passthrough macros * Remove duplicate 5000 message * Add 9999 message by hand * Add 17xxx, 18xxx, 19xxx, and 20xxx error codes * Add "See Also" links to FINDERR() and finderr * Normalize finderr.json * Add notes for 1040 and 5500 --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: Simon Dew --- .../n1ql-error-codes.adoc | 1002 +--- modules/n1ql/partials/errors/errors-table.hbs | 28 + modules/n1ql/partials/errors/finderr.json | 5175 +++++++++++++++++ 3 files changed, 5312 insertions(+), 893 deletions(-) create mode 100644 modules/n1ql/partials/errors/errors-table.hbs create mode 100644 modules/n1ql/partials/errors/finderr.json diff --git a/modules/n1ql/pages/n1ql-language-reference/n1ql-error-codes.adoc b/modules/n1ql/pages/n1ql-language-reference/n1ql-error-codes.adoc index bd4b999cd..f0bea0cdf 100644 --- a/modules/n1ql/pages/n1ql-language-reference/n1ql-error-codes.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/n1ql-error-codes.adoc @@ -5,620 +5,94 @@ [abstract] {description} +//// +/* Use this SQL++ query to generate finderr.json */ + +WITH errors AS (ARRAY_FLATTEN((SELECT RAW finderr(".*")), 1)) +SELECT code, + description, + ARRAY CASE WHEN ISARRAY(v) THEN CONCAT2(" ", v) + ELSE v END + FOR v IN reason END AS reason, + ARRAY CASE WHEN ISARRAY(w) THEN CONCAT2(" ", w) + ELSE w END + FOR w IN user_action END AS user_action +FROM errors; +//// + == 1xx Codes (shell) These errors are related to the shell. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| *10x* -| -| *Connection Errors* - -| `100` -| `CONNECTION_REFUSED [string]` -| Connection refused. - -| `101` -| `UNSUPPORTED_PROTOCOL [string]` -| Unsupported protocol scheme. - -| `102` -| `NO_SUCH_HOST [string]` -| No such host. - -| `103` -| `NO_HOST_IN_URL [string]` -| No host in request URL. - -| `104` -| `UNKNOWN_PORT_TCP [string]` -| Unknown port. - -| `105` -| `NO_ROUTE_TO_HOST [string]` -| No route to host. - -| `106` -| `UNREACHABLE_NETWORK [string]` -| Network is unreachable. - -| `107` -| `NO_CONNECTION [string]` -| Not connected to any cluster. - -Use `\\CONNECT` command. - -| `108` -| `DRIVER_OPEN [string]` -| Driver open. - -| `109` -| `INVALID_URL [string]` -| Invalid input URL. - -| *11x* -| -| *Read/Write/Update file errors* - -| `116` -| `READ_FILE [string]` -| Error during file read. - -| `117` -| `WRITE_FILE [string]` -| Error during file write. - -| `118` -| `FILE_OPEN [string]` -| Unable to open file. - -| `119` -| `FILE_CLOSE [string]` -| Unable to close file. - -| *12x* -| -| *Authentication Errors* - -| `121` -| `INVALID_PASSWORD [string]` -| Invalid password. - -| `122` -| `INVALID_USERNAME [string]` -| Invalid username. - -| `123` -| `MISSING_CREDENTIAL [string]` -| Username missing in -credentials/-c option. - -| `124` -| `INVALID_CREDENTIAL [string]` -| Invalid format for credentials. - -Separate username and password by a `:.` - -| *13x* -| -| *Command Errors* - -| `136` -| `NO_SUCH_COMMAND [string]` -| Command does not exist. - -| `137` -| `NO_SUCH_PARAM [string]` -| Parameter does not exist. - -| `138` -| `TOO_MANY_ARGS [string]` -| Too many input arguments to command. - -| `139` -| `TOO_FEW_ARGS [string]` -| Too few input arguments to command. - -| `140` -| `STACK_EMPTY [string]` -| Stack empty. - -| `141` -| `NO_SUCH_ALIAS [string]` -| Alias does not exist. - -| `142` -| `BATCH_MODE [string]` -| Error when running in batch mode. -Incorrect input value - -| `143` -| `STRING_WRITE [string]` -| Cannot write to string buffer. - -| *17x* -| -| *Generic Errors* - -| `170` -| `OPERATION_TIMEOUT [string]` -| Operation timed out. - -Check query service URL. - -| `171` -| `ROWS_SCAN [string]` -| Error in scanning a row. - -| `172` -| `JSON_MARSHAL [string]` -| Error in marshalling the JSON data. - -| `173` -| `JSON_UNMARSHAL [string]` -| Error in unmarshalling the JSON data. - -| `174` -| `DRIVER_QUERY [string]` -| Error in the query driver. - -| `175` -| `WRITER_OUTPUT [string]` -| Error with I/O Writer. - -| `176` -| `UNBALANCED_PAREN [string]` -| Unbalanced parenthesis in the input. - -| `177` -| `ROWS_CLOSE [string]` -| Error in closing the row. - -| `178` -| `CMD_LINE_ARG [string]` -| Place input argument URL at the end, after input flags. - -| `179` -| `INVALID_INPUT_ARGUMENTS [string]` -| Input Argument format is invalid. - -| *19x* -| -| *Untracked Errors* - -| `199` -| `UNKNOWN_ERROR [string]` -| Unknown error. -|=== - -== 1xxx Codes (service) - -These errors are related to the service. - -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `1000` -| `service.io.readonly [message]` -| Service I/O is readonly. - -| `1010` -| `Unsupported http method: [method]` -| Unsupported HTTP method. - -| `1020` -| `[value] [feature] not yet implemented` -| That value or feature is not yet implemented. - -| `1030` -| `Unknown [feature] value: [value]` -| Unknown feature value. - -| `1040` -| `Error processing [feature]` -| Error processing that feature. - -For example, the Query Service REST API returns this error if you specify request parameters as form data and include an unescaped semicolon (;) in a statement. - -| `1050` -| `No [feature] value` -| Missing value for that feature. - -| `1060` -| `Multiple values for [feature]` -| Multiple values for that feature. +[template,partial$errors/finderr.json,with-metadata,from=100,to=199] +-- +include::partial$errors/errors-table.hbs[] +-- -| `1065` -| `Unrecognized parameter in request: [parameter]` -| Unrecognized parameter in that request. +== 1xxx Codes (services) -| `1070` -| `[feature] has to be of type [expected]` -| Type mismatch. +These errors are related to the services. -Another type was expected. +[template,partial$errors/finderr.json,with-metadata,from=1000,to=1999] +-- +include::partial$errors/errors-table.hbs[] +-- -| `1080` -| `Timeout [setting] exceeded` -| Timeout was exceeded. - -| `1100` -| `Invalid JSON in results` -| Invalid JSON in results. - -| `1110` -| `forbidden character (\\ or \") in client_context_id` -| Forbidden character (\ or ") in `client_context_id`. - -Remove the \ or " in `client_context_id`. - -| `1120` -| `Unsupported media type: [type]` -| Unsupported media type. - -| `1130` -| `Request [id] is not a http request` -| Request is not an HTTP request. - -| `1140` -| `Array [vec] should be of length 2` -| Array should be of length 2. - -| `1150` -| `Bad sequence number [seq]. -Expected an unsigned 64-bit integer.` -| Bad sequence number. - -Use an unsigned 64-bit integer. - -| `1150` -| `Bad UUID [uuid]. -Expected a string.` -| Bad UUID. - -Use a string value. - -| `1160` -| `Failed to decode nil value.` -| Failed to decode nil value. - -| `1170` -| `Unsupported method [method]` -| Unsupported HTTP method. -|=== +[NOTE#note-1040] +.Error 1040 +==== +The Query Service REST API returns this error if you specify request parameters as form data and include an unescaped semicolon (;) in a statement. +==== == 2xxx Codes (admin) -These codes are related to the admin. - -[cols="1,4,4"] -|=== -| ICode | Error Message | Description +These errors are related to the admin. -| `2130` -| `[Internal Caller message]` -| Admin endpoint error. - -| `2140` -| `server is not ssl enabled` -| Server is not SSL enabled. - -| `2150` -| `Not a proper creds JSON array of user/pass structures:` -| Invalid username or password. - -| `2160` -| `Completed requests qualifier already set: [InternalCaller]` -| Completed requests qualifier is already set. - -| `2170` -| `Completed requests qualifier can only be deployed once: [InternalCaller]` -| Completed requests qualifier can only be deployed once. - -| `2180` -| `Completed requests qualifier unknown: [CondString]` -| Completed requests has an invalid argument. - -| `2190` -| `Completed requests qualifier can only be deployed once: [InternalCaller]` -| Completed requests qualifier can only be deployed once. - -| `2200` -| `Completed requests qualifier unknown: [CondString]` -| Completed requests has an invalid argument. - -| `2210` -| _[port string]_ -| Bad service port. -|=== +[template,partial$errors/finderr.json,with-metadata,from=2000,to=2999] +-- +include::partial$errors/errors-table.hbs[] +-- == 3xxx Codes (parse) -These codes are related to parsing. +These errors are related to the parsing. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `3000` -| `parse.syntax_error` -| Parse syntax error. -|=== +[template,partial$errors/finderr.json,with-metadata,from=3000,to=3999] +-- +include::partial$errors/errors-table.hbs[] +-- == 4xxx Codes (plan) -These error are related to the query plan. - -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `4000` -| `plan_error` -| Plan error. - -| `4010` -| `[alias] term must have a name or alias` -| Term must have a name or alias. - -| `4020` -| `Duplicate [termType] alias [alias]` -| Duplicate alias. - -| `4025` -| `Unknown [termType] for alias [keyFor]` -| Unknown for alias. - -| `4030` -| `FROM in correlated subquery must have USE KEYS clause: FROM [keyspace]` -| FROM in correlated subquery must have USE KEYS clause. - -| `4040` -| `No such prepared statement: [name]` -| No such prepared statement. - -| `4050` -| `Unrecognizable prepared statement` -| Unrecognizable prepared statement. - -| `4060` -| `Unable to add name: [msg]` -| Unable to add prepared name. - -| `4070` -| `Unable to decode prepared statement` -| Unable to decode prepared statement. - -| `4080` -| `Encoded plan parameter does not match encoded plan of [name]` -| Encoded plan parameter does not match this encoded plan. - -| `4090` -| `Prepared name in encoded plan parameter is not [name]` -| Prepared name in encoded plan parameter is mismatched. - -| *41xx* -| -| - -| `4100` -| `No index available for join term [alias]` -| No index available for this JOIN term. - -| `4110` -| `[alias] term should not have USE KEYS` -| This should not have USE KEYS. - -| *42xx* -| -| +These errors are related to the query plan. -| `4210` -| `Expression must be a group key or aggregate: [expr]` -| This expression must be a group key or aggregate. +[template,partial$errors/finderr.json,with-metadata,from=4000,to=4999] +-- +include::partial$errors/errors-table.hbs[] +-- -| *43xx* -| -| - -| `4300` -| `The index [idx] already exists.` -| The index already exists. - -| `4310` -| `META() in query with multiple FROM terms requires an argument.` -| META() in query with multiple FROM terms requires an argument. +== 5xxx Codes (exec) -| `4320` -| `DESC option in the index keys is not supported by indexer.` -| DESC option in the index keys is not supported by indexer. +These errors are related to the execution. -| `4321` -| `Plan error: [msg]` -| Plan internal error. -|=== +[template,partial$errors/finderr.json,with-metadata,from=5000,to=5999] +-- +include::partial$errors/errors-table.hbs[] +-- -== 5000 & 9999 Codes (errors) +== 9999 Code (error) -These are general errors. +This is a general error. -[cols="1,4,4"] +[cols="1,2,3"] |=== | ICode | Error Message | Description -| `5000` -| `Internal Error` -| Internal error. - | `9999` -| `not_implemented` -| The feature is not implemented in this edition. - -|=== - -== 5xxx Codes (exec) - -These codes are related to the execution. - -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `5001` -| `execution.panic` -| Execution panic. - -| `5002` -| `execution.internal_error` -| Internal error during execution. - -| `5003` -| `Execution parameter error` -| Cannot have both USING clause and request parameters. - -| `5010` -| `execution.evaluation_error` -| Evaluation error. - -| `5015` -| `execution.explain_error` -| Explain error. - -| `5020` -| `execution.group_update_error` -| Group update error. - -| `5030` -| `execution.invalid_value_error` -| Invalid value. - -| `5035` -| `Out of range evaluating [termType]` -| Out of range. - -| `5040` -| `execution.duplicate_final_group` -| Duplicate final group. - -| `5050` -| `No INSERT key for [value]` -| No INSERT key. - -| `5060` -| `No INSERT value for [value]` -| No INSERT value. - -| `5070` -| `Cannot INSERT non-string key [key] of type [type]` -| Cannot INSERT non-string key of the type used. - -| `5072` -| `No UPSERT key for [value]` -| No UPSERT key for value used. - -| `5075` -| `No UPSERT value for [value]` -| No UPSERT value. - -| `5078` -| `Cannot UPSERT non-string key [value] of type [type]` -| Cannot UPSERT non-string key of the type used. - -| `5080` -| `DELETE alias [alias] not found in item.` -| DELETE alias not found in item. - -| `5090` -| `DELETE alias [alias] has no metadata in item.` -| DELETE alias has no metadata in item. - -| *51xx* -| -| - -| `5100` -| `UPDATE alias [alias] not found in item.` -| UPDATE alias not found in item. - -| `5110` -| `UPDATE alias [alias] has no metadata in item.` -| UPDATE alias has no metadata in item. - -| `5120` -| `Missing UPDATE clone.` -| Missing UPDATE clone. - -| `5180` -| `Invalid UNNEST position of type [type]` -| Invalid UNNEST position. - -| `5190` -| `execution.scan_vector_too_many_scanned_vectors` -| Too many scanned vectors. - -The `scan_vector` parameter should not be used for queries accessing more than one keyspace. -Use `scan_vectors` instead. - -| *52xx* -| -| - -| `5200` -| `Unable to find a value for key [key]` -| Unable to find a value for the given key. - -| `5210` -| `Unable to find user [user]` -| User not found. - -| `5220` -| `Role [role] requires a keyspace.` -| Role requires a keyspace. - -| `5230` -| `Role [role] does not take a keyspace.` -| Role does not take a keyspace. - -| `5240` -| `Keyspace [keyspace] is not valid.` -| Keyspace is not valid. - -| `5250` -| `Role [role] is not valid.` -| Role is not valid. - -| `5260` -| `User [user] already has role [role]` -| User already has this role. - -| `5270` -| `User [user] did not have role [role]` -| User did not have this role. - -| `5280` -| `User [user] has no roles. -Connecting with this user may not be possible.` -| User has no roles and may not be possible to connect with. - -| *55xx* -| -| - -| `5500` -| `Request has exceeded memory quota` -a| The query request exceeded the set Query Memory Quota. - -ifdef::flag-devex-rest-api[] -You can set a memory quota with the Couchbase Capella UI, the REST API, or the CLI. -For more information, see xref:n1ql:n1ql-manage/query-settings.adoc[]. +| Not implemented. +a| *Reason* -* To set a memory quota with the UI, see xref:server:manage:manage-settings/general-settings.adoc#query-settings[Query Settings] in the General settings for Couchbase Capella. -* To set a memory quota with the REST API, see the cluster-level xref:n1ql:n1ql-manage/query-settings.adoc#queryMemoryQuota[queryMemoryQuota] setting. -* To set a memory quota with the CLI, see xref:server:cli:cbcli/couchbase-cli-setting-query.adoc[setting-query] in the CLI Reference. -endif::flag-devex-rest-api[] +* The feature is not implemented in this edition. |=== @@ -626,351 +100,93 @@ endif::flag-devex-rest-api[] These errors are related to the Datastore authentication. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `10000` -| `Unable to authorize user.` -| Unable to authorize user. -|=== +[template,partial$errors/finderr.json,with-metadata,from=10000,to=10999] +-- +include::partial$errors/errors-table.hbs[] +-- == 11xxx Codes (ds_sys) These errors are related to the Datastore system. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `11000` -| `datastore.system.generic_error` -| System Datastore error. - -| `11001` -| `Datastore : namespace not found [msg]` -| System Datastore: Namespace not found. - -| `11002` -| `Keyspace not found [msg]` -| System Datastore: Keyspace not found. - -| `11003` -| `System datastore : Not implemented [msg]` -| System Datastore: Not implemented. - -| `11004` -| `System datastore : Not supported [msg]` -| System Datastore: Not supported. - -| `11005` -| `System datastore : Index not found [msg]` -| System Datastore: Index not found. - -| `11006` -| `System datastore : This index cannot be dropped [msg]` -| System Datastore: This index cannot be dropped. - -| `11007` -| `System datastore : Statement not found [msg]` -| System Datastore: Statement not found. - -| `11008` -| `System datastore : [op] on [keyspace] failed` -| System Datastore: Remote warning. - -| `11009` -| `System datastore : unable to retrieve user roles from server` -| System Datastore: Unable to retrieve user roles from server. - -| `11010` -| `System datastore : unable to update user information in server` -| System Datastore: Unable to update user information in server. - -| `11011` -| `One or more documents were excluded from the [keyspace] bucket because of insufficient user permissions.` -| One or more documents were excluded from the bucket because of insufficient user permissions. - -| `11012` -| `System datastore : key [key] is not of the correct format for keyspace [keyspace]` -| System datastore: A key is not of the correct format for the keyspace. -|=== +[template,partial$errors/finderr.json,with-metadata,from=11000,to=11999] +-- +include::partial$errors/errors-table.hbs[] +-- == 12xxx Codes (ds_cb) These errors are related to the Couchbase Datastore. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `12000` -| `Cannot connect [msg]` -| Cannot connect. - -| `12001` -| `Cannot parse url [msg]` -| Cannot parse URL. - -| `12002` -| `Namespace not found [msg]` -| Namespace not found. - -| `12003` -| `Keyspace not found [msg]` -| Keyspace not found. - -| `12004` -| `Primary Index not found [msg]` -| Primary index not found. - -| `12005` -| `Indexer not implemented [msg]` -| Indexer not implemented - -| `12006` -| `Failed to get keyspace count [msg]` -| Failed to get Keyspace count. - -| `12007` -| `No keys to fetch [msg]` -| No keys to fetch. - -| `12008` -| `Error performing bulk get operation [msg]` -| Error performing bulk GET operation. - -| `12009` -| `DML Error, possible causes include CAS mismatch or concurrent modification [msg]` -| DML error. - -CAS mismatch or concurrent modification. - -| `12010` -| `No keys to insert [msg]` -| No keys to insert. - -| `12011` -| `datastore.couchbase.delete_failed` -| Couchbase Datastore delete failed. - -| `12012` -| `Failed to load indexes [msg]` -| Failed to load indexes. - -| `12013` -| `This bucket type is not supported [msg]` -| This keyspace type is not supported. - -| `12014` -| `datastore.couchbase.index_state_error` -| Invalid datastore index state. - -| `12015` -| `datastore.couchbase.index_scan_timeout` -| Index scan timed out. - -| `12016` -| `Index Not Found` -| Index not found. - -| `12017` -| `Error getting random entry from keyspace [msg]` -| Error getting random entry from Keyspace. - -| `12018` -| `Unable to initialize authorization system as required` -| Unable to initialize authorization system as required. -|=== +[template,partial$errors/finderr.json,with-metadata,from=12000,to=12999] +-- +include::partial$errors/errors-table.hbs[] +-- == 13xxx Codes (ds_view) These errors are related to the Datastore view. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `13000` -| `Failed to create view [msg]` -| Failed to create view. - -| `13001` -| `View Index not found [msg]` -| View Index not found. - -| `13002` -| -| _[not used]_ - -| `13003` -| `View index exists [msg]` -| View index already exists. - -| `13004` -| `Views not allowed for WITH keyword [msg]` -| Views not allowed with keyword WITH. - -| `13005` -| `View indexes not supported [msg]` -| View indexes not supported. - -| `13006` -| `Failed to drop index [msg]` -| Failed to drop index. - -| `13007` -| `Failed to access view [msg]` -| Failed to access view. - -| `13008` -| `Failed to load indexes for keyspace [msg]` -| Failed to load indexes for keyspace. - -| `13009` -| `Unable to store the view definition.` -| Unable to store the view definition. - -Not all index target expressions are supported. -Check whether the JavaScript of the view definition is valid. -The map function has been output to `query_log`. - -| `13010` -| `No user supplied for query.` -| No user supplied for the query. - -| `13011` -| `Invalid username/password.` -| Invalid username or password. - -| `13012` -| `Error retrieving cluster [msg]` -| Error retrieving cluster. - -| `13013` -| `Unable to retrieve roles from server.` -| Unable to retrieve roles from server. - -| `13014` -| `datastore.couchbase.insufficient_credentials` -| Datastore: Insufficient credentials -|=== +[template,partial$errors/finderr.json,with-metadata,from=13000,to=13999] +-- +include::partial$errors/errors-table.hbs[] +-- == 14xxx Codes (ds_gsi) These errors are related to the Datastore Global Secondary Index. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `14000` -| `Unacceptable size for index scan: [size]` -| Unacceptable size for index scan. -|=== +[template,partial$errors/finderr.json,with-metadata,from=14000,to=14999] +-- +include::partial$errors/errors-table.hbs[] +-- == 15xxx Codes (ds_file) These errors are related to the Datastore files. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description - -| `15000` -| `Error in file datastore [msg]` -| Error in file datastore. - -| `15001` -| `Namespace not found [msg]` -| Namespace not found. - -| `15002` -| `Keyspace not found [msg]` -| Keyspace not found. - -| `15003` -| `Duplicate Namespace [msg]` -| Duplicate Namespace. - -Rename one of the Namespaces. - -| `15004` -| `Duplicate Keyspace [msg]` -| Duplicate Keyspace. - -Rename one of the Keyspaces. - -| `15005` -| `No keys to insert [msg]` -| No keys to insert. - -| `15006` -| `Key Exists [msg]` -| Key exists. - -| `15007` -| `DML Error [msg]` -| DML error. - -| `15008` -| `Keyspace path must be a directory [msg]` -| Keyspace path must be a directory. - -| `15009` -| `Index not found [msg]` -| Index not found. - -| `15010` -| `Operation not supported [msg]` -| Operation not supported. - -| `15011` -| `Primary Index cannot be dropped [msg]` -| Primary index cannot be dropped. -|=== +[template,partial$errors/finderr.json,with-metadata,from=15000,to=15999] +-- +include::partial$errors/errors-table.hbs[] +-- == 16xxx Codes (ds_other) -These error are related to other Datastore aspects. +These errors are related to other Datastore aspects. -[cols="1,4,4"] -|=== -| ICode | Error Message | Description +[template,partial$errors/finderr.json,with-metadata,from=16000,to=16999] +-- +include::partial$errors/errors-table.hbs[] +-- -| `16000` -| `datastore.other.datastore_generic_error` -| Error in Datastore. +== 17xxx Codes -| `16001` -| `datastore.other.namespace_not_found` -| Datastore Namespace not found. +[template,partial$errors/finderr.json,with-metadata,from=17000,to=17999] +-- +include::partial$errors/errors-table.hbs[] +-- -| `16002` -| `datastore.other.keyspace_not_found` -| Datastore Keyspace not found. +== 18xxx Codes -| `16003` -| `datastore.other.not_implemented` -| Not implemented. +[template,partial$errors/finderr.json,with-metadata,from=18000,to=18999] +-- +include::partial$errors/errors-table.hbs[] +-- -| `16004` -| `datastore.other.idx_not_found` -| Datastore Index not found. +== 19xxx Codes -| `16005` -| `Index Cannot be dropped [msg]` -| Index cannot be dropped. +[template,partial$errors/finderr.json,with-metadata,from=19000,to=19999] +-- +include::partial$errors/errors-table.hbs[] +-- -| `16006` -| `Not supported for this datastore [msg]` -| Not supported for this Datastore. +== 20xxx Codes -| `16007` -| `Key not found [msg]` -| Key not found. +[template,partial$errors/finderr.json,with-metadata,from=20000,to=20999] +-- +include::partial$errors/errors-table.hbs[] +-- -| `16020` -| `Inferencer not found [msg]` -| Inferencer not found. -|=== +== See Also + +* The xref:n1ql-language-reference/metafun.adoc#finderr[FINDERR()] function \ No newline at end of file diff --git a/modules/n1ql/partials/errors/errors-table.hbs b/modules/n1ql/partials/errors/errors-table.hbs new file mode 100644 index 000000000..f6e6761ce --- /dev/null +++ b/modules/n1ql/partials/errors/errors-table.hbs @@ -0,0 +1,28 @@ +[cols="1,2,3"] +|=== +| ICode | Error Message | Description + +{{#each data}} +{{#if (range code @root.from @root.to)}} +| `{{code}}` +| pass:[{{description}}] +a| +{{#with reason}} +*Reason* + +{{#each .}} +* pass:[{{.}}] +{{/each}} +{{/with}} + +{{#with user_action}} +*User Action* + +{{#each .}} +* pass:[{{.}}] +{{/each}} +{{/with}} + +{{/if}} +{{/each}} +|=== diff --git a/modules/n1ql/partials/errors/finderr.json b/modules/n1ql/partials/errors/finderr.json new file mode 100644 index 000000000..398ace03f --- /dev/null +++ b/modules/n1ql/partials/errors/finderr.json @@ -0,0 +1,5175 @@ +[{ + "code": 100, + "description": "A connection was refused.", + "reason": [ + "A connection the cbq-shell was trying to make was refused by the remote partner." + ], + "user_action": [ + "Verify the connection URL and try again." + ] + }, + { + "code": 101, + "description": "Unsupported protocol scheme «scheme»", + "reason": [ + "The protocol scheme in the cbq-shell connection URL is not supported." + ], + "user_action": [ + "Correct the URL ensuring only a supported scheme is used. Schemes: http, https, couchbase, couchbases" + ] + }, + { + "code": 102, + "description": "No such host «host»", + "reason": [ + "The noted host could not be found by the cbq-shell." + ], + "user_action": [ + "Correct the host in the connection URL and try again." + ] + }, + { + "code": 103, + "description": "No host in request URL", + "reason": [ + "The cbq-shell connection URL does not contain a host name or IP address." + ], + "user_action": [ + "Correct the the connection URL and try again." + ] + }, + { + "code": 104, + "description": "Unknown port «port»" + }, + { + "code": 105, + "description": "No route to host" + }, + { + "code": 106, + "description": "Network is unreachable." + }, + { + "code": 107, + "description": "Not connected to any cluster. Use \\CONNECT command.", + "reason": [ + "A connection in the cbq-shell has not been attempted or has failed." + ], + "user_action": [ + "Issue the connect command to connect to a server." + ] + }, + { + "code": 108, + "description": "Failed to open a connection to the server endpoint.", + "user_action": [ + "Review the details of the error reported.", + "Contact support." + ] + }, + { + "code": 109, + "description": "Invalid input URL «url»", + "reason": [ + "The URL could not be properly parsed.", + "The URL contains an invalid host.", + "The URL contains an invalid port.", + "A port number was specified with couchbase:// or couchbases:// protocol scheme in the URL." + ], + "user_action": [ + "Correct the URL and retry." + ] + }, + { + "code": 116, + "description": "Error during file read «details»", + "reason": [ + "The cbq-shell input commands file could not be read.", + "The cbq-shell command history file could not be read." + ], + "user_action": [ + "Review the details reported and take corrective action." + ] + }, + { + "code": 117, + "description": "Error during file write «details»", + "reason": [ + "The cbq-shell command history file could not be written to." + ], + "user_action": [ + "Review the details reported and take corrective action." + ] + }, + { + "code": 118, + "description": "Unable to open file «file»", + "reason": [ + "The cbq-shell input commands file could not be opened.", + "The size of the cbq-shell input stream could not be determined.", + "The the cbq-shell input stream was empty.", + "The cbq-shell command history file could not be opened." + ], + "user_action": [ + "Review the details reported and take corrective action." + ] + }, + { + "code": 119, + "description": "Unable to close file «file»" + }, + { + "code": 121, + "description": "Invalid password", + "reason": [ + "An empty password was entered at the cbq-shell password prompt.", + "A password entered at the cbq-shell prompt contains invalid characters.", + "An error occurred reading from the terminal for the cbq-shell password prompt." + ], + "user_action": [ + "Enter only a valid password at the prompt.", + "review the details reported and take corrective action." + ] + }, + { + "code": 122, + "description": "Invalid username. ", + "reason": [ + "The cbq-shell command line flags include the password but not the user name." + ], + "user_action": [ + "Pass both user and password on the cbq-shell command line." + ] + }, + { + "code": 123, + "description": "Username missing in -credentials/-c option.", + "reason": [ + "The username could not be found in the credentials cbq-shell option value." + ], + "user_action": [ + "Correct the value and retry." + ] + }, + { + "code": 124, + "description": "Invalid format for credentials. Separate username and password with a colon (':').", + "reason": [ + "The credentials cbq-shell option value was not in the correct format." + ], + "user_action": [ + "Correct the value and retry." + ] + }, + { + "code": 136, + "description": "Command does not exist.", + "reason": [ + "The command entered at the cbq-shell prompt was invalid.", + "The cbq-shell help command could not find the command specified." + ], + "user_action": [ + "Correct the command and retry." + ] + }, + { + "code": 137, + "description": "Parameter does not exist", + "reason": [ + "An attempt was made access a parameter that doesn't exist via cbq-shell commands." + ], + "user_action": [ + "Verify the parameter is correctly named and the sequence of commands means it is defined when expected." + ] + }, + { + "code": 138, + "description": "Too many input arguments to command.", + "reason": [ + "A cbq-shell command was attempted but too many arguments were supplied." + ], + "user_action": [ + "Consult the command help facility, correct the command and retry." + ] + }, + { + "code": 139, + "description": "Too few input arguments to command.", + "reason": [ + "A cbq-shell command was attempted with insufficient arguments." + ], + "user_action": [ + "Consult the command help facility, correct the command and retry." + ] + }, + { + "code": 140, + "description": "Stack empty.", + "reason": [ + "The cbq-shell value stack was empty and an attempt to pop or set a value was attempted." + ], + "user_action": [ + "Contact support." + ] + }, + { + "code": 141, + "description": "Alias does not exist «alias»", + "reason": [ + "An attempt was made to list cbq-shell command aliases and no aliases exist." + ] + }, + { + "code": 142, + "description": "Error when running in batch mode for Analytics. Incorrect input value", + "reason": [ + "The cbq-shell batch command line option was set to an invalid value." + ], + "user_action": [ + "Correct the command line option and retry." + ] + }, + { + "code": 143, + "description": "Cannot write to string buffer.", + "reason": [ + "Operating in batch mode, cbq-shell failed to write the command to the batch file." + ], + "user_action": [ + "Review the details reported and take corrective action." + ] + }, + { + "code": 170, + "description": "Operation timed out. Check query service url" + }, + { + "code": 171, + "description": "Retired." + }, + { + "code": 172, + "description": "An error occurred writing data in JSON format.", + "user_action": [ + "Contact support." + ] + }, + { + "code": 173, + "description": "An error occurred reading data in JSON format.", + "user_action": [ + "Contact support." + ] + }, + { + "code": 174, + "description": "An error occurred in the Query driver.", + "user_action": [ + "Review the reported error.", + "Contact support." + ] + }, + { + "code": 175, + "description": "Error with io Writer.", + "reason": [ + "The cbq-shell was trying to write output and encountered an error." + ], + "user_action": [ + "Review the details reported and take corrective action." + ] + }, + { + "code": 176, + "description": "Unbalanced quotes in the input.", + "reason": [ + "The cbq-shell echo contained an unequal number of double quotation marks." + ], + "user_action": [ + "Correct the command and retry." + ] + }, + { + "code": 177, + "description": "Retired." + }, + { + "code": 178, + "description": "Place input argument URL at the end, after input flags.", + "reason": [ + "The cbq-shell connection URL was not passed as the engine argument and was not the last argument." + ], + "user_action": [ + "Pass the connection URL using the engine argument flag or as the final argument on the command line." + ] + }, + { + "code": 179, + "description": "Input Argument format is invalid.", + "reason": [ + "The argument to a cbq-shell command was not a supported format.", + "The value specified for a cbq-shell predefined value was not valid." + ], + "user_action": [ + "Correct the argument or value type." + ] + }, + { + "code": 180, + "description": "Query APIs cannot be initialized from Cluster Map.", + "reason": [ + "The cbq-shell failed to obtain the cluster map from the server." + ], + "user_action": [ + "Review the connection URL is correct and still valid." + ] + }, + { + "code": 181, + "description": "Invalid argument.", + "reason": [ + "An invalid argument was supplied to the cbq-shell redirect command." + ], + "user_action": [ + "Consult the command help facility, correct the command and retry." + ] + }, + { + "code": 182, + "description": "Terminal set-up failed (check not legacy console)", + "reason": [ + "cbq-shell failed to initialise the terminal for vi emulation mode." + ], + "user_action": [ + "(Windows) Ensure cbq-shell is not being run in a legacy console window.", + "Don't use cbq-shell's vi emulation mode." + ] + }, + { + "code": 183, + "description": "Invalid protocol. Mixed protocols are not permitted in engine list.", + "reason": [ + "Multiple endpoints were listed in the cbq-shell connection URL with differing protocols." + ], + "user_action": [ + "Ensure all endpoints listed are using the same protocol." + ] + }, + { + "code": 199, + "description": "A non-specific error occurred in the cbq-shell.", + "user_action": [ + "Contact support." + ] + }, + { + "code": 1000, + "description": "The server or request is read-only and cannot accept this write statement.", + "reason": [ + "A request was submitted using the GET method and attempted a statement that modifies data.", + "A request was received with the ˝readonly˝ parameter set to true and attempted a statement that modifies data.", + "A PREPARE statement preparing a statement that modifies data was received and the ˝auto_execute˝ was set to true." + ], + "user_action": [ + "Use POST to submit write statements and ensure the ˝readonly˝ request parameter is not set or is set to false.", + "Ensure ˝auto_execute˝ is false when ˝readonly˝ is true (or when using the GET method) and preparing statements that modify data." + ] + }, + { + "code": 1010, + "description": "Unsupported http method:«METHOD»", + "reason": [ + "The service endpoint supports only GET & POST HTTP methods. All other HTTP methods are not supported." + ], + "user_action": [ + "Use a supported method to submit requests." + ] + }, + { + "code": 1020, + "description": "«feature» «value» not implemented", + "reason": [ + "The noted feature and value combination is reserved but is not implemented." + ], + "user_action": [ + "Use only supported feature and value combinations." + ] + }, + { + "code": 1030, + "description": "Unknown «parameter» value: «value»", + "reason": [ + "The value supplied for the noted parameter is unknown." + ], + "user_action": [ + "Ensure the value supplied is a supported value in the required format for the request parameter noted." + ] + }, + { + "code": 1040, + "description": "Error processing «message»", + "reason": [ + "There was an error in processing as detailed in the message. e.g. a non-numeric string value passed as the value for a request parameter that is expected to be numeric." + ], + "user_action": [ + "Where the error is derived from user controlled data, correct the data." + ] + }, + { + "code": 1050, + "description": "No «parameter» value", + "reason": [ + "A value was not supplied for the required parameter." + ], + "user_action": [ + "Provide valid values for all required parameters. e.g. ensure a user and password are supplied for all requests and a scan_vector is supplied for requests using AT_PLUS consistency level." + ] + }, + { + "code": 1060, + "description": "Multiple values for «parameters»", + "reason": [ + "Multiple values have been supplied for a parameter or two mutually exclusive parameters are both enabled." + ], + "user_action": [ + "Ensure all request parameters including named statement parameters, are unique and supplied only once.", + "Ensure mutually exclusive parameters are not simultaneously enabled." + ] + }, + { + "code": 1065, + "description": "Unrecognized parameter in request: «parameter»", + "reason": [ + "An unknown request parameter was received." + ], + "user_action": [ + "Pass only valid request parameters.", + "Check parameter names for typographical errors." + ] + }, + { + "code": 1070, + "description": "«feature» has to be of type «expected»", + "reason": [ + "The value supplied for «feature» was not of the expected type." + ], + "user_action": [ + "Correct the value and re-submit the request." + ] + }, + { + "code": 1080, + "description": "Timeout «duration» exceeded", + "reason": [ + "The specified request time-out was reached." + ], + "user_action": [ + "Check the statement is correctly constructed and using the expected plan.", + "Revise the time-out upward to accommodate the statement." + ] + }, + { + "code": 1090, + "description": "«parameter» = «value» is invalid. «message»", + "reason": [ + "The named parameter's value was invalid for the reason noted in the message." + ], + "user_action": [ + "Set the parameter to a valid value for the request." + ] + }, + { + "code": 1100, + "description": "Invalid JSON in results", + "reason": [ + "An error occurred whilst writing results to the output stream." + ], + "user_action": [ + "Please contact support." + ] + }, + { + "code": 1110, + "description": "forbidden character (\\\\ or \\\") in client_context_id", + "reason": [ + "The request parameter client_context_id contains one or more of the noted invalid characters." + ], + "user_action": [ + "Revise the value for client_context_id." + ] + }, + { + "code": 1120, + "description": "Unsupported media type: «mediaType»", + "reason": [ + "The HTTP request header field ˝Accept˝ was not set to a supported value." + ], + "user_action": [ + "Change the header field to ˝*/*˝, ˝application/json˝ or ˝application/xml˝." + ] + }, + { + "code": 1130, + "description": "Request «id» is not a http request", + "reason": [ + "The request identified by «id» does not exist." + ] + }, + { + "code": 1140, + "description": "Array «scan_entry» should be of length 2", + "reason": [ + "An invalid scan vector array element was found." + ], + "user_action": [ + "Correct the scan vector." + ] + }, + { + "code": 1150, + "description": "Bad sequence number «seqno». Expected an unsigned 64-bit integer.", + "reason": [ + "An entry in the scan vector contained a sequence number that was not an unsigned 64-bit integer." + ] + }, + { + "code": 1155, + "description": "Bad UUID «vbucket_uuid». Expected a string.", + "reason": [ + "An entry in the scan vector contained a v-bucket UUID that was not a string value." + ] + }, + { + "code": 1160, + "description": "Failed to decode nil value.", + "reason": [ + "A request requiring a body did not include one." + ], + "user_action": [ + "Resubmit a valid request." + ] + }, + { + "code": 1170, + "description": "Unsupported method «method»", + "reason": [ + "The HTTP request method noted is not supported by the endpoint." + ] + }, + { + "code": 1180, + "description": "Indicates the service on the node is in the process of shutting down.", + "reason": [ + "A topology change was in the process of removing the node." + ] + }, + { + "code": 1181, + "description": "Indicates the service on the node has been shut down and is waiting to be terminated.", + "reason": [ + "A topology change was in the process of removing the node." + ] + }, + { + "code": 1182, + "description": "Service cannot handle requests", + "reason": [ + "A ping request has determined the service was not healthy." + ], + "user_action": [ + "Examine the diagnostic logs to ascertain the reason for this state.", + "Contact support." + ] + }, + { + "code": 1191, + "description": "User has more requests running than allowed", + "reason": [ + "Currently unused." + ] + }, + { + "code": 1192, + "description": "User has exceeded request rate limit", + "reason": [ + "Currently unused." + ] + }, + { + "code": 1193, + "description": "User has exceeded input network traffic limit", + "reason": [ + "Currently unused." + ] + }, + { + "code": 1194, + "description": "User has exceeded results size limit", + "reason": [ + "Currently unused." + ] + }, + { + "code": 1195, + "description": "Request execution aborted as the number of errors raised has reached the maximum permitted.", + "reason": [ + "The number of errors raised has reached the limit." + ], + "user_action": [ + "Consult the errors to ensure the statement is operating as expected.", + "Revise the ˝error_limit˝ request parameter as necessary." + ] + }, + { + "code": 1196, + "description": "Request has been declined with «reason»", + "reason": [ + "The request breached a limit for the tenant." + ] + }, + { + "code": 1197, + "description": "Request does not have a valid tenant" + }, + { + "code": 1198, + "description": "Request is not authorized for tenant «tenant»" + }, + { + "code": 1199, + "description": "Request rejected due to limiting or throttling. «retry»", + "user_action": [ + "Retry the request in accordance with «retry»." + ] + }, + { + "code": 1200, + "description": "Tenant not found «tenant»" + }, + { + "code": 1201, + "description": "Request queue full", + "reason": [ + "The request queue has reached its limit" + ], + "user_action": [ + "Verify the server is processing requests." + ] + }, + { + "code": 1202, + "description": "Client disconnected", + "reason": [ + "The server aborts servicing a request when it detects the client has closed its connection." + ] + }, + { + "code": 1203, + "description": "Slow/stalled client write timed out", + "reason": [ + "A write to the request output stream timed out. Individual writes that make up the response must not block indefinitely, which typically occurs when the client isn't reading the response stream." + ], + "user_action": [ + "Check the application is reading response stream fast enough to avoid blocking writes." + ] + }, + { + "code": 1204, + "description": "request halted: free memory below «threshold»% of available memory", + "reason": [ + "The request was halted by admission control due to low available memory." + ] + }, + { + "code": 2000, + "description": "Error connecting to «what»", + "reason": [ + "The server encountered an error when establishing a connection to «what»." + ], + "user_action": [ + "Contact support." + ] + }, + { + "code": 2001, + "description": "Error accounting manager: «reason».", + "reason": [ + "«reason» prevented correct start-up of the service statistics monitor." + ], + "user_action": [ + "Contact support" + ] + }, + { + "code": 2010, + "description": "Invalid «component» URL: «URL»", + "reason": [ + "An invalid URL was encountered for the noted component." + ], + "user_action": [ + "Contact support." + ] + }, + { + "code": 2020, + "description": "Error in JSON decoding", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2030, + "description": "Error in JSON encoding", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2031, + "description": "Unknown setting: «setting»", + "reason": [ + "An unknown setting was supplied in a request to the settings rest endpoint." + ], + "user_action": [ + "Provide only valid settings in the request." + ] + }, + { + "code": 2032, + "description": "Incorrect value «value» for setting: «name»", + "reason": [ + "The value provided for the noted setting was not of the correct type." + ], + "user_action": [ + "Correct the value and re-submit the request." + ] + }, + { + "code": 2040, + "description": "Error retrieving cluster «message»", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2050, + "description": "Error adding cluster «message»", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2060, + "description": "Error removing cluster «message»", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2070, + "description": "Error retrieving node «message»", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2080, + "description": "No such node «message»", + "user_action": [ + "Contact support" + ] + }, + { + "code": 2090, + "description": "Error adding node «message»", + "user_action": [ + "Contact support" + ] + }, + { + "code": 2100, + "description": "Error removing node «message»", + "user_action": [ + "Contact support" + ] + }, + { + "code": 2110, + "description": "Error creating metric «message»" + }, + { + "code": 2120, + "description": "Error authorizing against cluster «message»", + "reason": [ + "Request received without suitable credentials.", + "Failure to authenticate with given credentials.", + "Authenticated user lacks required privileges." + ], + "user_action": [ + "Review the embedded «message» information for more detail on why the operation failed." + ] + }, + { + "code": 2130, + "description": "The admin endpoint encountered an error.", + "user_action": [ + "Contact support" + ] + }, + { + "code": 2140, + "description": "server is not ssl enabled", + "reason": [ + "An attempt has been made to update the SSL certificate but the server does not have SSL enabled." + ], + "user_action": [ + "Review the server configuration." + ] + }, + { + "code": 2150, + "description": "Not a proper creds JSON array of user/pass structures: «creds»" + }, + { + "code": 2160, + "description": "Completed requests qualifier already set: «qualifier»", + "user_action": [ + "Define a different qualifier or update the existing one.", + "Refer to the ˝logging qualifiers section of the documentation." + ] + }, + { + "code": 2170, + "description": "Completed requests qualifier unknown: «qualifier»", + "reason": [ + "An attempt was made to add a qualifier that is not a known." + ], + "user_action": [ + "Check the qualifier specified is valid.", + "Refer to the ˝logging qualifiers section of the documentation." + ] + }, + { + "code": 2180, + "description": "Completed requests qualifier not set: «qualifier»", + "reason": [ + "An attempt was made to access a qualifier that was not set." + ], + "user_action": [ + "Ensure the intended qualifier has been set." + ] + }, + { + "code": 2190, + "description": "Non-unique completed requests qualifier «qualifier» cannot be updated", + "reason": [ + "A attempt was made to update a qualifier that isn't unique." + ], + "user_action": [ + "Only attempt to update unique qualifiers. Non-unique qualifiers may only be added/removed." + ] + }, + { + "code": 2200, + "description": "Completed requests qualifier «qualifier» cannot accept argument «value»", + "reason": [ + "The data type of the «value» was incompatible with the qualifier." + ], + "user_action": [ + "Correct the value for the qualifier and re-submit the request." + ] + }, + { + "code": 2201, + "description": "Completed requests maximum plan size («size») is invalid." + }, + { + "code": 2210, + "description": "Invalid service port: «port»", + "user_action": [ + "Contact support." + ] + }, + { + "code": 2220, + "description": "Error getting request body", + "reason": [ + "A prepareds endpoint PUT request was received but the body was empty or could not be read." + ], + "user_action": [ + "contact support" + ] + }, + { + "code": 2230, + "description": "FFDC invocation failed.", + "reason": [ + "An error occurred with a manual First Failure Data Capture (FFDC) invocation." + ], + "user_action": [ + "Wait until the specified reported minimum time before attempting a further invocation." + ] + }, + { + "code": 2240, + "description": "Error accessing log", + "reason": [ + "A request was made to the diagnostic log endpoint and there was a error accessing the file." + ], + "user_action": [ + "Ensure the diagnostic log file being accessed exists for the duration of the request." + ] + }, + { + "code": 2500, + "description": "Failed to start workload reporting", + "reason": [ + "An error occurred when starting request capture for workload reporting." + ], + "user_action": [ + "Review the error and correct any configuration issues." + ] + }, + { + "code": 2501, + "description": "Invalid value «value» for workload setting «setting»", + "reason": [ + "The value provided for the setting is invalid." + ], + "user_action": [ + "Consult the documentation for the valid values for the workload settings. Review the configuration and correct the value." + ] + }, + { + "code": 2502, + "description": "Error processing workload configuration", + "reason": [ + "The value provided for AWR configuration is invalid." + ], + "user_action": [ + "Review the configuration and correct the value.", + "The value must be a valid object or a string encoding a valid JSON object." + ] + }, + { + "code": 2503, + "description": "Error distributing workload settings", + "reason": [ + "An error occurred distributing the workload settings to other Query nodes." + ], + "user_action": [ + "Contact support." + ] + }, + { + "code": 2504, + "description": "Warning during AWR operation.", + "reason": [ + "An AWR operation encountered a condition that needs attention." + ], + "user_action": [ + "Check the error message for recommended actions. Or consult the documentation for guidance." + ] + }, + { + "code": 3000, + "description": "Indicates a syntax error occurred during statement parsing.", + "user_action": [ + "Correct the syntax and re-submit the request. Look for incorrectly spelled keywords, use of reserved words as identifiers, incorrect or omitted punctuation and delimiters or invalid grammar.", + "If using the cbq-shell, the \\syntax command may help with grammar issues." + ] + }, + { + "code": 3005, + "description": "Details the location in the statement text of errors encountered during parsing." + }, + { + "code": 3006, + "description": "invalid escape sequence", + "reason": [ + "An invalid escape sequence was encountered whilst parsing a string value. Escape sequences are introduced with a backslash (Reverse Solidus, U+005C) and literal backslashes must be escaped." + ], + "user_action": [ + "Valid escape sequences are: \\b, \\f, \\n, \\r, \\t, \\/, \\\\, \\\", \\`, \\u#### (where #### is a Unicode symbol number in hexadecimal)." + ] + }, + { + "code": 3007, + "description": "invalid string", + "reason": [ + "An opening quotation mark defining a string was encountered without any further characters." + ], + "user_action": [ + "Correctly delimit all string values in statements." + ] + }, + { + "code": 3008, + "description": "missing closing quote", + "user_action": [ + "Contact support." + ] + }, + { + "code": 3009, + "description": "unescaped embedded quote", + "user_action": [ + "Contact support." + ] + }, + { + "code": 3080, + "description": "Ambiguous reference to field «field»", + "reason": [ + "A field reference in the statement was not fully qualified and there were multiple keyspaces it could have referred to. e.g. SELECT a FROM b, c WHERE ..." + ], + "user_action": [ + "Fully qualify references when the potential for ambiguity exists. e.g. SELECT b.a FROM b,c WHERE ... " + ] + }, + { + "code": 3081, + "description": "Duplicate variable: «identifier» already in the scope «context»", + "reason": [ + "There was a non-unique binding name in a LET or WITH clause." + ], + "user_action": [ + "Use unique names for all bindings in a statement." + ] + }, + { + "code": 3082, + "description": "Formalizer internal error: «details»", + "reason": [ + "A statement included a correlated reference that was not permitted." + ], + "user_action": [ + "If encountered with a existing prepared statement, re-prepare the statement.", + "Contact support." + ] + }, + { + "code": 3083, + "description": "Invalid input.", + "reason": [ + "Invalid input was submitted, either a statement or expression, depending on context." + ], + "user_action": [ + "Submit only valid SQL++ statements or expressions." + ] + }, + { + "code": 3100, + "description": "A semantic error is present in the statement.", + "reason": [ + "The statement includes portions that violate semantic constraints." + ], + "user_action": [ + "The cause will contain more detail on the violation; revise the statement and re-submit." + ] + }, + { + "code": 3101, + "description": "Semantic error: «what»", + "reason": [ + "An internal error occurred during semantics check for the query." + ], + "user_action": [ + "Contact support." + ] + }, + { + "code": 3110, + "description": "«op» on «alias» cannot have join hint (USE HASH or USE NL)", + "reason": [ + "Join type hints are only supported for ANSI join and nest operations." + ], + "user_action": [ + "Review the statement and revise the operation or omit the hints." + ] + }, + { + "code": 3120, + "description": "«operation» on «alias» cannot have USE KEYS.", + "reason": [ + "USE KEYS is not supported in this context." + ] + }, + { + "code": 3130, + "description": "«operation» on «alias» cannot have USE INDEX.", + "reason": [ + "USE INDEX is not supported in this context." + ] + }, + { + "code": 3150, + "description": "MERGE with ON KEY clause cannot have document key specification in INSERT action.", + "reason": [ + "A lookup merge statement specified a document key. e.g. MERGE INTO default USING [{},{}] AS source ON KEY 'aaa' WHEN NOT MATCHED THEN INSERT ('key',{})" + ], + "user_action": [ + "Refer to the documentation for lookup merge statements." + ] + }, + { + "code": 3160, + "description": "MERGE with ON clause must have document key specification in INSERT action", + "reason": [ + "An ANSI merge statement did not include the document key specification. e.g. MERGE INTO default USING [{},{}] AS source ON default.id IS VALUED WHEN NOT MATCHED THEN INSERT ({})" + ], + "user_action": [ + "Refer to the documentation for ANSI merge statements." + ] + }, + { + "code": 3170, + "description": "MERGE is missing source." + }, + { + "code": 3180, + "description": "MERGE with ON KEY clause cannot have USE INDEX hint specified on target.", + "reason": [ + "The USE INDEX hint is not supported with lookup merge statement targets. e.g. MERGE INTO default USE INDEX (ix) USING [{},{}] AS source ON KEY 'aaa' WHEN NOT MATCHED THEN INSERT ({})" + ], + "user_action": [ + "Refer to the documentation for lookup merge statements." + ] + }, + { + "code": 3190, + "description": "MERGE with ON KEY clause cannot have join hint specified on source.", + "reason": [ + "The USE INDEX hint is not supported with lookup merge statement source." + ], + "user_action": [ + "Refer to the documentation for lookup merge statements." + ] + }, + { + "code": 3200, + "description": "Cannot mix «op1» on «alias1» with «op2» on «alias2».", + "reason": [ + "Mixing ANSI and non-ANSI joins. e.g. SELECT * FROM default d1 JOIN default d2 ON d1.id = d2.id JOIN default d3 ON KEYS 'aaa'", + "Mixing ANSI and non-ANSI NEST statements." + ], + "user_action": [ + "Revise the statement to use only one type of operation." + ] + }, + { + "code": 3220, + "description": "«name» window function «clause» «reason»", + "reason": [ + "A violation of the window function semantic restrictions was present in the statement." + ], + "user_action": [ + "Revise the statement to remove the violation." + ] + }, + { + "code": 3230, + "description": "«feature» is an enterprise level feature.", + "reason": [ + "An attempt was made to use the noted feature that is only available in the Enterprise Edition of the product." + ], + "user_action": [ + "Consult the documentation for the feature you're trying to use." + ] + }, + { + "code": 3250, + "description": "Advise supports SELECT, MERGE, UPDATE and DELETE statements only.", + "reason": [ + "An attempt was made to run advise on an unsupported statement." + ], + "user_action": [ + "Refer to the documentation for ADVISE." + ] + }, + { + "code": 3255, + "description": "Advisor function is only allowed in projection clause", + "reason": [ + "An attempt was made to use the ADVISOR() function out side of a select statement's projection." + ], + "user_action": [ + "Refer to the documentation for ADVISE." + ] + }, + { + "code": 3256, + "description": "FROM clause is not allowed when Advisor function is present in projection clause.", + "reason": [ + "An attempt was made to use the advisor function on the results from a keyspace fetch." + ], + "user_action": [ + "Refer to the documentation for ADVISE." + ] + }, + { + "code": 3260, + "description": "«what» is only supported in Developer Preview Mode." + }, + { + "code": 3261, + "description": "«type» term must have USE KEYS", + "reason": [ + "A keyspace in the statement was not an explicit path and there was no USE KEYS clause." + ], + "user_action": [ + "Revise the statement to include an explicit path or a USE KEYS clause as appropriate." + ] + }, + { + "code": 3262, + "description": "«type» term should not have USE INDEX", + "reason": [ + "A keyspace in the statement was not an explicit path and there was a USE INDEX clause." + ], + "user_action": [ + "Revise the statement to include an explicit path or remove the USE INDEX clause as appropriate." + ] + }, + { + "code": 3270, + "description": "UPDATE STATISTICS (ANALYZE) supports GSI indexes only for INDEX option.", + "reason": [ + "An attempt was made to run UPDATE STATISTICS for a non-GSI index." + ], + "user_action": [ + "Do not run UPDATE STATISTICS on a non-GSI index." + ] + }, + { + "code": 3271, + "description": "INDEX ALL option for UPDATE STATISTICS (ANALYZE) can only be used for a collection.", + "reason": [ + "A statistics update was attempted using the INDEX ALL clause on a bucket." + ], + "user_action": [ + "Do not run UPDATE STATISTICS with INDEX ALL on buckets." + ] + }, + { + "code": 3272, + "description": "UPDATE STATISTICS of 'self' is not allowed", + "reason": [ + "A statistics update was attempted on an index expression including ˝self˝." + ], + "user_action": [ + "Revise the index expression to not include ˝self˝.", + "Refer to the documentation for UPDATE STATISTICS." + ] + }, + { + "code": 3280, + "description": "«index key expression» is not indexable", + "reason": [ + "An expression in the index definition was not indexable (e.g. a constant)." + ], + "user_action": [ + "Revise the definition to include only indexable expressions." + ] + }, + { + "code": 3281, + "description": "«message» «location» MISSING attribute not allowed (Only allowed with gsi leading key).", + "reason": [ + "An attempt was made to create a GSI index and INCLUDE MISSING was specified for a non-leading key.", + "An attempt was made to create a non-GSI index and INCLUDE MISSING was specified.", + "An attempt was made to create an index using FLATTEN_KEYS, and INCLUDE MISSING was specified for an argument other than the initial argument." + ] + }, + { + "code": 3282, + "description": "Attributes are not allowed on «details» «location» of flatten_keys.", + "reason": [ + "Attributes specified for FLATTEN_KEYS." + ], + "user_action": [ + "Revise the statement to remove the attributes on the FLATTEN_KEYS() expression.", + "NOTE: Arguments passed to FLATTEN_KEYS() may have attributes." + ] + }, + { + "code": 3283, + "description": "«flatten keys expression» «location» is not allowed in this context", + "reason": [ + "FLATTEN_KEYS specified outside of CREATE INDEX or UPDATE STATISTICS or was surrounded by a function." + ], + "user_action": [ + "Refer to the documentation for flatten keys." + ] + }, + { + "code": 3284, + "description": "ALL/DISTINCT is not allowed in «expression» «location»", + "reason": [ + "ALL and/or DISTINCT used in an invalid location." + ], + "user_action": [ + "Revise the statement." + ] + }, + { + "code": 3285, + "description": "Index of «expression» «location» is not allowed as a index key", + "reason": [ + "An attempt to use SELF as an index key was made." + ], + "user_action": [ + "Remove SELF from the the index definition." + ] + }, + { + "code": 3286, + "description": "PRIMARY INDEX is not allowed using FTS", + "reason": [ + "FTS was specified as the index provider for a primary index." + ] + }, + { + "code": 3290, + "description": "Join hint (USE HASH or USE NL) cannot be specified on the first from term «term»", + "reason": [ + "A join hint was specified on the first term of a join." + ], + "user_action": [ + "Revise the statement to remove the hint on the first join term." + ] + }, + { + "code": 3291, + "description": "«what» «expression» is not a valid constant, named, positional or function parameter.", + "reason": [ + "The ORDER BY direction or NULLS position was not a valid constant, named, positional or function parameter." + ], + "user_action": [ + "Revise the ORDER BY direction or NULLS position to be a valid constant, named, positional or function parameter." + ] + }, + { + "code": 3300, + "description": "recursive_with semantics: «cause»", + "reason": [ + "The statement specifies restricted syntax in a recursive common table expression definition." + ], + "user_action": [ + "Revise the statement removing the restricted syntax." + ] + }, + { + "code": 3301, + "description": "Anchor Clause cannot have recursive reference in FROM Expression : «alias»", + "reason": [ + "The statement includes a recursive common table expression that references itself in the first branch of the defining UNION. e.g. WITH RECURSIVE rcte AS (SELECT * FROM rcte UNION SELECT * FROM rcte) SELECT 1" + ], + "user_action": [ + "Correct the recursive common table expression definition." + ] + }, + { + "code": 3302, + "description": "Recursive reference «alias» must not appear more than once in the FROM clause", + "reason": [ + "The statement includes a recursive common table expression that references itself more than once in the recursive branch of the defining UNION. e.g. WITH RECURSIVE rcte AS (SELECT * FROM default UNION SELECT * FROM rcte, rcte) SELECT 1" + ], + "user_action": [ + "Revise the statement removing the duplicate reference." + ] + }, + { + "code": 3303, + "description": "Invalid config option «option»", + "reason": [ + "The statement includes a recursive common table expression with an OPTIONS clause object containing an invalid option. e.g. WITH RECURSIVE rcte AS (SELECT * FROM default UNION SELECT * FROM rcte) OPTIONS {'bad':1} SELECT 1" + ], + "user_action": [ + "Refer to the documentation for permitted options." + ] + }, + { + "code": 3304, + "description": "recursive_with_unsupported: «reason»", + "reason": [ + "A recursive common table expression was specified in a NEST clause.", + "A recursive common table expression was specified in an UNNEST clause.", + "A recursive common table expression was specified in an OUTER JOIN clause." + ], + "user_action": [ + "Revise the statement to remove the unsupported reference." + ] + }, + { + "code": 3305, + "description": "Recursive WITH «alias» limited to «limit» documents as no explicit document count limit or memory quota set", + "reason": [ + "The request without a memory quota set contained a recursive common table expression without an explicit document limit that produced more results than the implicit limit and was stopped." + ], + "user_action": [ + "Review the statement and its control of the recursion. Use a memory quota to guard against runaway recursion or specify an explicit document limit for the common table expression." + ] + }, + { + "code": 3306, + "description": "Recursive WITH «alias» stopped at «depth» level as no explicit level limit or memory quota set", + "reason": [ + "The request without a memory quota set contained a recursive common table expression without an explicit level limit exceeded the implicit limit and was stopped." + ], + "user_action": [ + "Review the statement and its control of the recursion. Use a memory quota to guard against runaway recursion or specify an explicit level limit for the common table expression." + ] + }, + { + "code": 3307, + "description": "Cycle fields validation failed for with term: «alias»", + "reason": [ + "The expression specified in the cycle clause is not an identifier or path term." + ], + "user_action": [ + "Revise statement removing or modifying the invalid cycle clause expression." + ] + }, + { + "code": 3400, + "description": "Semantic error in query with vector search function: <>.", + "reason": [ + "A vector search function cannot be used together with certain features of a query, e.g. GROUP BY clause or Window function." + ], + "user_action": [ + "Revise the statement to remove the offending features of the query." + ] + }, + { + "code": 3401, + "description": "Invalid index attributes specified for index key <> in CREATE INDEX statement.", + "reason": [ + "Cannot mix index attribute VECTOR with <> for index key <> in CREATE INDEX statement." + ], + "user_action": [ + "Revise the statement to remove the offending index attribute." + ] + }, + { + "code": 3402, + "description": "Multiple VECTOR index key specified in CREATE INDEX statement for index <>.", + "reason": [ + "Only a single index key with VECTOR attribute is supported in CREATE INDEX statement." + ], + "user_action": [ + "Revise the statement to include only a single index key with VECTOR attribute." + ] + }, + { + "code": 3403, + "description": "Multiple index keys specified in CREATE VECTOR INDEX statement for index <>.", + "reason": [ + "Only a single index key (with VECTOR attribute) is supported in CREATE VECTOR INDEX statement." + ], + "user_action": [ + "Revise the statement to include only a single index key (with VECTOR attribute)." + ] + }, + { + "code": 3404, + "description": "No index key with VECTOR attribute specified in CREATE VECTOR INDEX statement for index <>.", + "reason": [ + "An index key with VECTOR attribute must be included in CREATE VECTOR INDEX statement." + ], + "user_action": [ + "Revise the statement to include an index key with VECTOR attribute." + ] + }, + { + "code": 3405, + "description": "Vector function (<>) in ORDER BY clause must use a constant for <>{-SV-d$dxES-PJld<1}kze{p_lCo9 z;dS3}$0=#J>F0Xj_WfnWA#88@XQ zu-#fox|*yp(ssE~MUV=EkX!BP&r4b|OfB94)<+6&IU-YzOXeezVq^UQ0W#&`N>@EA z0Ab>{6{mf;I$oZ-BQ7zzzjPH?&qIY@dhQHOBYlr{jjrL&&{ge7iMcT#5i@hPA1J7E zey5G4PC~gGKUD^h`hhNH79%2E((4^cOnY4Fa2^mw^9BVLBfKFi35%q17VD zd8lC;_%&D!>bdo6-_qfTT{w-NUduW*$gwLXvrC}Rr-Y32_0E* zzE${8Wb@n{UfycC+)6I87-MbWrUYNhvkLjcm6N!ZQe#pUT+caK^DKk_NI{kf94ljW z7Z%Q8$tl=1nbP>}{8KiFlm<~(x=y<)_i_#|x%ni2oWiS`Upm!ax5#deOqH(AE~p2! z*O_Eazpehei+&n%#*d3tz&Y9x%3L(rX&dqf;+Ip2>k0{$Y5r-WnNgDM=vWJG`gL08 zD?OPrM?M}|0Nsm2k{M!8h@=f~rCHE`hv7;?4T$ymbDWvVq7)bo8lr(czw61K_T@hn zCIBOi4@e`v@Jc;vE4J-QqBLT;$=DO<{CTXthr-KAA7VRgX7hXzqEf+BgvQJr`kuyn z@DDah0e=ZcC$q3XsZ9_Q`&aOoAZdHjXuyj9l0bVcaF&I-U+O^;KyM0&H+Pn*((n)l zAyYLh2yv7vL-h&%N`IyJcy$bo9WQ@U{CwGFQ~c5q$})7T^E2yF`c8sM{`^79Euvbo7!-;~)f9;;iC0 zk#Kitz%&|uU_{C+D=Le zMU3v=%A^3`^)FBO!Zo7IAPj?S2Yj3-NUg-e3q+9X_AGp=8xtb9^MHpL)>Ms|`=xjS zZ%0Q*w;@mA-`(hbc?w5X}vdC99 zP^i5@W6L~wB(M3J4 zE@R(^n6)HT@IY~dEffV2I=cn$RJM{KMH~r-4n0%v~eYOV&6C~cLsi8rm^_>pN%-1a04Yx3!cYEb3+y*)a;r+;qbAw@PeO{l<7HWn@ zEK!wa|sScr=~t@R4Oei zymZRWHBrq#OM`m5{&kj*uU1+_|In%1h=PlADE~-*Yz2V3&-iO?J8LU}=^FBv z^p7AeNlBNiW2hbguCW%sl=>*}46uC>G=ZZI789#M`OUMlDmVG4>Q7=7{Sx`9?zj)9 zEY?uY1;f}GGI(w7W<0S!VRM`Qvx>%epiBO{s66ct5fxDU&qdU@z-uA!>l0UNi9S(C zZhu4*;Ze5Pd?@=eq?)eGHk0LM~A-k&AqA2PEobCMV&>5ua^g-A`gx zw0T_bl}yh|7Fm2L!UNQVA{-NaP=n}GidH}ob z_WJ6rw__N;IY9=nu8an6i!SRcb1D?n)5C2^kEtVd#nVc2!5|R{k>P^e$LcfFD}-*0 zDBBwW0P++~Ia;~OJ=3UIdfFNKLs)^4qtx@z7{PHLxw9?sF#-D!$wMP-W)MK;1qJH* z`aq`Jf(*o_oqSe}P<%5q8S3(KU?2}_rgpRl4MQC|m_lO; zfq;G=ASeC+YM9p9AQO6F%dh^)1{2<#Pjml8{y3RF%y*bl2>fRN+%Wp_x!gQ0Sa5%5 zz5=TS?kulTUb^WpMmauvDK3sSf7f&xQ8Y2D_`;oE3gw|d(2P!u2HpeWg?4U1ep9=- z>@N=>?cd0`|AvzBaZ|j@TI3M~%ASY^Q0sN3H<$e24n%xt4Mx6^?5uJ@=5CF1Az&tz z>2iEFTr+51&piR3ogJV%GhSim2fs4=x7J{8W%RK;m&Y;UiCwM3S7slP^fwS7*e z^9V?ikSEAshDb&5S#>&M|qv;9s zK$G0%F7|RBFT2{TLkRo<-}xy7juVj#kAL1?yib^*6=Wy-8AR7`I?O@Ky6&+&f{b;? zX~hZ1D${*F>hB@ACLJGN1YwL>Y`TB2hh||0+Ih8@*iCf}L&W_HB>#-oJ#leY;mo?K#t=g;yb93y2|N#wvvSf| z*v-_Hn3&$Z+w%o7ap(;o6L)L8@WW9@YDoXVsV=3+R$@iF`y17@xmb-PJkA>kcg*wn zL?H_RpFO_&b}$1?rL%LdSdT#R;HD-Mzh&6>a;9o0Q~%ahiYPON*Y!yO$8kmJxfKbM zS_$VrhOW(r7V>VLU2Y0-Y}^Ny^mNQida?W9u3R@~@&!QmhB@(>%lf54o0GXsc@3I# zwdF$7ADDIp-Cq|R`>aNY;EPd>=4=R>MGtAqs*@ciyie^5Pbk5OUAHZ@)cy<%3(8vi zfsswRi@yT%f}epoP8MO^L8bu&8}HlDb7TcAVuwc&5^(tOZT+xa1Yfn?5>^ z{b`uddj4#fNez3$^1VF$-HO}YOqR{4Qni$EK*uGwM{*TUwS4M&wwyZ$-avwnZ$a1E z!aRfh9W(8%nIp#o`Y;~^_^g659peO-20Y>ui3Fm=Z<4qezw8bkb7ouD7VRbS+u+70 z5r=qHw0vBviOs696gzaU?8MhlX7E!nY1g(;T5<%LX($S$T1}j~Fy@*!UvpbvQR!BE zVT@kdk)>7UnYk@rL|0y2!yA$YDr@&}q)Nv<^bSMwS&!$SgkK5{iu_S#dtkSJVz3YI z4>5DD>!4rR#lyNRi=%jLCeQOxKS;dXi#ZH__PMuzMB;yO&krs9pX_%?pL1C!BH+il zD<`z8c7SLB*KgRjV@Q$;M+Tb+YfMgG988n>nwWEv-Y-_F;Na;qgZQUjMkQX=vN_Xq5I#z0e z_-{>mF1W0g#4p14PzBRKx(#}Dv73K1&)TpsA1o<{Ua33Z63B5M(O0>u@`Vk}qn;l0 zc1M8mhZ2o9OoQ$^>OuIq_;su|X$K(<9cMt3j?FNWR@0*C&y%F)@@=)p)^ylS-yFj2pVT+@2W&Hx9>+A&t0H`&R|%(Ilz0 zAfIYdn_YG-JtdcLmxc6nWsG@@t8wjlTIPnQOR}Sj)!dLjwZ8yFFV5AcCcPSf8`#GL zyCJ;6bVhbA%5xt7_;Cz80e=qZ^8#XEu+x(lrqguYL-tF)L$cL_sR!9u``1{urd&IC z3O+zsbO6G_o*N$_(pUdp^a2Bwf&2oFe<&L;^#1gfd+)C4#8QE}$Bffm5T>G(xhk7% znwFe5xJi=#1ToT`i7FcX?aK6WaFp2b;YdzWLo6>~i0(+wONQ zU5d~lOZ{p4Z_DHTz8n#nQJ;+O z=~puEX=oBh;_*|jrnQ~V57bTE_?=SuJu$=^>P4N+Nj-^)1+Qw82j4ZF56c?w=m$zgQDifpJ`j?w^eSu8sk9@@!j8mf@=)pOsNTI zWV9@*N7U59013uJKygaVDzyEiXK=~VmX~SrX(m73eQ1b^#JCj2I4Pt*tfOhVxhbN8 zso#MyqcZx}%rpGWwwH1Aj2 z>R0XgJ2BC53H+_94A9h~3~0K3bI=56j_*^tWJ?6n1WWo~_x~X+e>&qIq`{b-=m@xf z?(Nn- zU!2hzy8}#uD38@aa}-8=B0;d-3*smKj?9CLh1}w;ldsagE5rX4gZ`5hOxG;f1`5x= zi^YE$`u&fB0fc@ZHx^hfJbmE_dEz-eF(6W*CBU&Y+Ym?7i~g6oQdB}ph=v!e-cpy^ z;msi_0r#0Im-R082dE80b@oS+#3Y}bH*(Bbwt9_@hW(*zfd@W#d>jA2WfS7z(vg4f!wobkd1jJgOOw~u){HBkIf}nFG`zs;@g>r1Q(Dk^Khxdm z^RZa&1l^|t9N`*0e+QRxzqM$x$!)CS6JpfzD}Sba3hL^iySx1Hf64n&={8PvEosK` z&^tQ|&=VrAB70&TPW2(t+p&J9!HMup^ldoShc7%3d66ffQOR$ND&J*}Gt-2e=l z&D)ym-u;n>TV5V#zmO{M$YVW*Sf*R4FwS1hNVh15RO1=5hvl z)4v6O_W1?J+kLkff0CS7Kyr|w=}A5VhNzV|n~jD0w4&v3e*xHt;;pW1{&=p{@sXtp zSw4(p?XiNM$YyV5%=nT=D!<)hS9A}2R|rgB=GzC0B)>j=Mu@UIfjEeEDaf`m+mO$3 zLdKV~a1Ixgum`M^7>|v>?KGwc#mZ7x)*liYrfs-U@X?|>R!XPR>20|HdrT)cz#h}X zPT51XrEd+AEa<5L22#M^)(IY5jTdUieb8ZS#r5gAn~s$k_4s8eX<*<+lhqME48nbI z5IT*4YM*F=GdHU16+0*Wt!o}r@g-`rmnI1~H1x?N=X2V8T1;-wpNgd2r@CG-KbWc z2AWvmmf%N2 zPG4bGh-s4=CxEiqh@B{$E3jb_4UYbmGiIG77d)phWRocWz3JjJ!%+p?z$QsLPxug3XsCzea-`udFtmpYF1qRy5t=@muzM^600t(K7p_m3Y+FvxY|c$k5jLNBhX zlTE-b`j55^?w2GdOE;cqfW3qO_rzSW<0@e>C?grdRwn2BnVA^@IjFVqiq~?!&AnjC znE+q7sI4>x^*D4Zk9|MtzjRO2o=V5y zSO7PK09BQvVA%z%4?VpdozHy0jgIh!hT;Tl<;3;16&@M4050)Uw*&)L zQ}TvGXXuIO%^nV{R&{UDYv{)JrNry&o$)8zPv06m)Bd#|lv@P)x~CKIKkNtj(E-lt ze%5zm?@MH?J^)H0&AIA4l8%U98vNw`4Ha8*e+)8>cg z$fH!jf`2rwB^&dk_%jBJ^v$CQE2`xVeAf(WVtt_Na}ji=41{LDNb$A(_O=#A1>2ec z+x=SarrPsjJ+NW2bcYEA#a>5O7gkRXhRvGO%v30^fc#H=84VBl9W|-HxG)ouw^6{O z1>QeA7vTS@Bm21v1Ysl!F#wrV*vUp>3kC!i(xzkoxy)G|grf;swl9MN#DZb8_qRz>+cxinG_! zeXRoxLb^|lH-4aukmyWplj8+y1PvMHOqsR_E~VbZ5qJ|C8>FhboiZ z@7)=^D+aNf_OJ7`gq91ro}E`$VSE72e2buh`zA*9?y_nW!BD=l=Qa%i+72uFZ4^-M zE?p61oWR3B7=5X*pdU={Lc|!ZvG=>6zSH2b{(ya?7p(!UuTQgFN}V+6yui zUaQ!;$tl;q9ey8wZ<_+CU&Jg4UR5_CH97 zymNp%*#g^b6bA=!$p|%OsPm-BU9a9AQ8cCSAM>r^)3tk#G)NLN-Cl8Hz7M%GTm{n! zi6Uf+k7>eW==|2O>4j~z`=eoVxhkVre`PD^cY_O4EQG8*Gy4|7;q=E=WRLx4`}oG_ zST-LViZGX@++x%Kr~3iLO8Tf*tj6E(<=&}Kk#Z$)nb6hO)`7oG+`ui0;a$}V@~Ks? z?UN1|2%j3N)H?HPrd;7lg`!3c)c*h;F~Djs7iYV4>IAf?{kR)37f6cV-@z%lU-BCE zYav$|E%+wPBA5_PJ!}p{DMYvz@r_%6kRlrGfL;s^yw^QhZbno(W;!~0j@j`s|JK%& zuJ0?JVFm09eT?GY_j9a%?&m;u*f5ESHiazJ%Qlp&l~*tG=#hP5qIC@#IPZD$b1Mi> zPE()gUnpof?Ps@6_u>E;_c2@5?GWb!)S>oAB*%f%YeY?^A@mrF-bHx`OYHO{%HDBT1lMi^+%<32XcQe_wED AIRF3v literal 12520 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 BpBVrE literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/grant-group.png b/modules/n1ql/assets/images/n1ql-language-reference/grant-group.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfcc9bdaf2e66c12f9d994ab2f942681156c587 GIT binary patch literal 15142 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 E0dvnkh5!Hn literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/grant-user.png b/modules/n1ql/assets/images/n1ql-language-reference/grant-user.png new file mode 100644 index 0000000000000000000000000000000000000000..7165ee0d839351dba98979b593d665088d71b23f GIT binary patch literal 15895 zcmd73byS?svNlSDK+q60!2%?Z;O-KFySohT65Jty1b2552$JA3*dQUeI|GBu;0}Y! zoq_!J-shfk?z(Gz|9rz@-ZigvcXf4D^;1uUD9TGC+b^qzm||PwPlXF3d#le3+a8j1|fK)O-vH}0`#7IU$6zLZ6_pLD>arx;-Ni8QNB&;^X z|APcNEMjxD+;?ler&dTo8C)Vo5RN3ySKH*>sH;{ zXg-i~30h-(^b807(F*=U`7KWo^OVo8+4$1<;1bR3bsiq9i|Lnhe}5@=F4_5ct-4n| zAK}Giy`8+E;tiyO)O46$!04Kq(rEHEZw?UfWgt@1@1vozcKO;DmJAmDB2q}r(R)6j z8WsJtIE~M(Jf^|yD+_BbD8FWPVSz<66&u42l7>>xx43X{TB(%;)O@sRybpRzWtwGD zS$&kB*`*C(G7i)q`TChAJYB@G)O?w#s-&MQ&)W7mnUSK&qgP0$ z+OH>j4aIn7KXPa*tvZ4dFfTMoXqa@tS3Dc*qN78uV&=-|T5f`PF4!=RBz*>Wwwv@+ zp&Q?!SznNlqZrB0?F;M(TntI}FxC-*Ef|(W|8s8=zn0N~o6=V43;cCTFYi9#lIY$j z;)GfsWU!kJx`-=dtky`|g`B8KvorleUR)1#J4f-5eEz`xbh6|L88X~86XkOHDkgu; zySv)Tq_Ex!mVaD5Q_4tnu4p@t9wi=WF6QU!e=1IIB!zn~51wyrW7*#p4IdDsoYclZ z>}1?nFvurSuC*YDmJsitW@`RZtm1_oCd>E3D=ifVnTHpby0Yq@PRsf_PUM|D=~Z(T;!)Xr#&g8shN|J|*) zZaHxr3o!k^FAYX~4C4^rMUSJVs+|wq;ht%* zVe{JvTWVyXZAh3v5lhj$t8z0b@-z#4vVrjwjl-4NEtjEBecEdd+?MD(%IChEl}L4I zJ|OCE^p}-ieuYT)lAKFTo&VQ3EZuw?q!|w5y^! zBG0X#ZPhSiiI-^GS;^?=QmX?(~F-U(>u@{Ol`ZcErd-gm6763Jt3>KG&hNg znyd$W|CNlB@k!%lNiYLc(e7(CCE3V4VG{OnWw&D-^mVUHVj8`WR%DS}(frB32FvlN zTlW{bkpC*v-j)?K3^+-?rrxY?&E0W zoMRmK5L**`U6PSS=iQKz#=djC(LSM{Ok8#NdcxkTXg*TKaxyZ6h_gE#?_0i7yS|fL zX+pk};lv_qSfBM+W{ykF8}31wadsN5$O?X~Le1u#a$i2QYGcYkIo9Ut-CS;?k`TBZ zv5RCUDenp|iRddK?#F4xv8L;SINJ2mwqMvr-HV*XCic9}wwHbIz()D-^C4K>wyUV5 zh&9E9dX!ZrI#Wwq;}H~gfTgJ;Jdv0~T!^<-BQWug09R=g44J0~muzR02zHjT*}h2p zfIpX|_snN0GSqnK7O1Y7Nc$V$V|ZOXeX;ZQen1dYXrdedZeVcIGz}6r8p~f}y?gP- zrSP*V%a>GV&F)z0342QTFdW|x8_jBI<;we>aV|`Uz)o{^-vTCa~e@**9PM|}MtkrdkD(z)yu$nj3O|$s;vSlJO;(;k9 z{jrPz8CiZoY;?|zrW*=q&OTryJrHZZ^GxaU`iqqaM$*QYjnzfjFGGH|2SYN#Tw-{jBOQHEbezvk3#d;;3Im8LB*c*U?eP z+ZR3;#zC)!Fx?gQGZFG~&#BbEg_1pLTi-M4Qc-Pt_gh$Oc%WWD>!&-TT+tV(wV&z( z4TpIdn)Jgy(P1!>c~+Q zSS5C^cziFB=NVCuN*m}trAz?AvaCDT5@#Un2oYxp;&5+N{vQ7Kb6sSb{bI9ft=9wd zdy_YsS55veLf(l99EQ>AIUUjA=`d&tk%O%i+}1w$0l@v;C_RAb+8lbwL?Q({(XZlu zC+CNF5_UuV`b~&mkU$@j3#X=5Z=r8DkF=4Iv3wdo@n$1myr9@d-uha#xR-Q zfR+#UUpFy<>D@21Q0(dtq_IWR?WT?)S$`^D1Tthz^)&=WBtwTH>UgGcwz$ekr|tNv zlTKtX($;EVc}+z+P43VNF2T?=gkzga<|1MoI4L&=__A~@ju-%DymS=u_k*jx%e2NV z{kixVhf&@!UgVjm1lEB{3Q#c&|I=NTX(o;u0y)fXu^9o}fn)a@ct_(V&mR zt%cm3`5*5tEPFRtAv5sypuzS7R}lR%N**j0#F#EioA~uaESjgeMl-ixy!_;_YQhz+ zpf;V=(~%65z9EK{9_=&)10+Jf;%3QmJQyA8f{yL!nvpXM+9=uNFV5CWJ{kj?+>=nO zpqhsLM;669!LYQ+NZT4xowDoat!78kvJ7Z1$p{vPkcI3_Bs`WG0~a4%errylPIK!+ zx78|U(yt>lLGA~xdQ`3cyXCRFmZ4CMS{JLm#UW(!kw&@xV1JT~r*Zx4Q)5=Ro)y{v z{ziX6+GrDatNs6OwcxJR9;Oo2D{T<3a|_CoF~2(Z5W^y#ymw8in4wQwZ4J-E!g>`I z6|EZC3Jk&@+ElKx!rL~nhg}XWK2%j#bBb^v!!jckGgBvP+LD<^DCZ<4>vwrpT@J9&xkUHidP*uiIw_Q{W(tKHQvu{>f+ap z3mDiIbYL({DevfOMvG&TFx-78S@=?MD}j%$N?F15Gp=Z=NB%>%(3Mtsl-L62w9 zuATtP@+xC8bDqexwf^Nta@Xx{a0kGzp4>Ccm0IAYhwO(rS!6qfzW@dN(p*v9mn1Hq>Aj)SJ7-?f8{KR2br^58F&l7sji8-Eu=BT3139pr%U_va2&H=!j{u~;^H zk-up1B@SuJtd%1%_^tdvMK3|}Wnp3DNe@g-u~5x95&@>)0#vV#0>8jHQC7dRbn z#yRN5r{sP+NeT#V%oZ2}5>MFkPHh5NJ~}ydR43S%k?Op+F^ZX3bmT48;jymq+oSu_ zk8LN`U2atca~hura$IJWwt0W^!UYe|fRhJYyOY;Dy7-x^bSrkFY}5pyOcI2|a#ceO zxYu&^w1-Ie=#jD-I3=h3<4khmgbz%%nqEE?A}6HROAPcdl2I&?HT~`E@^k8se&u;t z^`H3CZn}cD(D9UHE)dv~*g)6;Khw*JDY1dKV0gK)9{6E*fVj$GO6B;Ej+Yp!T?FPW zvB&qYUtD1E3eC_uBkSX%2aSf4jo2IgYB7RW&X{&hH>^aiZ;bt)=@Ege=>_7~rdKf;sxOAjn zmWbFNoK|55&AS?mCUWD2oYr9Pw~*F^i)PIwjoo7MTytz0DeCKov;@>ICrY(0?ymZu zwFR6VreShNyWo9)E!ZCFE)97ai)I7azU!HI9oI%8iLjlL4N??yH z4sBBJ?3$d%+|0^ugGe2RMzQ9;?EJ;IcbKFLVYf{~w?%0tvG&AC7vFvs8)%F_9?Rd` z`-&vQRZPP+^3jS3T0mh7oZS<;iTUc{2c7Igu?p_AQfo0f*eNqrL=|V(nbfU+sbWU| z`LTYBEWUp-d*2c?7Mrq=wsX*}xF*Y2G@_Lg)FanMzK1@-5@52fwT9PJTE{xQ{rYjCko5=QW4>*!udGF2xtRL*%fJ$51o{F%X z)(w`;Mt?b>r1w4BuwvlmoOv5ZtUe;5;2oYL5#~@c$qcFjXfV8zerFlPVt=Edc`yp7 zbzI5aKXmLYc4PRkQJy*|OeRFznr)-u+f>YaK7jo8xvl)gCMd%FX8yKyzc;|4U+s|? zQlyxXGQm=t_)Iv;O<3=f(?84Dv!9N`N%(L2Mk*P%YUXc4`1bsW0l@}(y2{ia|6zr3638Pi7(q-_Y#U642-J zxMiNz^$PnyEEX&CDxs*s+C}C^@l0d5-<7wz`N2ntn;Y@Mim~5IolvlCHBM%3( z6?DdxD!&%FyHuWe)_nSW|Jc8og??<_OmHmO{fefFYXl#k4h6aOm0eQG@#NG6kuq1V z&Tgtx>D3liv4jNOR*snVUgxgRd|;G9e<%&ZGOFOU73rKeY*&2m5^zRcOt`YUp<#K- zgue4my-KIt-jDi&r%QELgFL>@)`q}vdx41Lj@08((Z)z8WfpecmL_#YiO31>mE96g zTd;PHCnF?*fAw5)_dq-f;AiT^uzic;@pzCv*z~#twp2Jzaj8fq=yPjWuC!7FTepPq zAKKQ|)mxNG&18MeYBv^X^)!OS$7mywJcm4b^9Bl8_Pb&Sc+KwCvdcER#82?iqP$qx zJjUGckDALYj_A!C>9Tz~c?H(j6=KB09(Wmb7%FXx{Rdyf)3PxkqYK)4r{dh}x#vl2KJ_D;tsgsPyQ(}E_kNeS7x^=X`5S<1-Gx^+gS%*I)1L~s?8KAq zmA&bsLM`WMM1EcwH7w^1BzxK#TrbmsO~%P9sWq})P-G-*xWkbLRk=2K z#+xkm&QO{F86jWdpI_~JC5j25D)|y@bl}Rk7oY8EXGrk{O5Ko##el9iyE1Y80DExj z0^6K>I$v^j6o2|ABw;m6=hUcmwRwx&i9m-LYMMYmH#mk19W5(@5aYkrt_auuKsT7` zs!9QgnL%D#^)xEgG~8iHE^d&&rggvGXbNU08TS-mI`JPpQEVn`ykt8G{#5JKO37d$ z?U+=9;hR(H^?lg7w5h_Zv^S$BVj`0-6+rKA7LS_H_)*HBKX5A!dpY=)Ek)D z<7E~uHoqVve_3-o%z+dXg=eu`%BcMrU+CtmuTQ;IP`+v?lR?hpArn1+-p-p^RsOkX ze$ls5Uxu5jX$-p8{KkalD1K{fF(mYs$;y_>Hw)@*wwi&eX&}c+EIU{J%Cc!Nvz(1n z)XgEI`LM{b$ic=Y{^3CM&|gEawqMv^+Y|B|I$lDUrpVOVds!}-{S@sRe!O)*_uk{n zSVZ?OEYQ+gI2D1SXr-+Fgz)VI5Gr3WoD<~Ek~HTuJ#j!K@~rw4jF#e zwc?zEZ6TUz8;{J~Ak)ZPS13m=X?MNu8_o&eD=OkqyMmu3?ce4AZa~M}Apa(TGz-M074L*?O41gvYpnS2Kj}vn~7_+*I zqtx;gSTUQCJzMWpYjLEisr$sp`q{^d6K{or zowypBS)P%$>|_zLCuB9{$?)h$Z3^Ht(`go*K|bzbe z%`^UU$h`YThP!NLrJOYt)sssw`KSx)6o{N;EEHe6cB7u+>?~sn!qTnKuwPeAfj_eK zyy`iz3^~1?-Yu^OYIk);NW=%|QWRy?H|nU|BC6@Y85pBm&AcC&!)UpP1V4d8pdTMU z0pc*|Vk^AMN-j{uMB8rc$U88=(KyONX+hS{1UG+GftZ*b5?RH=t8%fRPN<#ZREOZj zmD>vbSi^(`JB3mIK%VXUP-y(9-|`N*lAd1Wfs(Rz2`S-bun8z}N2l6pYR(jtv;*+P zPPZRor>QGGx=K&Ic*8XAHh(niE@tyq-)|70y%6tpJm4ZF=yi2NwN(Jd^x`xPZqUZy zYdh84w|ux#msu0+QR$UajG7T9)}?z1#<7itT!Jhc6U`4VRD5u7HNNTfKugRqh(=0R z!yD<^rGbl~}O?lH&iebbWTe)dzLN^dNatmG{%L+h1!{(}JPIW{Xz^5Xo1UA_{lvCH!f z4eNtajb`B}KW9lMTU(((Hsl-7HHH2^~K?r{6#3wad4`455{ z&r{Sf`GUfuRXVpY&Qppf7?(7Ta-L|NRUdp1K43XU-|&CB zjKXDkPRLY?9mRkBl#%p=2vT)8l;@O{e3Be(ijFCsawdN%`K4=g7fT3yB=^RRn8>&8 zd-q-(2xWz!E-Q+Tf5zt43d4}=Mq9|P81w>DM-WtC*)>Ra`LRj!DQJA}gb#O0$8lY< z$@N9DdU2{R>c`1oEp@HT!);9mHs!ui?n*yFIU5O9=7|h<@W5d4aKcN?W~NAf{fhdY zV5}WtfVoDdo^PvdsnJ@8m^P8Ei8dzQyw>ah0p%df+bO0q zC)zefApNiwc=Rh=e(hFUXXF=2nDh*bxdHjH{RX;huRgX1J$1@_ivN5p)6H)NxT%yL ziZ`*(9n|9dGcZQB0^=B5mF-mR$<%VHD(AH22e#mJyJFy8gt+?Ta17=Hi zHEM$Ngb_%&#o%gvUm{1fu~Rib#^*N11-vyH*uOf_F`dg>x?U^dS9UoXrUfDm3B@#W zajeU!qMF#lT>&x@>l1A2^18qU6yj{cAg5JjJe;{xN1E1nt-Wv=RRq%45u3DuZs;bv z)b@QBnk*2I*b;|sd>2=DxinKP*LdK`E6oSTWWC-@m)i`&L+t)pUxtHgi3z>ZVoIBf zJJ_82WYDY_0h=c@f9;-sR_U~x3o)OWP(pxlQ{~mbohiHN^1A6#xDoEE-vX+A>0fyS zEiHybYuRp~=js$z^*#S#o;cz2@KAyot1NT6#x@1wz-$*e1Q$p5K;3w?Imo6HzV%N$ zgIl8#usRMW*Y4XeSBK#jf2c-C4sm^4g^xq{Xd}BZr6!y}G=oTrB;Vn%VO)la)pVs^ zwJ|ynQ0a$|m~|m)nlb_)&0UnjFAqV+f>}2G#nk(m)G)qNld4x_#tFbhXHPk8+iBBm z;%3OEJ+{$9>vGu2WXr`Xy%3M-;n7;GfgEF`VnkCaAbx`AWQa`-Y2|gSUZ9+%MA1Rb z$l>NCS#ph<&uQV~$t{-jL!x9I@~N>}io!GTE5C?eoufs8CcOv*ugi5B0iL4dCuV+5 zcK0SDuo>~W7U_{#Z2rLm-+M+Kmt_U^_(*Ko~Wiu#R4Q!0y&j4vg)v}j&v|Z zV`{Y!iM7l=DHrRtlB^#4cV9#T<+`IkDWJfVD#H^x@Y8Z4*V`BDl5!cMJ}dnP-aaAN zi|Lo2T%;3L^LNmklfDXCkN+1ayJ)xV^?yRyhgOddU$el~5R#3H&sW9t&DaNbnxCBTY-p;%(+yn{U3zP9 ztUZt3o3W2Nz)ZyP=3h`a^J7;xW}a4Rcusr@&x2L5?IHj@Ujd`y{M!`s$2s3oAv_wf zb8h;_U{;&w@OwBSrm(bP%rj`rtzo+Tp4?P<7?AF_or^fI7a7o!UAxIb~M@dO( z#gc^b$0k3p^DpE*o`o@{>gW*&hrCC#RCdNuZ8n_@Ctq86SUK4UKaXjD3*1R&d|!9+ zh<6SNiPQ+e1t5Ib$5H$@E9|Nzzbx(=&vkh5s}%}=c;o(I{Qh!eDbYlwXQ0gf$5?0uT0l1%gcrv9cASCfs2msgaEV zK|Ke%NpQrLhCH|P7tZ7y=`6_8Xd>PYayfTR`(mqRHT{q)@c6XdsnTn?MlPuQH9v6J zY3F+OV}BQtED3m{A*tA|P8Gi?^s7_q8UKuQ+uENpDHASY*rYlLxh^zU*d#8(Jv`fp z7=6jVJ+XFKD&;bjVLr4tpgH@f>L5Gz*F`6`Ns?t$Ay8t$%p}2ZJ6uRfQTJ=f=git4 zIiQnNThQT9c?O7pGmb5CT%nKxju7vhz_Y$54gB3S@4xiL8mmFB6PnE_E+vsyXI_l8 zZRWvj>UAo-t%Ra9Q^Hx%37?oHLwM*L;A!mE zCn%~p+VE9^WX#_zicvpUSMVjTp4{G2VunPFhT_yZaMW%+yqyV)d%4Qf8TKd7UcyrN zq$JyHXXrvD5UPIVJ1iMm}8~zU6l>*yYgj#A#kh!A)v=nN%Bt z7bS04pul_jh_IRU$j%FjMwTjgo}Y5R?*(4?-Z!IvZ)bFjn(Ug(+5Y$m1h-W^FS_0e z=9KjDbYDI~He8>Ws=NV~hloKGCCHMdm~HaR6Bk!eYOFdx_2?bkG?ln7&5<#vud1~F zqG_b5Cvrg@#zKCO7lJ{u_Ik4tBekCe8!m#G3YzRuZawU0GVT2H0ZV2@4S_%8+h4QX z6i7vp{cKr(ZnbKSLx-7{_sc5apriE2cE>+rKCW>EP%T0$kzQMphKp4Tbia{Fz^ z@)j2gxcQ``kZ%bpq2P>sQSHD3-BVZpsXY|0?^nU(>0<5D()(%xpU}k?JeF$RY8IS5 z$t3NTR?xeg1`5iAr#E#@L?3UhKX5GA`;+?HN%;Gk_oHO~6Xnd`D!SUaFm5dDLJxkb ztz_4&(fZYuOu&SxaTgL`hQB0-QxXm%wVTi9Q}N|D46_T&!q#UN`@m=0FV{cM3z7y( ztnN)jBKw#b(*I$E3Fm)8pH5)h%J*{5LEcm)w#DhXW_}?(Fy#1*TU*zUgrq7 zmDz5UplzF>?a02vaIrxKzL?-y;_VQOMDk`{RQuaPp+hvQ57{%hdTt(6mWLb}Ro}~M zr9pyu-n%Qab9=$3y^FHDDG)W{muOg4Ujt&mJXhww%cMj_MO_t6*gc)OFZX`d9Jo$A zVP(4ETd|gn8aW; zI9xyce6l-t|1M+Qm3Q`++|X;PL!6?=l}hylq$zo4{wv-glF>Rqipu(m9utk;ghVa> z*M@)u(fSfmw887Ks#rXu)ZI?_WS>cs9ekW?dd~Aq{XH5hGg+Y z3gCw3Z?9izn^gW2M?pLn;)R_&TJ^P&W6;V*^?ex=?lSE*@Bnz(J{LNED!^=Cc(JST zv4P{BK5v=&>Fr<1Aad!JsEh>Kp>a@g!3KvgIe`rYOnqdp|ELiA=H{Oj*>gdpe z8zLdvX958Y!?`(0YW>z)VjRy^!f=3mgjL;Gq0l_yK>^w`5LV|IMe(DH*{SZq0`MiBx&f^b>_dSZMLjS& zc4Jw2N4tc#@GaZI+(jo%nZ@3c(xk`ZS_xUV-G_;LF_ef8J@vU4LQA?BMZw#inFwCO zmTWS8M`z1pv8$u13N4tj8eZtR)n8`9_KL}?`>F8)nmhC^iY1EoF55Z7T{VKxhB(|^ z{paxian9>^SUoO6L@NIaeNNHFmgmY_w@_d<1O3`ZkBf%NTB#+l8B(T9*%88B$^fHXmB9cdinWw@Emr5(Tq(`OOdk0c-O-i;jQC#-7_xu{9l7=qL4 zSUcIRg_6+j=i9Uns*lPHZi6eUe_#+Yw~25h@s!eBZJ6QNZ^3oH^3lR;UB|m6*Jbwe zeXPDPxsx2zU$R{geQ)%xt(7?5%DQZ_cll^sR@jyI{pii!{pLKFCxYMGT&sLwy|Wo@ z`hrN2yrQv;rcfN1Ba{MC&=f^Df4e;*cv?}n~%)TuoISNnc~WQ6a=NC)TqiD`Rd(ZZAI^9 zt4W?H@{mEX+UeHlP^!G zs^KZ>o*A&NpT=X>EBuW72*L!_aUtJVAXzWnVgVFBszMB7^Q(}DI5+iAJeOi4cOll* zJ3S(uuDjZkvIE@eLdAg%jp@K?kve?H(c$Y%BpgCEmGz}I^FaUCCvQJD~&W-)H3K#-&w z{xvI|JIiclAL$s|&ZlP!4;dzqU*V>D$(PA7rFc>?ci82s>*2wtJ26iv!U${m6wTRR zQ8Wu`1p?VJV}(b57+5*`n<`-4*`#c%PC{}pm|0A9q#KT%Op1Gcy?gU_p7TRQ9|tUz^KVo*veH^CG0 zc%!`=qlUA2ckk=fg$wYUyNg7_mBoI@>3@&7aw9-$@=bY*tdSQEDi0i=}9JXp1`?+%@}`Uubn!>10iC(41aXFcOPAIa^wFAO#A0nhDbjUJ8;<@jxT; zHa1Em*09W*I?TcEv9C@xnE6@#YFz2p+0cz~Tz_KoBG(#cpe73^xm$teps%h^!>-+7 z*FIgmj)pWF5;VzN-`MUqku5Gc)7IbjZs%m)_k32yOH^IV2Tnnpz>%BZW=rN1!-Di7 zU&|?x0-aCA+a0JVImt#cK{q{E5qUIBey`o)z&}C9!`%e@qu4AC$db}b?M3DoXD;2$ zqG6YAf;eB5l7Q{s1Z@>5G4cg4VZPj0s#4Xd?ZInl z9yIUi^Uc+7<(c0OcTX^8P?azo0bdJwc7CQeODx9(&-`+Z-8IQSbF6vcNz~ClhpU!Dn@hM!#kbuf#%41)f3JR0FsLS`cD&Y*$Rjrm1?f*br( zqu;t&g7xMKC_G|ZJbYx&)4d~d;}g|#z7?#-N}Er=@uR+jNe5=v5h0oSdwB4cPBjTc zgl;l%jVbzMk+>~q(};^EI*VfY7D8GZ!EnRKawk|VWn%lJ&4%n{th#MDXlHAed2iP9 zst%nQ`*?L%qkGAKYZkK>Pqo)6&+few81AXLBwj{xuT+%YL2db!)1nm2i1)?FNg?laDnZPaM&(pjv6KDQ~>q8N6c0RUlp6)+0cql21blz=)OTjzEx!gGdb(=QRx}Z@**f_##aUJk1-C# zlOpvwfh4B*h7~U;d5f_7oXo`Kmh|ak~85W~)O{Ekga5jiQA<>>3$| zsnC9KO4Lkzi^FQH_AN|axI{B{T6Ac}(mD&C6+y&xB^cWQH*k)7*sud-naguanxR#K z4`O-Ad-NH0GB!s+W5!jqf@?WA%f;o192m1rKqcH zY4FTdsLEk5(AcM9}>P-<}xS&gfVC%Nwd1@rp0b+?VW@7jt9hyxAGU$ZX4ae_35y^%YyDI*-u7bg%#R| zFBAVuU4<%qr--Pl&^p{RN7Pkh{8LwPzvs(m`Ej2%X8B$!sWcz*7N}|e!5jSAqzEZ| z73epPg*X;*9J3g(1D_>QtgrcLRG034Wz;n7ej=}45 zq(|CtNC*yWW%K9nhIU>grgD*0BKF+sA}1D`qC=``eZlg-=`aKGa!GoMhx}KgZ<=bo zzh&vg=g@O$`Bspadh|Hno5>(^)&2jWX2Mk?69_$1x2^lP(uAb>7Wb4F@Z8${SbY1z z)7^Nx3<*RJh8%8d=rr|5cHS9owV@Q|7idkh@sVhivI_a>U`v>2AhWx*+vQOTl&2t82^kJR=|BjOThzR*)UL z1cpRWqk(lVkl}7)!@~+s(X8_5t4RNcmCjm{^n?Y+~4*8uuv_LDNd zUMW9t-GxkFCE?zyOvQ6Pqlo5&M2-2=-wnl^Ai$e%KRZA67_-~^n5Zm&`?*AXaLe(F zOri42U?ian4P0U%LfojqR)4wrQa{P_w^vE*`QIO1vG}UK@_gcvBO_5NUdm8dAZ}#E zlI^-?q-Ro%nwA?uLmiOk&l2hn!i1NPZQR?mmj9N4nfvkdzoH75GO(HZngbH?aMa-c zR_{P7bXV{2MfMy*uJ&7P=F}gzB-n6>-+p@vfd&LU*Q?y}T7qv70heBj%Le|GHy)YC z%1mlv-`yJ`h@$RN9o_Hm*W+5w3B4mcS20pXvMY`l=U*)0UQGWLU-+NSRiHE!@F84t z?vO!2brZ($Q^mVIW^hrwVXrwS-<~0r*;Kpv@4rEj^vM9k6Z>9c;Ke71yac?+3h{k^ z&>~F`GhmUHNnpA=s};7K1NsxuZs3dH)@!%inY2jyy<|d21yNt=4Elp5>ieAyiIx@c zsel&7YQDyh1aj>CKG!gW*+fy6Xdt!>3E3FWfcRcf?Iu;rq?JCR8(azvTgX){8>r3L zjToA$%(-a+Y{8evgz`$YSWi2@%u`&qa-nlag7%Yqxk{k>qFNbqI}dplB2EFa6){o{oD zV;AdEx#d;`u))%oUIhCVPQv{NCe>&GcNS`)J1g2FP<0q>ASbL*S}uP@HAm@7r@__w zk4`GSrH?B%6r%+OFTOq zHq9d#o|=t}Prg#dt7{Oa6_bG6f(lWCncku`J%8%^tE-#P+c8>ul;@p@`Raxz@0KTP z`^YuY3wDJ+nRmW~mgV3~!NUFr9j!VRTA=U@BilxKC5+{VowWUpwb*Wmj7W2n9*dPb z`OZxQ7<1Up@5UD8>RNkoqm$YSL5B=c^Ak1ht#;S-lS@9C^wV#syzxn7#~;c+6(!8U zq5#r7lEbB7fxC{O^~Xo)U*}#qTM18p*4Mo4)dCbUH zv-Ymh&vhu-_2_Ou>gFSn0$)&h`gdwK-DCpIF$E*8a_z-i&+L`rjYh6?<}Kp$i0hc zwO*Tl$!8o3Jg5q%3ZBZ)zD=Lu(06D+^9f*TDdOwQ)|=++VtU&$o^xruoXEW$ELfi8 zx!3eaQi{(;!<0%SuU3oVp;;LbYsN8Zq}1=3Vm~VRxlP#mcX%PAz6Pa!y2s(=)SWlQ z+8dt2-QT_{Js1dT{xd%Q!dI|(Gi$n>4M&0h^hG_2%lnh>-o;!_V`WW48+Z-po3ri< z!`M}oW6)hE4MG|O|K>!Moz;{Qn<(>73U9 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/grant.png b/modules/n1ql/assets/images/n1ql-language-reference/grant.png index 5a1b680e8286c712eae588eceb33ee9002ca134e..146e850fdf2a39119e53c878cbf24dc2910112af 100644 GIT binary patch delta 3849 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 F{Xf3dVzK}L literal 8910 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 HV-olu^9r8T diff --git a/modules/n1ql/assets/images/n1ql-language-reference/rbac-role.png b/modules/n1ql/assets/images/n1ql-language-reference/rbac-role.png new file mode 100644 index 0000000000000000000000000000000000000000..007e740dd9da3ff06ddeb6575e96e88cda48026b GIT binary patch literal 4984 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/revoke-user.png b/modules/n1ql/assets/images/n1ql-language-reference/revoke-user.png new file mode 100644 index 0000000000000000000000000000000000000000..fe50f7e4aa56424feb597cc3507eb9b3e24ddc66 GIT binary patch literal 16474 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 GnEwNUTV479 literal 9440 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 Y%vT@j^$(BFbww~T5{lv#qM!Z#9|NhMS^xk5 diff --git a/modules/n1ql/pages/n1ql-language-reference/alterbucket.adoc b/modules/n1ql/pages/n1ql-language-reference/alterbucket.adoc new file mode 100644 index 000000000..6f5aae4c7 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/alterbucket.adoc @@ -0,0 +1,77 @@ += ALTER BUCKET +:description: The ALTER BUCKET statement enables you to update an existing bucket's configuration. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +:identifier: xref:n1ql-language-reference/identifiers.adoc +:roles: xref:learn:security/roles.adoc +:bucket-parameters: xref:rest-api:rest-bucket-create.adoc#parameter-groups +:buckets: xref:learn:buckets-memory-and-storage/buckets.adoc +:manage-buckets: xref:manage:manage-buckets/bucket-management-overview.adoc +:buckets-api: xref:rest-api:rest-bucket-intro.adoc +:couchbase-cli-bucket-edit: xref:cli:cbcli/couchbase-cli-bucket-edit.adoc + +[abstract] +{description} + +== Purpose + +Use the ALTER BUCKET statement to modify the configuration of a bucket in your Couchbase cluster. +You can update only a limited set of bucket settings. +You cannot change its core properties such as the bucket name and type. +For more information, see the <> section. + +== RBAC Privileges + +Only administrators with the following roles can execute the ALTER BUCKET statement: + +* Full Admin +* Cluster Admin +* Bucket Admin (if privileges are extended to the specific bucket or all buckets on the cluster) + +For more information about roles and privileges, see {roles}[Roles]. + +[[alterbucket-syntax]] +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=alter-bucket] +---- + +image::n1ql-language-reference/alter-bucket.png["Syntax diagram: refer to source code listing", align=left] + +The `BUCKET` and `DATABASE` keywords are synonyms. +You can use either of them. + +[horizontal] +name:: +(Required) An {identifier}[identifier] that represents the name of the bucket that you want to update. + +with-fields:: (Optional) +A JSON object containing a list of name-value pairs that specify additional options for the bucket. +For a list of valid fields names and values, see {bucket-parameters}[Bucket Parameter Groups] in the REST API documentation. + +NOTE: You cannot alter the following fields of a bucket: `bucketType`, `storageBackend`, `replicaIndex`, and `conflictResolutionType`. + +== Example + +.Alter a bucket and update its memory quota, maximum TTL, and durability level +==== +[source,sqlpp] +---- +ALTER BUCKET `student-records` +WITH { + "ramQuota": 256, + "maxTTL": 86400, + "durabilityMinLevel": "majority" +}; +---- +==== + +== Related Links + +* For an overview of buckets, see {buckets}[Buckets]. +* For step-by-step procedures for bucket management, see {manage-buckets}[Manage Buckets]. +* For managing buckets with the REST API, see {buckets-api}[Buckets API]. \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/altergroup.adoc b/modules/n1ql/pages/n1ql-language-reference/altergroup.adoc new file mode 100644 index 000000000..a5ba64de2 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/altergroup.adoc @@ -0,0 +1,142 @@ += ALTER GROUP +:description: The ALTER GROUP statement enables you to update an existing group. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +:from: xref:n1ql-language-reference/from.adoc +:from-keyspace-ref: {from}#from-keyspace-ref + +[abstract] +{description} + +== Purpose + +Use the ALTER GROUP statement to modify an existing group within the Couchbase Server Role-Based Access Control (RBAC) system. +You can update the group's description and its roles. +You can either add new roles or remove all the existing ones. +When you update a role for a group, all users in the group inherit the updated permissions automatically. + +CAUTION: When you add new roles to a group, the ALTER GROUP statement replaces the group's existing role assignments with the new ones you provide. +It updates the entire role list, so any existing roles not included in the new list will be removed. +If you want to add or remove specific roles without affecting the others, use the xref:n1ql:n1ql-language-reference/grant.adoc[GRANT] and xref:n1ql:n1ql-language-reference/revoke.adoc[REVOKE] statements instead. + +== RBAC Privileges + +To execute the ALTER GROUP statement, you must have either the Full Admin or the Security Admin role. +For more information about user roles, see xref:learn:security/authorization-overview.adoc[Authorization]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=alter-group] +---- + +image::n1ql-language-reference/alter-group.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] +name:: +(Required) The unique identifier of the group you want to update. + +description:: +(Optional) A quoted string containing the updated description for the group. + +rbac-role:: +(Optional) +<> + +[NOTE] +==== +When altering a group, you can update its roles using one of the following options: `ROLE`, `ROLES`, or `NO ROLES`. +You can specify only one of these options per statement. + +* `ROLE` assigns a single role to the group. +* `ROLES` assigns multiple roles to group (the names must be separated by commas). +* `NO ROLES` removes all roles from the group. +==== + +[[roles]] +=== Update Roles + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=rbac-role] +---- + +image::n1ql-language-reference/rbac-role.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] + +role:: +One of the xref:learn:security/authorization-overview.adoc[RBAC role names predefined] by Couchbase Server. ++ +The following roles have short forms that can be used as well: + +* `query_select` → `select` +* `query_insert` → `insert` +* `query_update` → `update` +* `query_delete` → `delete` + +keyspace-ref:: <> + +[[keyspace-ref]] +==== Keyspace Reference + +[source,ebnf] +---- +include::partial$grammar/dql.ebnf[tag=keyspace-ref] +---- + +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] + +[source#keyspace-path,ebnf,reftext="keyspace path"] +---- +include::partial$grammar/dql.ebnf[tag=keyspace-path] +---- + +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] + +[source#keyspace-partial,ebnf,reftext="keyspace partial"] +---- +include::partial$grammar/dql.ebnf[tag=keyspace-partial] +---- + +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] + +Use keyspace reference to specify the target for the update. +For more information about each element, see the xref:n1ql-language-reference/from.adoc#from-keyspace-ref[Keyspace Reference] section in the FROM clause. + +== Examples + +.Alter a group and update its description +==== +[source,sqlpp] +---- +ALTER GROUP support WITH "Support team for customer queries"; +---- +==== + +.Alter a group and add new roles +==== +[source,sqlpp] +---- +ALTER GROUP support +ROLES +query_select ON `travel-sample`.`inventory`.`airline`, +query_insert ON `travel-sample`.`inventory`.`airline`; +---- +==== + +.Alter a group and remove all roles +==== +[source,sqlpp] +---- +ALTER GROUP support NO ROLES WITH "Currently unused group"; +---- +==== + +== Related Links +* To create a group, see xref:n1ql-language-reference/creategroup.adoc[]. +* To delete a group, see xref:n1ql-language-reference/altergroup.adoc[]. +* To create a new user, see xref:n1ql-language-reference/createuser.adoc[]. diff --git a/modules/n1ql/pages/n1ql-language-reference/alteruser.adoc b/modules/n1ql/pages/n1ql-language-reference/alteruser.adoc new file mode 100644 index 000000000..a3dea79e2 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/alteruser.adoc @@ -0,0 +1,87 @@ += ALTER USER +:description: The ALTER USER statement enables you to alter the details of an existing user. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +[abstract] +{description} + +== Purpose + +Use the ALTER USER statement to update a local user's attributes, such as their password, full name, and group. +You can add the user to new groups or remove them from all existing groups. + +This statement helps manage access control and keeps user information up to date within Couchbase Server. + +CAUTION: When you add new groups to a user, the ALTER USER statement replaces the user's existing group assignments with the new ones you provide. +It updates the entire group list, so any existing groups not included in the new list will be removed. + +== RBAC Privileges + +To execute the ALTER USER statement, you must have either the Full Admin or the Security Admin role. +For more information about user roles, see xref:learn:security/authorization-overview.adoc[Authorization]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=alter-user] +---- + +image::n1ql-language-reference/alter-user.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] +username:: +(Required) The unique identifier of the local user. + +password:: +(Optional) A quoted string containing the user's new password. +It must be at least 6 characters long. + +name:: +(Optional) A quoted string containing the user's updated name. + +group:: +(Optional) The group you want to assign the user to. + +[NOTE] +==== +When altering a user, you can update their group using one of the following options: `GROUP`, `GROUPS`, or `NO GROUPS`. +You can specify only one of these options per statement. + +* `GROUP` assigns the user to a single group. +* `GROUPS` assigns the user to multiple groups (the names must be separated by commas). +* `NO GROUPS` removes the user from all groups. +==== + +== Examples + +.Change a user's password and full name +==== +[source,sqlpp] +---- +ALTER USER Hilary PASSWORD "newpassword" WITH "Hilary Chloe"; +---- +==== + +.Assign a user to a new group +==== +[source,sqlpp] +---- +ALTER USER Alice GROUP support; +---- +==== + +.Remove a user from existing groups +==== +[source,sqlpp] +---- +ALTER USER Bob NO GROUPS; +---- +==== + +== Related Links +* To create a new user, see xref:n1ql:n1ql-language-reference/createuser.adoc[]. +* To delete a user, see xref:n1ql:n1ql-language-reference/dropuser.adoc[]. +* To create a new group, see xref:n1ql:n1ql-language-reference/creategroup.adoc[]. diff --git a/modules/n1ql/pages/n1ql-language-reference/createbucket.adoc b/modules/n1ql/pages/n1ql-language-reference/createbucket.adoc new file mode 100644 index 000000000..84c111251 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/createbucket.adoc @@ -0,0 +1,118 @@ += CREATE BUCKET +:description: The CREATE BUCKET statement enables you to create a bucket. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +:identifier: xref:n1ql-language-reference/identifiers.adoc +:roles: xref:learn:security/roles.adoc +:bucket-parameters: xref:rest-api:rest-bucket-create.adoc#parameter-groups +:buckets: xref:learn:buckets-memory-and-storage/buckets.adoc +:manage-buckets: xref:manage:manage-buckets/bucket-management-overview.adoc +:buckets-api: xref:rest-api:rest-bucket-intro.adoc +:couchbase-cli-bucket-create: xref:cli:cbcli/couchbase-cli-bucket-create.adoc + +[abstract] +{description} + +== Purpose + +Use the CREATE BUCKET statement to create a new bucket in your Couchbase cluster. +A bucket is a top-level data container, similar to a database in relational database management systems. +It stores documents and provides a logical grouping for data. + +When you create a new bucket, a `_default` scope and a `_default` collection are automatically created within it, providing a basic structure for your data right away. +The name of the bucket must be unique within the cluster and you cannot change it once you create the bucket. +You can have a maximum of 30 buckets per cluster. + +== RBAC Privileges + +To execute the CREATE BUCKET statement, you must have either the Full Admin or the Cluster Admin role. +For more information about roles and privileges, see {roles}[Roles]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=create-bucket] +---- + +image::n1ql-language-reference/create-bucket.png["Syntax diagram: refer to source code listing", align=left] + +The `BUCKET` and `DATABASE` keywords are synonyms. +You can use either of them. + +[horizontal] +name:: +(Required) An {identifier}[identifier] that represents the name of the bucket that you want to create. +It must be unique within the cluster and cannot be longer than 100 characters. +Acceptable characters are A-Z, a-z, 0-9, and the special characters underscore, period, dash, and percent. + +[[if-not-exists]] +=== IF NOT EXISTS Clause + +The optional `IF NOT EXISTS` clause enables the statement to complete successfully when the specified bucket already exists. +If a bucket with the same name already exists, then: + +* If this clause is not present, an error is generated. +* If this clause is present, the statement does nothing and completes without error. + +[[with]] +=== WITH Clause + +Use the optional `WITH` clause to specify additional options for the bucket. + +[horizontal] + +with-fields:: +A JSON object containing a list of name-value pairs that define the additional options. +For a list of valid fields names and values, see {bucket-parameters}[Bucket Parameter Groups] in the REST API documentation. ++ +If you do not include `with-fields`, the statement creates the bucket with default values for all optional settings. +Similarly, if you include `with-fields` but omit specific options, those options are also set to their default values. + +[NOTE] +==== +When using `with-fields`, if you set a value for `ramQuota`, the bucket's configured with that value as its memory quota. +However, if you do not specify a value for `ramQuota`, its value is determined as follows: + +* If `storageBackend` is set to `magma` and `numVBuckets` is set to `1024`, then `ramQuota` is set to `1024 MiB`. +* In all other cases, `ramQuota` is set to `100 MiB`. +==== + +== Examples + +.Create a bucket named `student-records` with default settings +==== +[source,sqlpp] +---- +CREATE BUCKET `student-records`; +---- +==== + +.Create a bucket named `custom-bucket` with custom settings +==== +The bucket has a memory quota of `512 MiB`, bucket type as `couchbase`, and storage backend as `magma`. +[source,sqlpp] +---- +CREATE BUCKET `custom-bucket` WITH { + "ramQuota": 512, + "bucketType": "couchbase", + "storageBackend": "magma" +}; +---- +==== + +.Create a bucket named `data-sample` if it does not already exist +==== +[source,sqlpp] +---- +CREATE BUCKET IF NOT EXISTS `data-sample`; +---- +==== + +== Related Links + +* For an overview of buckets, see {buckets}[Buckets]. +* For step-by-step procedures for bucket management, see {manage-buckets}[Manage Buckets]. +* For managing buckets with the REST API, see {buckets-api}[Buckets API]. \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/creategroup.adoc b/modules/n1ql/pages/n1ql-language-reference/creategroup.adoc new file mode 100644 index 000000000..414ad67ea --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/creategroup.adoc @@ -0,0 +1,149 @@ += CREATE GROUP +:description: The CREATE GROUP statement enables you to create a group. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +[abstract] +{description} + +== Purpose + +Use the CREATE GROUP statement to define a new group within the Couchbase Server Role-Based Access Control (RBAC) system. +You can specify the group's name, description, and assign it one or more roles. + +By creating groups, you can organize users and assign roles collectively. +When you add users to a group, they automatically inherit the roles assigned to that group. + +== RBAC Privileges + +To execute the CREATE GROUP statement, you must have either the Full Admin or the Security Admin role. +For more information about user roles, see xref:learn:security/authorization-overview.adoc[Authorization]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=create-group] +---- + +image::n1ql-language-reference/create-group.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] +name:: +(Required) The unique identifier for the new group. + +description:: +(Optional) A quoted string containing the description for the group. + +rbac-role:: +(Required) +<> + +[NOTE] +==== +When creating a group, you can grant roles to them using one of the following options: `ROLE`, `ROLES`, or `NO ROLES`. +You can specify only one of these options per statement. + +* `ROLE` assigns a single role to the group. +* `ROLES` assigns multiple roles to group (the names must be separated by commas). +* `NO ROLES` creates a group with no roles assigned. +This option has no effect during group creation. +==== + +[[if-not-exists]] +=== IF NOT EXISTS Clause + +The optional `IF NOT EXISTS` clause enables the statement to complete successfully when the specified group already exists. +If a group with the same name already exists, then: + +* If this clause is not present, an error is generated. + +* If this clause is present, the statement does nothing and completes without error. + +[[roles]] +=== Add Roles + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=rbac-role] +---- + +image::n1ql-language-reference/rbac-role.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] + +role:: +One of the xref:learn:security/authorization-overview.adoc[RBAC role names predefined] by Couchbase Server. ++ +For the following roles, you can use their short forms as well: + +* `query_select` → `select` +* `query_insert` → `insert` +* `query_update` → `update` +* `query_delete` → `delete` + +keyspace-ref:: <> + +[[keyspace-ref]] +==== Keyspace Reference + +[source,ebnf] +---- +include::partial$grammar/dql.ebnf[tag=keyspace-ref] +---- + +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] + +[source#keyspace-path,ebnf,reftext="keyspace path"] +---- +include::partial$grammar/dql.ebnf[tag=keyspace-path] +---- + +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] + +[source#keyspace-partial,ebnf,reftext="keyspace partial"] +---- +include::partial$grammar/dql.ebnf[tag=keyspace-partial] +---- + +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] + +Use keyspace reference to specify the target keyspace. +For more information about each element, see the xref:n1ql-language-reference/from.adoc#from-keyspace-ref[Keyspace Reference] section in the FROM clause. + +== Examples + +.Create a group `sales` and assign it the `query_select` role +==== +[source,sqlpp] +---- +CREATE GROUP sales ROLE query_select ON `travel-sample`.`inventory`.`airline`; +---- +==== + +.Create a group `travelagents` and assign it multiple roles +==== +[source, sqlpp] +---- +CREATE GROUP travelagents +WITH "Sample travel agents group" +ROLES data_reader ON `travel-sample`.`inventory`.`airline`, +select ON `travel-sample`.`inventory`.`landmark`; +---- +==== + +.Create a group `support` if it does not already exist +==== +[source,sqlpp] +---- +CREATE GROUP IF NOT EXISTS support ROLE query_update +ON `travel-sample`.`inventory`.`airport`; +---- +==== + +== Related Links +* To create a new user, see xref:n1ql:n1ql-language-reference/createuser.adoc[]. +* To update an existing group, see xref:n1ql:n1ql-language-reference/altergroup.adoc[]. +* To delete a group, see xref:n1ql:n1ql-language-reference/dropgroup.adoc[]. + diff --git a/modules/n1ql/pages/n1ql-language-reference/createuser.adoc b/modules/n1ql/pages/n1ql-language-reference/createuser.adoc new file mode 100644 index 000000000..8d690365e --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/createuser.adoc @@ -0,0 +1,114 @@ += CREATE USER +:description: The CREATE USER statement enables you to create a user. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +[abstract] +{description} + +== Purpose + +Creating a user is an essential step in managing access to your Couchbase environment. +You can use the CREATE USER statement to define a new local user in the Couchbase Server Role-Based Access Control (RBAC) system. +By default, Couchbase Server assigns the user to the local authentication domain. + +When you create a user, you can specify their basic attributes such as username, password, full name, and assign them to one or more groups. +If you do not specify a group, the user is not assigned to any group by default. + +== RBAC Privileges + +To execute the CREATE USER statement, you must have either the Full Admin or the Security Admin role. +For more information about user roles, see xref:learn:security/authorization-overview.adoc[Authorization]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=create-user] +---- + +image::n1ql-language-reference/create-user.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] +username:: +(Required) The unique identifier for the new local user. + +password:: +(Required) A quoted string containing the user's password. +It must be at least 6 characters long. + +name:: +(Optional) A quoted string containing the user's full name. + +group:: +(Optional) The group you want to assign the user to. + +[NOTE] +==== +When creating a user, you can assign them to groups using one of the following options: `GROUP`, `GROUPS`, or `NO GROUPS`. +You can specify only one of these options per statement. + +* `GROUP` assigns the user to a single group. +* `GROUPS` assigns the user to multiple groups (the names must be separated by commas). +* `NO GROUPS` creates a user without assigning any groups. +This option has no effect during user creation. +==== + +[[if-not-exists]] +=== IF NOT EXISTS Clause + +The optional `IF NOT EXISTS` clause enables the statement to complete successfully when the specified user already exists. +If a user with the same username already exists, then: + +* If this clause is not present, an error is generated. +* If this clause is present, the statement does nothing and completes without error. + +== Examples + +.Create a user and specify their full name and password +==== +[source,sqlpp] +---- +CREATE USER Hilary PASSWORD "password123" WITH "Hilary Smith"; +---- +==== + +.Create a user and assign them to a single group +==== +[source,sqlpp] +---- +CREATE USER Alice PASSWORD "password123" GROUP agents; +---- +==== + +.Create a user and assign them to multiple groups +==== +[source,sqlpp] +---- +CREATE USER Bob PASSWORD "P@ssw0rd" GROUPS agents, tourguides, support; +---- +==== + +.Create a user with no group assignments +==== +[source,sqlpp] +---- +CREATE USER Charlie PASSWORD "securePass" NO GROUPS; +---- +==== + +.Create a user if they do not already exist +==== +[source,sqlpp] +---- +CREATE USER IF NOT EXISTS David PASSWORD "davidPass" WITH "David Trantow"; +---- +==== + +== Related Links +* To update an existing user, see xref:n1ql:n1ql-language-reference/alteruser.adoc[]. +* To delete a user, see xref:n1ql:n1ql-language-reference/dropuser.adoc[]. +* To create a new group, see xref:n1ql:n1ql-language-reference/creategroup.adoc[]. +* To grant roles and privileges to a user, see xref:n1ql:n1ql-language-reference/grant.adoc[]. + diff --git a/modules/n1ql/pages/n1ql-language-reference/dropbucket.adoc b/modules/n1ql/pages/n1ql-language-reference/dropbucket.adoc new file mode 100644 index 000000000..e327459a1 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/dropbucket.adoc @@ -0,0 +1,84 @@ += DROP BUCKET +:description: The DROP BUCKET statement enables you to delete a bucket. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +:identifier: xref:n1ql-language-reference/identifiers.adoc +:roles: xref:learn:security/roles.adoc +:bucket-parameters: xref:rest-api:rest-bucket-create.adoc#parameter-groups +:buckets: xref:learn:buckets-memory-and-storage/buckets.adoc +:manage-buckets: xref:manage:manage-buckets/bucket-management-overview.adoc +:buckets-api: xref:rest-api:rest-bucket-intro.adoc +:couchbase-cli-bucket-delete: xref:cli:cbcli/couchbase-cli-bucket-edit.adoc + +[abstract] +{description} + +== Purpose + +Use the DROP BUCKET statement to permanently delete an existing bucket from your Couchbase cluster. +Dropping a bucket deletes all data in the bucket, including documents, scopes, and collections. +It also deletes all associated indexes, metadata, and other bucket resources. + +WARNING: This operation is irreversible, so use this statement with caution. + +== RBAC Privileges + +Only administrators with the following roles can execute the DROP BUCKET statement: + +* Full Admin +* Cluster Admin +* Bucket Admin (if privileges are extended to the specific bucket or all buckets on the cluster) + +For more information about roles and privileges, see {roles}[Roles]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=drop-bucket] +---- + +image::n1ql-language-reference/drop-bucket.png["Syntax diagram: refer to source code listing", align=left] + +The `BUCKET` and `DATABASE` keywords are synonyms. +You can use either of them. + +[horizontal] +name:: +(Required) An {identifier}[identifier] that represents the name of the bucket that you want to delete. + +[[if-exists]] +=== IF EXISTS Clause + +The optional `IF EXISTS` clause enables the statement to complete successfully when the specified bucket doesn't exist. +If a bucket with the same name does not exist, then: + +* If this clause is not present, an error is generated. + +* If this clause is present, the statement does nothing and completes without error. + +== Examples + +.Drop a bucket named `student-records` +==== +[source,sqlpp] +---- +DROP BUCKET `student-records`; +---- +==== + +.Drop a bucket named `custom-bucket` if it exists +==== +[source,sqlpp] +---- +DROP BUCKET IF EXISTS `custom-bucket`; +---- +==== + +== Related Links + +* For an overview of buckets, see {buckets}[Buckets]. +* For step-by-step procedures for bucket management, see {manage-buckets}[Manage Buckets]. +* For managing buckets with the REST API, see {buckets-api}[Buckets API]. \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/dropgroup.adoc b/modules/n1ql/pages/n1ql-language-reference/dropgroup.adoc new file mode 100644 index 000000000..0ef0d6d0e --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/dropgroup.adoc @@ -0,0 +1,67 @@ += DROP GROUP +:description: The DROP GROUP statement enables you to delete a group. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +[abstract] +{description} + +== Purpose + +You can use this statement to clean up groups that are no longer needed. + +Deleting a group removes all roles and privileges associated with the group. +Users in the deleted group no longer inherit the roles granted to it. + +== RBAC Privileges + +To execute the DROP GROUP statement, you must have etiher the Full Admin or the Security Admin role. +For more information about user roles, see xref:learn:security/authorization-overview.adoc[Authorization]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=drop-group] +---- + +image::n1ql-language-reference/drop-group.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] +groupname:: +(Required) The unique identifier of the group you want to delete. + +[[if-exists]] +=== IF EXISTS Clause + +The optional `IF EXISTS` clause enables the statement to complete successfully when the specified group doesn't exist. +If a group with the same name does not exist, then: + +* If this clause is not present, an error is generated. + +* If this clause is present, the statement does nothing and completes without error. + +== Examples + +.Delete a group named `sales` +==== +[source,sqlpp] +---- +DROP GROUP sales; +---- +==== + +.Delete a group named `support` if it exists +==== +[source,sqlpp] +---- +DROP GROUP IF EXISTS support; +---- +==== + +== Related Links +* To create a group, see xref:n1ql-language-reference/creategroup.adoc[]. +* To alter a group, see xref:n1ql-language-reference/altergroup.adoc[]. +* For step-by-step procedures for managing groups, see xref:manage:manage-security/manage-users-and-roles.adoc[Manage Groups]. + diff --git a/modules/n1ql/pages/n1ql-language-reference/dropuser.adoc b/modules/n1ql/pages/n1ql-language-reference/dropuser.adoc new file mode 100644 index 000000000..26ec0f2e8 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/dropuser.adoc @@ -0,0 +1,64 @@ += DROP USER +:description: The DROP USER statement enables you to delete a user. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images + +:identifier: xref:n1ql-language-reference/identifiers.adoc + +[abstract] +{description} + +This statement permanently removes a user from the Couchbase Server Role-Based Access Control (RBAC) system. +It removes the user from all groups and revokes all roles and privileges assigned to that user. + +== RBAC Privileges + +To execute the DROP USER statement, you must have either the Full Admin or the Security Admin role. +For more information about user roles, see xref:learn:security/authorization-overview.adoc[Authorization]. + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=drop-user] +---- + +image::n1ql-language-reference/drop-user.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] +username:: +(Required) The unique identifier of the local user you want to delete. + +[[if-exists]] +=== IF EXISTS Clause + +The optional `IF EXISTS` clause enables the statement to complete successfully when the specified user doesn't exist. +If a user with the same username does not exist, then: + +* If this clause is not present, an error is generated. + +* If this clause is present, the statement does nothing and completes without error. + +== Examples + +.Delete a user named Bob +==== +[source,sqlpp] +---- +DROP USER Bob; +---- +==== + +.Delete a user named David if they exist +==== +[source,sqlpp] +---- +DROP USER IF EXISTS David; +---- +==== + +== Related Links +* To create a user, see xref:n1ql-language-reference/createuser.adoc[CREATE USER]. +* To modify a user, see xref:n1ql-language-reference/alteruser.adoc[ALTER USER]. +* For step by step procedures for managing users, see xref:manage:manage-security/manage-users-and-roles.adoc[Manage Users]. \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/grant.adoc b/modules/n1ql/pages/n1ql-language-reference/grant.adoc index 3064c39f0..a8027101f 100644 --- a/modules/n1ql/pages/n1ql-language-reference/grant.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/grant.adoc @@ -1,5 +1,5 @@ = GRANT -:description: The GRANT statement allows granting any RBAC roles to a specific user. +:description: The GRANT statement allows granting any RBAC roles to a specific user or group. :page-topic-type: reference :imagesdir: ../../assets/images @@ -15,14 +15,18 @@ Roles can be of the following two types: simple:: Roles which apply generically to all keyspaces or resources in the cluster. + -For example: `ClusterAdmin` or `BucketAdmin` +For example: `cluster_admin` or `bucket_admin` parameterized by a keyspace:: -Roles which are defined for the scope of the specified keyspace only. -The keyspace name is specified after ON. +Roles which are defined for the context of the specified keyspace only. +Specify the keyspace name after the keyword ON. + -For example: `pass:c[DataReader ON `travel-sample`]` + -or `pass:c[Query_Select ON `travel-sample`]` +The keyspace must be fully qualified and must include the bucket, scope, and collection names. +Even if you're granting a role to an entire bucket, you must specify the default scope (`_default`) and default collection (`_default`). +Using only the bucket name is not sufficient. ++ +For example: `pass:c[data_reader ON `travel-sample`.`_default`.`_default`]` + +or `pass:c[query_select ON `travel-sample`.`inventory`.`airline`]` NOTE: Only Full Administrators can run the GRANT statement. For more details about user roles, see {authorization-overview}[]. @@ -36,19 +40,44 @@ include::partial$grammar/dcl.ebnf[tag=grant] image::n1ql-language-reference/grant.png["Syntax diagram: refer to source code listing", align=left] +[source,ebnf] +---- +include::partial$grammar/dcl.ebnf[tag=grant-user] +---- + +image::n1ql-language-reference/grant-user.png["Syntax diagram: refer to source code listing", align=left] + +[source,ebnf] +---- +include::partial$grammar/dcl.ebnf[tag=grant-group] +---- + +image::n1ql-language-reference/grant-group.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] role:: One of the {authorization-overview}[RBAC role names predefined] by Couchbase Capella. + -The following roles have short forms that can be used as well: +For the following roles, you can use their short forms as well: * `query_select` → `select` * `query_insert` → `insert` * `query_update` → `update` * `query_delete` → `delete` +keyspace-ref:: +<> + user:: A user name created by the Couchbase Capella RBAC system. +group:: +A group name created by the Couchbase Server RBAC system. + +NOTE: When granting roles to users, the keyword `USER` or `USERS` is optional. +However, when granting roles to groups, you must include the keyword `GROUP` or `GROUPS`. +You can use either the singular or plural form of these keywords as this does not affect the number of users or groups the role applies to. + [[keyspace-ref,keyspace-ref]] === Keyspace Reference @@ -73,8 +102,8 @@ include::partial$grammar/dql.ebnf[tag=keyspace-partial] image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] -The simple name or fully-qualified name of a keyspace. -Refer to the {keyspace-ref}[CREATE INDEX] statement for details of the syntax. +The simple name or fully qualified name of a keyspace. +For more information about the syntax, see the {keyspace-ref}[CREATE INDEX] statement. == Usage @@ -94,11 +123,11 @@ GRANT replication_admin, query_external_access [source,sqlpp] ---- GRANT Query Select, Views Admin - ON orders, customers + ON `retail`.`customers`.`orders` TO bill, linda; GRANT query_select, views_admin - ON orders, customers + ON `retail`.`customers`.`orders` TO bill, linda; ---- @@ -106,18 +135,26 @@ NOTE: Mixing of parameterized and unparameterized roles or syntax is not allowed == Examples -.Grant the role of Cluster Administrator to three people +.Grant the role of Cluster Administrator to multiple users ==== [source,sqlpp] ---- -GRANT ClusterAdmin TO david, michael, robin; +GRANT cluster_admin TO david, michael, robin; ---- ==== -.Grant the roles of Cluster Administrator and Data Reader in the travel-sample keyspace to Debby +.Grant Query Select and Data Reader roles on a keyspace to a specific user ==== [source,sqlpp] ---- -GRANT ClusterAdmin, DataReader ON `travel-sample` TO debby; +GRANT query_select, data_reader ON `travel-sample`.`_default`.`_default` TO debby; +---- +==== + +.Grant the role of Data Reader on a keyspace to a specific group +==== +[source,sqlpp] +---- +GRANT data_reader ON `travel-sample`.`inventory`.`hotel` TO GROUP sales; ---- ==== \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/revoke.adoc b/modules/n1ql/pages/n1ql-language-reference/revoke.adoc index a9f1e978b..0414356a7 100644 --- a/modules/n1ql/pages/n1ql-language-reference/revoke.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/revoke.adoc @@ -1,5 +1,5 @@ = REVOKE -:description: The REVOKE statement allows revoking of any RBAC roles from specific users. +:description: The REVOKE statement allows revoking of any RBAC roles from specific users or groups. :page-topic-type: reference :imagesdir: ../../assets/images @@ -15,14 +15,18 @@ Roles can be of the following two types: simple:: Roles which apply generically to all keyspaces/resources in the cluster. + -For example: `ClusterAdmin` or `BucketAdmin` +For example: `cluster_admin` or `bucket_admin` parameterized by a keyspace:: -Roles which are defined for the scope of the specified keyspace only. -The keyspace name is specified after ON. +Roles which are defined for the context of the specified keyspace only. +Specify the keyspace name after the keyword ON. + -For example: `pass:c[DataReader ON `travel-sample`]` + -or `pass:c[Query_Select ON `travel-sample`]` +The keyspace must be fully qualified and must include the bucket, scope, and collection names. +Even if you're revoking a role from an entire bucket, you must specify the default scope (`_default`) and default collection (`_default`). +Using only the bucket name is not sufficient. ++ +For example: `pass:c[data_reader ON `travel-sample`.`_default`.`_default`]` + +or `pass:c[query_select ON `travel-sample`.`inventory`.`airline`]` NOTE: Only Full Administrators can run the REVOKE statement. For more details about user roles, see {authorization-overview}[]. @@ -36,16 +40,34 @@ include::partial$grammar/dcl.ebnf[tag=revoke] image::n1ql-language-reference/revoke.png["Syntax diagram: refer to source code listing", align=left] +[source,ebnf] +---- +include::partial$grammar/dcl.ebnf[tag=revoke-user] +---- + +image::n1ql-language-reference/revoke-user.png["Syntax diagram: refer to source code listing", align=left] + +[source,ebnf] +---- +include::partial$grammar/dcl.ebnf[tag=revoke-group] +---- + +image::n1ql-language-reference/revoke-group.png["Syntax diagram: refer to source code listing", align=left] + +[horizontal] role:: One of the {authorization-overview}[RBAC role names predefined] by Couchbase Capella. + -The following roles have short forms that can be used as well: +For the following roles, you can use their short forms as well: * `query_select` → `select` * `query_insert` → `insert` * `query_update` → `update` * `query_delete` → `delete` +keyspace-ref:: +<> + user:: A user name created by the Couchbase Capella RBAC system. @@ -73,25 +95,35 @@ include::partial$grammar/dql.ebnf[tag=keyspace-partial] image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] -The simple name or fully-qualified name of a keyspace. -Refer to the {keyspace-ref}[CREATE INDEX] statement for details of the syntax. +The simple name or fully qualified name of a keyspace. +For more information about the syntax, see the {keyspace-ref}[CREATE INDEX] statement. == Examples -.Revoke the role of ClusterAdmin from three people +.Revoke the Cluster Admin role from multiple users ==== [source,sqlpp] ---- -REVOKE ClusterAdmin FROM david, michael, robin +REVOKE cluster_admin FROM david, michael, robin ---- ==== -.Revoke the roles of ClusterAdmin and QueryUpdate in the travel-sample keyspace from debby +.Revoke Query Select and Query Update roles on a keyspace from a specific user ==== [source,sqlpp] ---- -REVOKE ClusterAdmin, QueryUpdate - ON `travel-sample` +REVOKE query_select, query_update + ON `travel-sample`.`_default`.`_default` FROM debby ---- +==== + +.Revoke the Query Update role on a keyspace from a specific group +==== +[source,sqlpp] +---- +REVOKE query_update + ON `travel-sample`.`inventory`.`hotel` + FROM GROUP sales +---- ==== \ No newline at end of file diff --git a/modules/n1ql/partials/grammar/dcl.ebnf b/modules/n1ql/partials/grammar/dcl.ebnf index c98dbee46..6fc9dba9a 100644 --- a/modules/n1ql/partials/grammar/dcl.ebnf +++ b/modules/n1ql/partials/grammar/dcl.ebnf @@ -4,14 +4,32 @@ dcl-statement ::= grant | revoke /* tag::grant[] */ -grant ::= 'GRANT' role ( ',' role )* ( 'ON' keyspace-ref ( ',' keyspace-ref )* )? - 'TO' user ( ',' user )* +grant ::= grant-user | grant-group /* end::grant[] */ +/* tag::grant-user[] */ +grant-user ::= 'GRANT' role ( ',' role )* ( 'ON' keyspace-ref ( ',' keyspace-ref )* )? + 'TO' ( 'USER' | 'USERS' )? user ( ',' user )* +/* end::grant-user[] */ + +/* tag::grant-group[] */ +grant-group ::= 'GRANT' role ( ',' role )* ( 'ON' keyspace-ref ( ',' keyspace-ref )* )? + 'TO' ( 'GROUP' | 'GROUPS' ) group ( ',' group )* +/* end::grant-group[] */ + /* tag::revoke[] */ -revoke ::= 'REVOKE' role ( ',' role )* ( 'ON' keyspace-ref ( ',' keyspace-ref )* )? - 'FROM' user ( ',' user )* +revoke ::= revoke-user | revoke-group /* end::revoke[] */ +/* tag::revoke-user[] */ +revoke-user ::= 'REVOKE' role ( ',' role )* ( 'ON' keyspace-ref ( ',' keyspace-ref )* )? + 'FROM' ( 'USER' | 'USERS' )? user ( ',' user )* +/* end::revoke-user[] */ + +/* tag::revoke-group[] */ +revoke-group ::= 'REVOKE' role ( ',' role )* ( 'ON' keyspace-ref ( ',' keyspace-ref )* )? + 'FROM' ( 'GROUP' | 'GROUPS' ) group ( ',' group )* +/* end::revoke-group[] */ + role ::= identifier user ::= identifier \ No newline at end of file diff --git a/modules/n1ql/partials/grammar/ddl.ebnf b/modules/n1ql/partials/grammar/ddl.ebnf index 827efc4b9..909e23585 100644 --- a/modules/n1ql/partials/grammar/ddl.ebnf +++ b/modules/n1ql/partials/grammar/ddl.ebnf @@ -10,6 +10,9 @@ create-statement ::= create-scope | create-index | create-function | create-sequence + | create-user + | create-group + | create-bucket drop-statement ::= drop-scope | drop-collection @@ -17,17 +20,28 @@ drop-statement ::= drop-scope | drop-index | drop-function | drop-sequence + | drop-user + | drop-group + | drop-bucket -other-statement ::= alter-index +other-statement ::= alter-bucket + | alter-group + | alter-index | alter-sequence + | alter-user | build-index | execute-function /************************** - * Scopes and Collections * + * Buckets, Scopes, and Collections * **************************/ +/* tag::create-bucket[] */ +create-bucket ::= 'CREATE' ( 'BUCKET' | 'DATABASE' ) ( 'IF' 'NOT' 'EXISTS' )? name + ( 'WITH' with-fields )? +/* end::create-bucket[] */ + /* tag::create-scope[] */ create-scope ::= 'CREATE' 'SCOPE' ( namespace ':' )? bucket '.' scope ( 'IF' 'NOT' 'EXISTS' )? /* end::create-scope[] */ @@ -37,6 +51,14 @@ create-collection ::= 'CREATE' 'COLLECTION' ( ( namespace ':' )? bucket '.' scop collection ( 'IF' 'NOT' 'EXISTS' )? ( 'WITH' expr )? /* end::create-collection[] */ +/* tag::alter-bucket[] */ +alter-bucket ::= 'ALTER' ( 'BUCKET' | 'DATABASE' ) name ( 'WITH' with-fields )? +/* end::alter-bucket[] */ + +/* tag::drop-bucket[] */ +drop-bucket ::= 'DROP' ( 'BUCKET' | 'DATABASE' ) ('IF' 'EXISTS' )? name +/* end::drop-bucket[] */ + /* tag::drop-scope[] */ drop-scope ::= 'DROP' 'SCOPE' ( namespace ':' )? bucket '.' scope ( 'IF' 'EXISTS' )? /* end::drop-scope[] */ @@ -288,3 +310,45 @@ alter-sequence-options ::= ( restart-with /* tag::restart-with[] */ restart-with ::= 'RESTART' ( 'WITH' integer )? /* end::restart-with[] */ + +/******************** + * Users and Groups * + ********************/ + +/* tag::create-user[] */ +create-user ::= 'CREATE' 'USER' ( 'IF' 'NOT' 'EXISTS' )? username 'PASSWORD' password + ( 'WITH' name )? + ( 'GROUP' group | 'GROUPS' group ( ',' group )* | 'NO' 'GROUPS' )? +/* end::create-user[] */ + +/* tag::alter-user[] */ +alter-user ::= 'ALTER' 'USER' username ( 'PASSWORD' password )? + ( 'WITH' name )? + ( 'GROUP' group | 'GROUPS' group ( ',' group )* | 'NO' 'GROUPS' )? +/* end::alter-user[] */ + +/* tag::drop-user[] */ +drop-user ::= 'DROP' 'USER' ( 'IF' 'EXISTS' )? username +/* end::drop-user[] */ + +/* tag::create-group[] */ +create-group ::= 'CREATE' 'GROUP' ( 'IF' 'NOT' 'EXISTS' )? name + ( 'WITH' description )? + ( 'ROLE' rbac-role | 'ROLES' rbac-role ( ',' rbac-role )* | 'NO' 'ROLES' ) +/* end::create-group[] */ + +/* tag::alter-group[] */ +alter-group ::= 'ALTER' 'GROUP' name ( 'WITH' description )? + ( 'ROLE' rbac-role | 'ROLES' rbac-role (',' rbac-role )* | 'NO' 'ROLES' )? +/* end::alter-group[] */ + +/* tag::rbac-role[] */ +rbac-role ::= role ( 'ON' keyspace-ref )? +/* end::rbac-role[] */ + +/* tag::drop-group[] */ +drop-group ::= 'DROP' 'GROUP' ('IF' 'EXISTS' )? groupname +/* end::drop-group[] */ + + + diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index e022f9c0f..d69105fff 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -87,13 +87,18 @@ endif::flag-devex-javascript-udfs[] *** xref:n1ql:n1ql-language-reference/booleanlogic.adoc[] *** Statements **** xref:n1ql:n1ql-language-reference/advise.adoc[] + **** xref:n1ql:n1ql-language-reference/alterbucket.adoc[] + **** xref:n1ql:n1ql-language-reference/altergroup.adoc[] **** xref:n1ql:n1ql-language-reference/alterindex.adoc[] **** xref:n1ql:n1ql-language-reference/altersequence.adoc[] + **** xref:n1ql:n1ql-language-reference/alteruser.adoc[] **** xref:n1ql:n1ql-language-reference/begin-transaction.adoc[] **** xref:n1ql:n1ql-language-reference/build-index.adoc[] **** xref:n1ql:n1ql-language-reference/commit-transaction.adoc[] + **** xref:n1ql:n1ql-language-reference/createbucket.adoc[] **** xref:n1ql:n1ql-language-reference/createcollection.adoc[] **** xref:n1ql:n1ql-language-reference/createfunction.adoc[] + **** xref:n1ql:n1ql-language-reference/creategroup.adoc[] **** xref:n1ql:n1ql-language-reference/createindex.adoc[] ***** xref:n1ql:n1ql-language-reference/indexing-arrays.adoc[] ***** xref:n1ql:n1ql-language-reference/adaptive-indexing.adoc[] @@ -102,13 +107,17 @@ endif::flag-devex-javascript-udfs[] **** xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[] **** xref:n1ql:n1ql-language-reference/createsequence.adoc[] **** xref:n1ql:n1ql-language-reference/createscope.adoc[] + **** xref:n1ql:n1ql-language-reference/createuser.adoc[] **** xref:n1ql:n1ql-language-reference/delete.adoc[] + **** xref:n1ql:n1ql-language-reference/dropbucket.adoc[] **** xref:n1ql:n1ql-language-reference/dropcollection.adoc[] **** xref:n1ql:n1ql-language-reference/dropfunction.adoc[] + **** xref:n1ql:n1ql-language-reference/dropgroup.adoc[] **** xref:n1ql:n1ql-language-reference/dropindex.adoc[] **** xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[] **** xref:n1ql:n1ql-language-reference/dropsequence.adoc[] **** xref:n1ql:n1ql-language-reference/dropscope.adoc[] + **** xref:n1ql:n1ql-language-reference/dropuser.adoc[] **** xref:n1ql:n1ql-language-reference/execute.adoc[] **** xref:n1ql:n1ql-language-reference/execfunction.adoc[] **** xref:n1ql:n1ql-language-reference/explain.adoc[] From a23b3cb927fe8e2005e6db00f4c2ebe1168e7c53 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Wed, 24 Sep 2025 09:09:02 +0530 Subject: [PATCH 51/80] [DOC-10065] Optimizer Hints Changes for Morpheus (#404) --- .../images/n1ql-language-reference/delete.png | Bin 15071 -> 16232 bytes .../gsi-all-hint-json.png | Bin 0 -> 6586 bytes .../gsi-all-hint-simple.png | Bin 0 -> 6367 bytes .../n1ql-language-reference/json-hint.png | Bin 9794 -> 19741 bytes .../images/n1ql-language-reference/merge.png | Bin 10235 -> 12860 bytes .../no-fts-hint-json.png | Bin 0 -> 10145 bytes .../no-fts-hint-simple.png | Bin 0 -> 10878 bytes .../no-gsi-hint-json.png | Bin 0 -> 9328 bytes .../no-gsi-hint-simple.png | Bin 0 -> 10046 bytes .../no-hash-hint-json.png | Bin 0 -> 10844 bytes .../no-hash-hint-simple.png | Bin 0 -> 9259 bytes .../no-nl-hint-json.png | Bin 0 -> 10013 bytes .../no-nl-hint-simple.png | Bin 0 -> 8361 bytes .../n1ql-language-reference/simple-hint.png | Bin 10604 -> 21421 bytes .../images/n1ql-language-reference/update.png | Bin 14878 -> 16027 bytes .../n1ql/examples/dml/ansi-merge-hint.jsonc | 174 +++++ .../n1ql/examples/dml/ansi-merge-hint.n1ql | 6 + .../examples/dml/delete-optimizer-hint.jsonc | 70 ++ .../examples/dml/delete-optimizer-hint.n1ql | 6 + .../examples/dml/update-optimizer-hint.jsonc | 112 ++++ .../examples/dml/update-optimizer-hint.n1ql | 3 + .../n1ql/examples/select/index-all-hint.jsonc | 156 +++++ .../n1ql/examples/select/index-all-hint.n1ql | 11 + .../n1ql/examples/select/no-index-hint.jsonc | 116 ++++ .../n1ql/examples/select/no-index-hint.n1ql | 10 + .../examples/select/no-use-hash-hint.jsonc | 136 ++++ .../examples/select/no-use-hash-hint.n1ql | 11 + .../n1ql/examples/select/no-use-nl-hint.jsonc | 212 ++++++ .../n1ql/examples/select/no-use-nl-hint.n1ql | 13 + .../n1ql/examples/select/no-use-nl-opt.jsonc | 175 +++++ .../cost-based-optimizer.adoc | 4 + .../pages/n1ql-language-reference/delete.adoc | 43 +- .../keyspace-hints.adoc | 223 ++++++- .../pages/n1ql-language-reference/merge.adoc | 44 +- .../negative-keyspace-hints.adoc | 605 ++++++++++++++++++ .../optimizer-hints.adoc | 77 ++- .../n1ql-language-reference/query-hints.adoc | 2 + .../pages/n1ql-language-reference/update.adoc | 39 +- modules/n1ql/partials/grammar/dml.ebnf | 7 +- modules/n1ql/partials/grammar/hints.ebnf | 51 ++ modules/n1ql/partials/nav.adoc | 1 + 41 files changed, 2291 insertions(+), 16 deletions(-) create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/gsi-all-hint-json.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/gsi-all-hint-simple.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-fts-hint-json.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-fts-hint-simple.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-gsi-hint-json.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-gsi-hint-simple.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-hash-hint-json.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-hash-hint-simple.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-nl-hint-json.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/no-nl-hint-simple.png create mode 100644 modules/n1ql/examples/dml/ansi-merge-hint.jsonc create mode 100644 modules/n1ql/examples/dml/ansi-merge-hint.n1ql create mode 100644 modules/n1ql/examples/dml/delete-optimizer-hint.jsonc create mode 100644 modules/n1ql/examples/dml/delete-optimizer-hint.n1ql create mode 100644 modules/n1ql/examples/dml/update-optimizer-hint.jsonc create mode 100644 modules/n1ql/examples/dml/update-optimizer-hint.n1ql create mode 100644 modules/n1ql/examples/select/index-all-hint.jsonc create mode 100644 modules/n1ql/examples/select/index-all-hint.n1ql create mode 100644 modules/n1ql/examples/select/no-index-hint.jsonc create mode 100644 modules/n1ql/examples/select/no-index-hint.n1ql create mode 100644 modules/n1ql/examples/select/no-use-hash-hint.jsonc create mode 100644 modules/n1ql/examples/select/no-use-hash-hint.n1ql create mode 100644 modules/n1ql/examples/select/no-use-nl-hint.jsonc create mode 100644 modules/n1ql/examples/select/no-use-nl-hint.n1ql create mode 100644 modules/n1ql/examples/select/no-use-nl-opt.jsonc create mode 100644 modules/n1ql/pages/n1ql-language-reference/negative-keyspace-hints.adoc diff --git a/modules/n1ql/assets/images/n1ql-language-reference/delete.png b/modules/n1ql/assets/images/n1ql-language-reference/delete.png index 4590d36b003987ec9eee1df44d52acce698360f5..01193ce44ae995e79586fb278ac0dc03890788d7 100644 GIT binary patch literal 16232 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 literal 15071 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 TPMP3;D}|5{krl2K)c5~C={~R0 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/gsi-all-hint-json.png b/modules/n1ql/assets/images/n1ql-language-reference/gsi-all-hint-json.png new file mode 100644 index 0000000000000000000000000000000000000000..fc2cd17f05871b47b1fb336b5c50d843ff3bd178 GIT binary patch literal 6586 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 M1$9uloN3Vi0V($DBme*a literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/gsi-all-hint-simple.png b/modules/n1ql/assets/images/n1ql-language-reference/gsi-all-hint-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..0b84f514c48f650d5a3655ae18432ce33d21a72f GIT binary patch literal 6367 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/json-hint.png b/modules/n1ql/assets/images/n1ql-language-reference/json-hint.png index ecf058aa768c3254f229eca6fe34e7298cae25eb..f7836c2409ea3740b2129d2a8e2235a271949077 100644 GIT binary patch literal 19741 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�W4ue<>YiN>-gEVM96MO)R)b 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 ao6T!*{s17Fgr3}j`6Q(%StkB9;Qs*e;v=m9 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/merge.png b/modules/n1ql/assets/images/n1ql-language-reference/merge.png index 5d09d1b941092c13325d795a7d3878126a0ae5c9..7ee0e2c01e039811bda693eb64a7f33fe757770d 100644 GIT binary patch literal 12860 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 literal 10235 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 aVtmv-CIwWb-`|XJFbXoN(p8eCLH`R@naxQ6 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/no-fts-hint-simple.png b/modules/n1ql/assets/images/n1ql-language-reference/no-fts-hint-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..3524afaff5e1f925add0d7d3a2ad72a05ebb1a30 GIT binary patch literal 10878 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 E0D2MYSO5S3 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/no-gsi-hint-json.png b/modules/n1ql/assets/images/n1ql-language-reference/no-gsi-hint-json.png new file mode 100644 index 0000000000000000000000000000000000000000..218f55869ebf12ba35e84d4fb5484f3e9b220d3e GIT binary patch literal 9328 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/no-gsi-hint-simple.png b/modules/n1ql/assets/images/n1ql-language-reference/no-gsi-hint-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..d030c5e5cef2da3fe9027428d553f253ef68360a GIT binary patch literal 10046 zcmZvCby!IwW@mSEc4l_uHy~AISxhuCG#D5d%#U(X>M$^HsL*>46eQ>;o>Y<-^ozzqPF)EG z#*YaG=5rVf%mehN&-*YipSWRQ4ozWTgfn4ah+T8r)kL8k2sV;Rk}xn0@d1x&DbO~o zhq^2Prgog-0NOw@SCEy0dHwq;>?-@)jp{0==K%wQHSqTho5qGk4qXoBqm-nk&*DiQ zvMzxv`OvG*e$*cX+`)Ot22~81hFfEeSRN1$xE#bdSbjgPl0u?%F_@`q&d)POW)ah6 zfjk%@hbt+Wx+?i|MUW4fd7g!8XyyDR-{$Pb`PS=p)z^DhobT)x9D*bc^iq)kFwvld zOa_Y@74c8M65%LXX=%|i<3syMkY1SQNSA{zE+`dH4Z`I{5TNv7oZk&TVziZnNx}Ua z&wz�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

>4cJ(R*|ZcFbnw~&Kow% literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/no-hash-hint-simple.png b/modules/n1ql/assets/images/n1ql-language-reference/no-hash-hint-simple.png new file mode 100644 index 0000000000000000000000000000000000000000..f8e0caab8bb21bf0484987b8d27fdaa83f150f31 GIT binary patch literal 9259 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≥ zvU#ZGI;rrjaN`zN^d;MS$6Zyg$``r>$Bgn`rk{OhoSJxxC_fX6X;$;PHHn0UaaZ_W zsPD%Ve=Hkw);F4}I-sn@=yx|`Z|}$|YWN9s`E&L1{4bfr?Y`3(2aKR3IZJejy4fHt zP8?A|WXUHmvP%6BDQ%g)!MB4gLuYP|4ODk)Y(v)+m(Q%ef|(r{%fRDgrcDGlc_lgH z_FUk&U#m`j^nZ8; zEw3Nm$fM6Yn*AYXj*15kAqIT?Do_6xT)1nU#y7nqlXOG(6u7hOu~?7n;pLl?`#AN( zg(j2?wyNsLT2fH&KgB-RN0b>gPFE%HNzA|=Czr16n>wq z*~kXLc8uKf$FI`e7C!!OzIJG`Nxs26j@H_(sSG}qQLBGtl$BEFt1woY6P?Kk%`yPp zFCI=mYxvadyex^Ds$U0V(lb#{wtqk~7#xiS}V1&!#Qzl28s#(qxCXI3>c`d&?#SH3n z2l{K#ffQ$T5uou{B87QpZ`JHhv@{g+mbN;Gx3r?krswx5Ij`VC3_Ojy4J_%;ed_8d zf2O+SepC_rWa00Eb|RYeFgMC0^qln8r1*p@B{eQuJ9tS(p3HdpkT&6MS||P-up4XK zimGwGm;L2s!ODSR2ePcODd{*@T%CNE0-Gcmdvh%F_~A3B((F8S`3#PSxVf2{m_0mB zLA(W9apV2iVCUHVP)}^xq$i&5THU>Sd3&zmPI6ZgSEE%_rfQgtrjql5SCeY6Hon

K6XP6vwf|8wfb%t@$_!b1)-Ca(2# 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/no-nl-hint-json.png b/modules/n1ql/assets/images/n1ql-language-reference/no-nl-hint-json.png new file mode 100644 index 0000000000000000000000000000000000000000..38c0d455f458ffa57940b86c7cfa8261c038bf6b GIT binary patch literal 10013 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 U&FA>BC=EhVR8FK?NZ;0}ws6I>EJ_%3cim&O0h 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 literal 10604 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 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/update.png b/modules/n1ql/assets/images/n1ql-language-reference/update.png index 9fa22c1c6b7c5c9eb3bf89032ab73527b1901641..c9d1102edce7803d22248cfd16252060d2874045 100644 GIT binary patch literal 16027 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 diff --git a/modules/n1ql/examples/dml/ansi-merge-hint.jsonc b/modules/n1ql/examples/dml/ansi-merge-hint.jsonc new file mode 100644 index 000000000..fa04b059a --- /dev/null +++ b/modules/n1ql/examples/dml/ansi-merge-hint.jsonc @@ -0,0 +1,174 @@ +[{ + "cardinality": 1.0210425633668097, + "cost": 81768.65420207467, + "optimizer_hints": { + "hints_followed": [ + "USE_HASH(`airport`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "PrimaryScan3", + "bucket": "travel-sample", + "index": "def_inventory_route_primary", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 24024, + "cost": 4108.612246388904, + "fr_cost": 12.170521655277593, + "size": 11 + }, + "scope": "inventory", + "using": "gsi" + }, + { + "#operator": "Fetch", + "bucket": "travel-sample", + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 24024, + "cost": 32622.23063412261, + "fr_cost": 25.35690270704806, + "size": 563 + }, + "scope": "inventory" + }, +//tag::hint[] + { + "#operator": "HashJoin", + "build_aliases": [ + "airport" + ], + "build_exprs": [ + "(`airport`.`faa`)" + ], +//end::hint[] + "on_clause": "((`route`.`sourceairpor`) = (`airport`.`faa`))", + "optimizer_estimates": { + "cardinality": 410570.1599999997, + "cost": 81726.79494524094, + "fr_cost": 1733.4006888160152, + "size": 813 + }, + "probe_exprs": [ + "(`route`.`sourceairpor`)" + ], + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "IndexScan3", + "bucket": "travel-sample", + "index": "def_inventory_airport_faa", + "index_id": "2994d0a0818fe9c2", + "index_keys": [ + "_index_key ((`airport`.`faa`))", + "_index_key ((meta(`airport`).`id`))" + ], + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1708.9999999999986, + "cost": 317.82494057645437, + "fr_cost": 12.178949643403426, + "size": 12 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "inclusion": 0, + "index_key": "`faa`", + "low": "null" + }] + }], + "using": "gsi" + }, + { + "#operator": "Fetch", + "bucket": "travel-sample", + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1708.9999999999986, + "cost": 1680.9080708833933, + "fr_cost": 24.96951905844552, + "size": 250 + }, + "scope": "inventory" + } + ] + } + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Merge", + "bucket": "travel-sample", + "can_spill": true, + "fast_discard": true, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1.0210425633668097, + "cost": 81768.65420207467, + "fr_cost": 1774.3972724409955, + "size": 563 + }, + "scope": "inventory", + "update": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Clone", + "optimizer_estimates": { + "cardinality": 1.0210425633668097, + "cost": 40.6236843724975, + "fr_cost": 39.78647495217438, + "size": 563 + } + }, + { + "#operator": "Set", + "optimizer_estimates": { + "cardinality": 1.0210425633668097, + "cost": 40.64791128350209, + "fr_cost": 39.81020257320979, + "size": 563 + }, + "set_terms": [{ + "path": "(`route`.`updated`)", + "value": "true" + }] + }, + { + "#operator": "SendUpdate", + "alias": "route", + "bucket": "travel-sample", + "fast_discard": true, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1.0210425633668097, + "cost": 41.85925683373162, + "fr_cost": 40.99658362498026, + "size": 563 + }, + "scope": "inventory" + } + ] + }, + "update_filter": "((`airport`.`city`) = \"San Jose\")" + }] + } + } + ] + }, + "text": "\nMERGE /*+ USE_HASH(airport) */ INTO route \nUSING airport \nON route.sourceairpor = airport.faa \nWHEN MATCHED THEN \nUPDATE SET route.updated = true \nWHERE airport.city = \"San Jose\";" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/dml/ansi-merge-hint.n1ql b/modules/n1ql/examples/dml/ansi-merge-hint.n1ql new file mode 100644 index 000000000..c930b3c00 --- /dev/null +++ b/modules/n1ql/examples/dml/ansi-merge-hint.n1ql @@ -0,0 +1,6 @@ +MERGE /*+ USE_HASH(airport) */ INTO route +USING airport +ON route.sourceairpor = airport.faa +WHEN MATCHED THEN +UPDATE SET route.updated = true +WHERE airport.city = "San Jose"; \ No newline at end of file diff --git a/modules/n1ql/examples/dml/delete-optimizer-hint.jsonc b/modules/n1ql/examples/dml/delete-optimizer-hint.jsonc new file mode 100644 index 000000000..9a3c33517 --- /dev/null +++ b/modules/n1ql/examples/dml/delete-optimizer-hint.jsonc @@ -0,0 +1,70 @@ +[{ + "optimizer_hints": { + "hints_followed": [ + "INDEX(`hotel` `def_inventory_hotel_city`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "IndexScan3", + "bucket": "travel-sample", + "covers": [ + "cover ((`hotel`.`city`))", + "cover ((meta(`hotel`).`id`))" + ], +//tag::index[] + "index": "def_inventory_hotel_city", + "index_id": "c31e7f44f9ff274c", + "keyspace": "hotel", + "namespace": "default", +//end::index[] + "optimizer_estimates": { + "cardinality": 132, + "cost": 75.93105014156366, + "fr_cost": 12.484326137436089, + "size": 50 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"San Francisco\"", + "inclusion": 3, + "index_key": "`city`", + "low": "\"San Francisco\"" + }] + }], + "using": "gsi" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Filter", + "alias": "hotel", + "condition": "(cover ((`hotel`.`city`)) = \"San Francisco\")", + "optimizer_estimates": { + "cardinality": 19.001090512540895, + "cost": 76.8644310927299, + "fr_cost": 12.533448631250335, + "size": 50 + } + }, + { + "#operator": "SendDelete", + "alias": "hotel", + "bucket": "travel-sample", + "fast_discard": true, + "keyspace": "hotel", + "namespace": "default", + "scope": "inventory" + } + ] + } + } + ] + }, + "text": "\nDELETE /*+ INDEX (hotel def_inventory_hotel_city) */ \nFROM `hotel`\nWHERE city = \"San Francisco\";" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/dml/delete-optimizer-hint.n1ql b/modules/n1ql/examples/dml/delete-optimizer-hint.n1ql new file mode 100644 index 000000000..9b09d71b3 --- /dev/null +++ b/modules/n1ql/examples/dml/delete-optimizer-hint.n1ql @@ -0,0 +1,6 @@ +DELETE /*+ INDEX (hotel def_inventory_hotel_city) */ +FROM `hotel` +WHERE city = "San Francisco"; + + + diff --git a/modules/n1ql/examples/dml/update-optimizer-hint.jsonc b/modules/n1ql/examples/dml/update-optimizer-hint.jsonc new file mode 100644 index 000000000..62e0a190b --- /dev/null +++ b/modules/n1ql/examples/dml/update-optimizer-hint.jsonc @@ -0,0 +1,112 @@ +[{ + "cardinality": 0.000703294230174136, + "cost": 25.16041264096158, + "optimizer_hints": { + "hints_followed": [ + "INDEX(`airport` `def_inventory_airport_city`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ +//tag::index[] + "#operator": "IndexScan3", + "bucket": "travel-sample", + "index": "def_inventory_airport_city", + "index_id": "34798b782a732137", +//end::index[] + "index_projection": { + "primary_key": true + }, + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1.1764705882352944, + "cost": 12.211117739712101, + "fr_cost": 12.179450078755286, + "size": 12 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"San Jose\"", + "inclusion": 3, + "index_key": "`city`", + "low": "\"San Jose\"" + }] + }], + "using": "gsi" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Fetch", + "bucket": "travel-sample", + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1.1764705882352944, + "cost": 25.141199404467507, + "fr_cost": 24.97001949379738, + "size": 250 + }, + "scope": "inventory" + }, + { + "#operator": "Filter", + "alias": "airport", + "condition": "((`airport`.`city`) = \"San Jose\")", + "optimizer_estimates": { + "cardinality": 0.000703294230174136, + "cost": 25.159801037762616, + "fr_cost": 24.98862112709249, + "size": 250 + } + }, + { + "#operator": "Clone", + "optimizer_estimates": { + "cardinality": 0.000703294230174136, + "cost": 25.15984551799527, + "fr_cost": 24.988665607325142, + "size": 250 + } + }, + { + "#operator": "Set", + "optimizer_estimates": { + "cardinality": 0.000703294230174136, + "cost": 25.15985663805343, + "fr_cost": 24.988676727383304, + "size": 250 + }, + "set_terms": [{ + "path": "(`airport`.`updated`)", + "value": "true" + }] + }, + { + "#operator": "SendUpdate", + "alias": "airport", + "bucket": "travel-sample", + "fast_discard": true, + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 0.000703294230174136, + "cost": 25.16041264096158, + "fr_cost": 24.989232730291455, + "size": 250 + }, + "scope": "inventory" + } + ] + } + } + ] + }, + "text": "\nUPDATE /*+ INDEX(airport def_inventory_airport_city) */ airport \nSET updated = true \nWHERE city = \"San Jose\";" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/dml/update-optimizer-hint.n1ql b/modules/n1ql/examples/dml/update-optimizer-hint.n1ql new file mode 100644 index 000000000..0f44b6071 --- /dev/null +++ b/modules/n1ql/examples/dml/update-optimizer-hint.n1ql @@ -0,0 +1,3 @@ +UPDATE /*+ INDEX(airport def_inventory_airport_city) */ airport +SET updated = true +WHERE city = "San Jose"; \ No newline at end of file diff --git a/modules/n1ql/examples/select/index-all-hint.jsonc b/modules/n1ql/examples/select/index-all-hint.jsonc new file mode 100644 index 000000000..99e9c3dd3 --- /dev/null +++ b/modules/n1ql/examples/select/index-all-hint.jsonc @@ -0,0 +1,156 @@ +[{ + "cardinality": 0.0000059464345178630886, + "cost": 12.220073379662029, + "optimizer_hints": { + "hints_followed": [ + "INDEX_ALL(`route` `def_inventory_route_route_src_dst_day` `def_inventory_route_sourceairport`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Sequence", + "~children": [{ + "#operator": "IntersectScan", + "all_scan": true, + "limit": "1", + "optimizer_estimates": { + "cardinality": 0.0000059464345178630886, + "cost": 12.196267064485678, + "fr_cost": 12.196267064485678, + "size": 11 + }, + "scans": [{ + "#operator": "DistinctScan", + "optimizer_estimates": { + "cardinality": 0.14285714285714285, + "cost": 12.196267064485678, + "fr_cost": 12.196267064485678, + "size": 11 + }, +// tag::index[] + "scan": { + "#operator": "IndexScan3", + "bucket": "travel-sample", + "index": "def_inventory_route_route_src_dst_day", + "index_id": "6c6a9ea47d763bf1", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1, + "cost": 12.172539443450269, + "fr_cost": 12.172539443450269, + "size": 11 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"SFO\"", + "inclusion": 3, + "index_key": "`sourceairport`", + "low": "\"SFO\"" + }] + }], + "using": "gsi" + } + }, + { + "#operator": "IndexScan3", + "bucket": "travel-sample", + "index": "def_inventory_route_sourceairport", + "index_id": "f1b4c81456c850f0", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1, + "cost": 12.171488093767262, + "fr_cost": 12.171488093767262, + "size": 11 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"SFO\"", + "inclusion": 3, + "index_key": "`sourceairport`", + "low": "\"SFO\"" + }] + }], + "using": "gsi" + } +// end::index[] + + ] + }, + { + "#operator": "Fetch", + "bucket": "travel-sample", + "early_projection": [ + "id", + "sourceairport" + ], + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 0.0000059464345178630886, + "cost": 12.19634547643713, + "fr_cost": 12.19634547643713, + "size": 563 + }, + "scope": "inventory" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Filter", + "condition": "((`route`.`sourceairport`) = \"SFO\")", + "optimizer_estimates": { + "cardinality": 0.0000059464345178630886, + "cost": 12.196345617531875, + "fr_cost": 12.196345617531875, + "size": 563 + } + }, + { + "#operator": "InitialProject", + "discard_original": true, + "optimizer_estimates": { + "cardinality": 0.0000059464345178630886, + "cost": 12.19634575862662, + "fr_cost": 12.19634575862662, + "size": 563 + }, + "preserve_order": true, + "result_terms": [{ + "expr": "(`route`.`id`)" + }] + } + ] + } + } + ] + }, + { + "#operator": "Limit", + "expr": "1", + "optimizer_estimates": { + "cardinality": 0.0000059464345178630886, + "cost": 12.220073379662029, + "fr_cost": 12.220073379662029, + "size": 563 + } + } + ] + }, + "text": "\n/* tag::query[] */\nSELECT /*+ INDEX_ALL(route def_inventory_route_route_src_dst_day def_inventory_route_sourceairport) */ id -- \u003c.\u003e\nFROM route -- \u003c.\u003e\nWHERE sourceairport = \"SFO\"\nLIMIT 1;\n/* end::query[] */" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/select/index-all-hint.n1ql b/modules/n1ql/examples/select/index-all-hint.n1ql new file mode 100644 index 000000000..630964b96 --- /dev/null +++ b/modules/n1ql/examples/select/index-all-hint.n1ql @@ -0,0 +1,11 @@ +UPDATE STATISTICS FOR route +INDEX (def_inventory_route_route_src_dst_day, def_inventory_route_sourceairport); + +EXPLAIN +/* tag::query[] */ +SELECT /*+ INDEX_ALL(route def_inventory_route_route_src_dst_day def_inventory_route_sourceairport) */ -- <.> + id +FROM route -- <.> +WHERE sourceairport = "SFO" +LIMIT 1; +/* end::query[] */ \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-index-hint.jsonc b/modules/n1ql/examples/select/no-index-hint.jsonc new file mode 100644 index 000000000..c42446540 --- /dev/null +++ b/modules/n1ql/examples/select/no-index-hint.jsonc @@ -0,0 +1,116 @@ +[{ + "cardinality": 0.14285714285714285, + "cost": 14.110542727498412, + "optimizer_hints": { + "hints_followed": [ + "NO_INDEX(`route` `def_inventory_route_sourceairport`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Sequence", + "~children": [{ + "#operator": "DistinctScan", + "limit": "1", + "optimizer_estimates": { + "cardinality": 0.14285714285714285, + "cost": 12.196267064485678, + "fr_cost": 12.196267064485678, + "size": 11 + }, +// tag::index[] + "scan": { + "#operator": "IndexScan3", + "bucket": "travel-sample", + "index": "def_inventory_route_route_src_dst_day", +// end::index[] + "index_id": "bb8e1248fc9a7a5f", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 1, + "cost": 12.172539443450269, + "fr_cost": 12.172539443450269, + "size": 11 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"SFO\"", + "inclusion": 3, + "index_key": "`sourceairport`", + "low": "\"SFO\"" + }] + }], + "using": "gsi" + } + }, + { + "#operator": "Fetch", + "bucket": "travel-sample", + "early_projection": [ + "id", + "sourceairport" + ], + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 0.14285714285714285, + "cost": 14.080035786167173, + "fr_cost": 14.080035786167173, + "size": 563 + }, + "scope": "inventory" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Filter", + "condition": "((`route`.`sourceairport`) = \"SFO\")", + "optimizer_estimates": { + "cardinality": 0.14285714285714285, + "cost": 14.083425446315088, + "fr_cost": 14.083425446315088, + "size": 563 + } + }, + { + "#operator": "InitialProject", + "discard_original": true, + "optimizer_estimates": { + "cardinality": 0.14285714285714285, + "cost": 14.086815106463003, + "fr_cost": 14.086815106463003, + "size": 563 + }, + "preserve_order": true, + "result_terms": [{ + "expr": "(`route`.`id`)" + }] + } + ] + } + } + ] + }, + { + "#operator": "Limit", + "expr": "1", + "optimizer_estimates": { + "cardinality": 0.14285714285714285, + "cost": 14.110542727498412, + "fr_cost": 14.110542727498412, + "size": 563 + } + } + ] + }, + "text": "\n/* tag::query[] */\nSELECT /*+ NO_INDEX (route def_inventory_route_sourceairport) */ id\nFROM route\nWHERE sourceairport = \"SFO\"\nLIMIT 1;\n/* end::query[] */" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-index-hint.n1ql b/modules/n1ql/examples/select/no-index-hint.n1ql new file mode 100644 index 000000000..7ec2fdae8 --- /dev/null +++ b/modules/n1ql/examples/select/no-index-hint.n1ql @@ -0,0 +1,10 @@ +UPDATE STATISTICS FOR route +INDEX (def_inventory_route_route_src_dst_day, def_inventory_route_sourceairport); + +EXPLAIN +/* tag::query[] */ +SELECT /*+ NO_INDEX (route def_inventory_route_sourceairport) */ id +FROM route +WHERE sourceairport = "SFO" +LIMIT 1; +/* end::query[] */ \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-use-hash-hint.jsonc b/modules/n1ql/examples/select/no-use-hash-hint.jsonc new file mode 100644 index 000000000..1dc7bd78b --- /dev/null +++ b/modules/n1ql/examples/select/no-use-hash-hint.jsonc @@ -0,0 +1,136 @@ +[{ + "cardinality": 1, + "cost": 343461.208298278, + "optimizer_hints": { + "hints_followed": [ + "NO_USE_HASH(`aline`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "PrimaryScan3", + "as": "rte", + "bucket": "travel-sample", + "index": "def_inventory_route_primary", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 24024, + "cost": 4108.612246388904, + "fr_cost": 12.170521655277593, + "size": 11 + }, + "scope": "inventory", + "using": "gsi" + }, + { + "#operator": "Fetch", + "as": "rte", + "bucket": "travel-sample", + "early_projection": [ + "airlineid" + ], + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 24024, + "cost": 32622.23063412261, + "fr_cost": 25.35690270704806, + "size": 563 + }, + "scope": "inventory" + }, +//tag::join[] + { + "#operator": "Join", + "as": "aline", + "bucket": "travel-sample", + "keyspace": "airline", + "namespace": "default", + "on_keys": "(`rte`.`airlineid`)", + "optimizer_estimates": { + "cardinality": 44924.88, + "cost": 343011.9112140067, + "fr_cost": 343011.9112140067, + "size": 800 + }, + "scope": "inventory" + }, +//end::join[] + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "InitialGroup", + "aggregates": [ + "count(1)" + ], + "flags": 4, + "group_keys": [], + "optimizer_estimates": { + "cardinality": 1, + "cost": 343461.1600140067, + "fr_cost": 343461.1600140067, + "size": 800 + } + }] + } + }, + { + "#operator": "IntermediateGroup", + "aggregates": [ + "count(1)" + ], + "flags": 4, + "group_keys": [], + "optimizer_estimates": { + "cardinality": 1, + "cost": 343461.1700140067, + "fr_cost": 343461.1700140067, + "size": 800 + } + }, + { + "#operator": "FinalGroup", + "aggregates": [ + "count(1)" + ], + "flags": 4, + "group_keys": [], + "optimizer_estimates": { + "cardinality": 1, + "cost": 343461.18001400674, + "fr_cost": 343461.18001400674, + "size": 800 + } + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "InitialProject", + "discard_original": true, + "optimizer_estimates": { + "cardinality": 1, + "cost": 343461.208298278, + "fr_cost": 343461.208298278, + "size": 800 + }, + "preserve_order": true, + "result_terms": [{ + "as": "Total_Count", + "expr": "count(1)" + }] + }] + } + } + ] + }, + "text": "\n/* tag::query[] */\nSELECT /*+ NO_USE_HASH(aline) */\n COUNT(1) AS Total_Count\nFROM route rte\nINNER JOIN airline aline\nON rte.airlineid = META(aline).id;\n/* end::query[] */" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-use-hash-hint.n1ql b/modules/n1ql/examples/select/no-use-hash-hint.n1ql new file mode 100644 index 000000000..4dbe64886 --- /dev/null +++ b/modules/n1ql/examples/select/no-use-hash-hint.n1ql @@ -0,0 +1,11 @@ +UPDATE STATISTICS FOR airline INDEX (def_inventory_airline_primary); +UPDATE STATISTICS FOR route INDEX (def_inventory_route_primary); + +EXPLAIN +/* tag::query[] */ +SELECT /*+ NO_USE_HASH(aline) */ + COUNT(1) AS Total_Count +FROM route rte +INNER JOIN airline aline +ON rte.airlineid = META(aline).id; +/* end::query[] */ \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-use-nl-hint.jsonc b/modules/n1ql/examples/select/no-use-nl-hint.jsonc new file mode 100644 index 000000000..c00012180 --- /dev/null +++ b/modules/n1ql/examples/select/no-use-nl-hint.jsonc @@ -0,0 +1,212 @@ +[{ + "cardinality": 4, + "cost": 412.42345196606027, + "optimizer_hints": { + "hints_followed": [ + "NO_USE_NL(`a`)" + ] + }, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Sequence", + "~children": [{ + "#operator": "IndexScan3", + "as": "a", + "bucket": "travel-sample", + "index": "def_inventory_airport_faa", + "index_id": "2994d0a0818fe9c2", + "index_keys": [ + "_index_key ((`a`.`faa`))", + "_index_key ((meta(`a`).`id`))" + ], + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 230.78165424160022, + "cost": 354.84993039032815, + "fr_cost": 18.20421484909891, + "size": 12 + }, + "probe_bit_filters": [{ + "alias": "r", + "index_bit_filters": [{ + "bit_filter_expressions": [ + "_index_key ((`a`.`faa`))" + ], + "index_id": "2994d0a0818fe9c2", + "index_name": "def_inventory_airport_faa" + }] + }], + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "inclusion": 0, + "index_key": "`faa`", + "low": "null" + }] + }], + "using": "gsi" + }, + { + "#operator": "Fetch", + "as": "a", + "bucket": "travel-sample", + "early_projection": [ + "airportname", + "faa" + ], + "keyspace": "airport", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 230.78165424160022, + "cost": 549.298847786557, + "fr_cost": 30.994784264141003, + "size": 250 + }, + "scope": "inventory" + }, +//tag::join[] + { + "#operator": "HashJoin", + "build_aliases": [ + "r" + ], +//end::join[] + "build_exprs": [ + "(`r`.`sourceairport`)" + ], + "filter": "((`a`.`faa`) = (`r`.`sourceairport`))", + "on_clause": "(((`r`.`sourceairport`) = \"SFO\") and ((`a`.`faa`) = (`r`.`sourceairport`)))", + "optimizer_estimates": { + "cardinality": 241.59705066624267, + "cost": 956.7841124942512, + "fr_cost": 405.29026741890357, + "size": 813 + }, + "probe_exprs": [ + "(`a`.`faa`)" + ], + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "IndexScan3", + "as": "r", + "bucket": "travel-sample", + "index": "def_inventory_route_sourceairport", + "index_id": "cf7cdf6f0e78208", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 249, + "cost": 54.700535348048334, + "fr_cost": 12.171488093767262, + "size": 11 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"SFO\"", + "inclusion": 3, + "index_key": "`sourceairport`", + "low": "\"SFO\"" + }] + }], + "using": "gsi" + }, + { + "#operator": "Fetch", + "as": "r", + "bucket": "travel-sample", + "early_projection": [ + "id", + "sourceairport" + ], + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 249, + "cost": 362.1094172388947, + "fr_cost": 25.35786914553773, + "size": 563 + }, + "scope": "inventory" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Filter", + "alias": "r", + "build_bit_filters": [{ + "alias": "a", + "index_bit_filters": [{ + "bit_filter_expressions": [ + "(`r`.`sourceairport`)" + ], + "index_id": "2994d0a0818fe9c2", + "index_name": "def_inventory_airport_faa", + "size": 251 + }] + }], + "condition": "((`r`.`sourceairport`) = \"SFO\")", + "optimizer_estimates": { + "cardinality": 249, + "cost": 368.01759487671166, + "fr_cost": 25.38159676657314, + "size": 563 + } + }] + } + } + ] + } + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "InitialProject", + "discard_original": true, + "optimizer_estimates": { + "cardinality": 241.59705066624267, + "cost": 970.5615007323869, + "fr_cost": 405.3472937286211, + "size": 813 + }, + "preserve_order": true, + "result_terms": [{ + "as": "airport", + "expr": "(`a`.`airportname`)" + }, + { + "as": "route", + "expr": "(`r`.`id`)" + } + ] + }] + } + } + ] + }, + { + "#operator": "Limit", + "expr": "4", + "optimizer_estimates": { + "cardinality": 4, + "cost": 412.42345196606027, + "fr_cost": 405.37580688347987, + "size": 813 + } + } + ] + }, + "text": "\n/* tag::query[] */\nSELECT /*+ NO_USE_NL (a) */ \n a.airportname AS airport, r.id AS route\nFROM route AS r,\n airport AS a\nWHERE a.faa = r.sourceairport\n AND r.sourceairport = \"SFO\"\nLIMIT 4;\n/* end::query[] */" +}] \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-use-nl-hint.n1ql b/modules/n1ql/examples/select/no-use-nl-hint.n1ql new file mode 100644 index 000000000..09cd56b81 --- /dev/null +++ b/modules/n1ql/examples/select/no-use-nl-hint.n1ql @@ -0,0 +1,13 @@ +UPDATE STATISTICS FOR route INDEX (def_inventory_route_sourceairport); +UPDATE STATISTICS FOR airport INDEX (def_inventory_airport_faa); + +EXPLAIN +/* tag::query[] */ +SELECT /*+ NO_USE_NL (a) */ + a.airportname AS airport, r.id AS route +FROM route AS r, + airport AS a +WHERE a.faa = r.sourceairport + AND r.sourceairport = "SFO" +LIMIT 4; +/* end::query[] */ \ No newline at end of file diff --git a/modules/n1ql/examples/select/no-use-nl-opt.jsonc b/modules/n1ql/examples/select/no-use-nl-opt.jsonc new file mode 100644 index 000000000..c33152aae --- /dev/null +++ b/modules/n1ql/examples/select/no-use-nl-opt.jsonc @@ -0,0 +1,175 @@ +[{ + "cardinality": 4, + "cost": 312.2107947751393, + "plan": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Sequence", + "~children": [{ + "#operator": "IndexScan3", + "as": "r", + "bucket": "travel-sample", + "index": "def_inventory_route_sourceairport", + "index_id": "cf7cdf6f0e78208", + "index_projection": { + "primary_key": true + }, + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 249, + "cost": 54.700535348048334, + "fr_cost": 12.171488093767262, + "size": 11 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "\"SFO\"", + "inclusion": 3, + "index_key": "`sourceairport`", + "low": "\"SFO\"" + }] + }], + "using": "gsi" + }, + { + "#operator": "Fetch", + "as": "r", + "bucket": "travel-sample", + "early_projection": [ + "id", + "sourceairport" + ], + "keyspace": "route", + "namespace": "default", + "optimizer_estimates": { + "cardinality": 249, + "cost": 362.1094172388947, + "fr_cost": 25.35786914553773, + "size": 563 + }, + "scope": "inventory" + }, + { + "#operator": "Parallel", + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "Filter", + "alias": "r", + "condition": "((`r`.`sourceairport`) = \"SFO\")", + "optimizer_estimates": { + "cardinality": 249, + "cost": 368.01759487671166, + "fr_cost": 25.38159676657314, + "size": 563 + } + }, +//tag::join[] + { + "#operator": "NestedLoopJoin", + "alias": "a", + "filter": "((`a`.`faa`) = (`r`.`sourceairport`))", + "on_clause": "(((`a`.`faa`) = (`r`.`sourceairport`)))", +// end::join[] + "optimizer_estimates": { + "cardinality": 241.59705066624267, + "cost": 6435.023226547025, + "fr_cost": 234.641738794378, + "size": 813 + }, + "~child": { + "#operator": "Sequence", + "~children": [{ + "#operator": "IndexScan3", + "as": "a", + "bucket": "travel-sample", + "index": "def_inventory_airport_faa", + "index_id": "2994d0a0818fe9c2", + "index_projection": { + "primary_key": true + }, + "keyspace": "airport", + "namespace": "default", + "nested_loop": true, + "optimizer_estimates": { + "cardinality": 0.970269279784107, + "cost": 11.816860699031949, + "fr_cost": 11.816860699031949, + "size": 12 + }, + "scope": "inventory", + "spans": [{ + "exact": true, + "range": [{ + "high": "(`r`.`sourceairport`)", + "inclusion": 3, + "index_key": "`faa`", + "low": "(`r`.`sourceairport`)" + }] + }], + "using": "gsi" + }, + { + "#operator": "Fetch", + "as": "a", + "bucket": "travel-sample", + "early_projection": [ + "airportname", + "faa" + ], + "keyspace": "airport", + "namespace": "default", + "nested_loop": true, + "optimizer_estimates": { + "cardinality": 0.970269279784107, + "cost": 24.22715727339347, + "fr_cost": 24.22715727339347, + "size": 250 + }, + "scope": "inventory" + } + ] + } + }, + { + "#operator": "InitialProject", + "discard_original": true, + "optimizer_estimates": { + "cardinality": 241.59705066624267, + "cost": 6448.80061478516, + "fr_cost": 234.69876510409554, + "size": 813 + }, + "preserve_order": true, + "result_terms": [{ + "as": "airport", + "expr": "(`a`.`airportname`)" + }, + { + "as": "route", + "expr": "(`r`.`id`)" + } + ] + } + ] + } + } + ] + }, + { + "#operator": "Limit", + "expr": "4", + "optimizer_estimates": { + "cardinality": 4, + "cost": 312.2107947751393, + "fr_cost": 234.7272782589543, + "size": 813 + } + } + ] + }, + "text": "\n/* tag::query[] */\nSELECT a.airportname AS airport, r.id AS route\nFROM route AS r,\n airport AS a\nWHERE a.faa = r.sourceairport\n AND r.sourceairport = \"SFO\"\nLIMIT 4;\n/* end::query[] */" +}] \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc b/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc index f34966d95..e7f8f1d4d 100644 --- a/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/cost-based-optimizer.adoc @@ -147,6 +147,10 @@ With the cost-based optimizer, different join orders can be considered, and the Refer to {ordered-hint}[ORDERED] for an example. +NOTE: The cost-based optimizer can also exclude certain indexes or join methods when evaluating query plans. +This is particularly useful when you know some options are inefficient and not suitable for your query. +For more information, see xref:n1ql-language-reference/negative-keyspace-hints.adoc[]. + [[optimizer-stats]] == Optimizer Statistics diff --git a/modules/n1ql/pages/n1ql-language-reference/delete.adoc b/modules/n1ql/pages/n1ql-language-reference/delete.adoc index 58f15fd41..3e013a020 100644 --- a/modules/n1ql/pages/n1ql-language-reference/delete.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/delete.adoc @@ -14,6 +14,7 @@ // TEMP include::partial$n1ql-language-reference/horizontal-style.adoc[] +include::partial$n1ql-language-reference/collapsible-style.adoc[] {description} @@ -61,13 +62,26 @@ image::n1ql-language-reference/delete.png["Syntax diagram: refer to source code // TODO: Automatic links from EBNF [horizontal.compact] +hint-comment:: <> icon:caret-down[] target-keyspace:: <> icon:caret-down[] -use-keys-clause:: <> icon:caret-down[] +use-keys-clause:: <> icon:caret-down[] where-clause:: <> icon:caret-down[] limit-clause:: <> icon:caret-down[] offset-clause:: <> icon:caret-down[] returning-clause:: <> icon:caret-down[] +[[hint-comment]] +=== Optimizer Hints + +[.status]#Couchbase Server 8.0# + +You can supply hints to the optimizer within a specially formatted hint comment. +For more information, see xref:n1ql-language-reference/optimizer-hints.adoc[]. + +NOTE: DELETE statements support only index hints. +Other hints, such as join hints and ORDERED hints, are not supported. +For an example of using an optimizer hint, see <>. + [[delete-target]] === Delete Target @@ -120,12 +134,15 @@ For details, refer to {as-clause}[AS Clause]. Assigning an alias to the keyspace reference is optional. If you assign an alias to the keyspace reference, the `AS` keyword may be omitted. -[[delete-hint]] -=== Delete Hint +[[use-keys-clause]] +=== USE KEYS Clause You can use a `USE KEYS` hint on the delete target to specify the keys of the data items to be deleted. For details, refer to {use-keys-clause}[USE KEYS Clause]. +NOTE: You cannot specify a hint for the same keyspace using both the USE KEYS clause and an <>. +If you do this, the USE KEYS clause and the <> are both marked as erroneous and ignored by the optimizer. + [[where-clause]] === WHERE Clause @@ -308,4 +325,24 @@ include::example$dml/delete-offset.jsonc[] <.> Documents with the first 10 ids--the offset--remain in the airline collection. <.> After deleting 10 documents--the limit--1 more document remains in the collection. +==== + +[[ex-delete-opt-hint]] +.Delete query with an optimizer hint +==== + +The following query hints the optimizer to use the index, `def_inventory_hotel_city`. + +[source,sqlpp] +---- +include::example$dml/delete-optimizer-hint.n1ql[] +---- + +If you examine the plan for this query, you can see that the query uses the suggested index. + +.Results +[source,json,indent=0] +---- +include::example$dml/delete-optimizer-hint.jsonc[tag=index] +---- ==== \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/keyspace-hints.adoc b/modules/n1ql/pages/n1ql-language-reference/keyspace-hints.adoc index 2762af7da..2e08e9d4d 100644 --- a/modules/n1ql/pages/n1ql-language-reference/keyspace-hints.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/keyspace-hints.adoc @@ -21,6 +21,9 @@ If the keyspace is _not_ given an explicit alias in the query, the hint must ref There are two possible formats for each optimizer hint: simple syntax and JSON syntax. Note that you cannot mix simple syntax and JSON syntax in the same hint comment. +TIP: While most keyspace hints guide the optimizer to use certain indexes or join methods, you can also use negative hints to instruct the optimizer what not to use. +For more information, see xref:n1ql-language-reference/negative-keyspace-hints.adoc[Negative Keyspace Hints]. + == INDEX This hint directs the optimizer to consider one or more specified secondary indexes. @@ -62,6 +65,7 @@ With the JSON syntax, this hint takes the form of an `index` property. You may only use this property once within the hint comment. The value of this property may be an <> or an <>. +// tag::index-array[] [#index-array] ==== Index Array @@ -126,7 +130,7 @@ A secondary index that the optimizer should consider for the given keyspace. An array of _index_ strings:: An array of secondary indexes that the optimizer should consider for the given keyspace. - +// end::index-array[] [#index-examples,reftext="INDEX Examples"] === Examples @@ -178,6 +182,25 @@ include::example$select/index-hint.jsonc[tag=index] ---- ==== +.INDEX hint in an UPDATE statement +==== + +The following query hints that the optimizer should use the index `def_inventory_airport_city` for the keyspace `airport` when updating documents. + +[source,sqlpp] +---- +include::example$dml/update-optimizer-hint.n1ql[] +---- + +If you examine the plan for this query, you can see that the query uses the suggested index. + +.Explain plan +[source,json,indent=0] +---- +include::example$dml/update-optimizer-hint.jsonc[tag=index] +---- +==== + === Legacy Equivalent This hint is equivalent to the legacy `USE INDEX (USING GSI)` clause. @@ -186,6 +209,195 @@ For more details, refer to xref:n1ql-language-reference/hints.adoc#use-index-cla Note that you cannot use a hint comment and the `USE` clause to specify optimizer hints on the same keyspace. If you do this, the hint comment and the `USE` clause are marked as erroneous and ignored by the optimizer. +== INDEX_ALL + +This hint directs the optimizer to consider all specified secondary indexes. + +When you apply the hint on a keyspace, the optimizer performs an intersect scan across all specified indexes. +This process differs from a typical intersect scan and does not end early even when enough document IDs are found. +Instead, it waits for all index scans to complete before intersecting the documents IDs. + +Furthermore, the hint operates on an all-or-nothing basis. +The optimizer uses this hint only if all specified indexes are usable. +If even one of the indexes is not usable (for example, due to the lack of necessary predicates on index keys), the optimizer ignores the hint entirely and reverts to the standard index selection process. +It does not attempt to use only a subset of the indexes. + +If you do not specify this hint, the optimizer selects the optimal available index. + +[NOTE] +==== + +To use the INDEX_ALL hint effectively: + +* You must specify at least two indexes for the hint to be valid. + +* You can only use GSI indexes. +The hint does not support FTS indexes. + +* You cannot mix INDEX_ALL with other index hints for the same keyspace. +It must be the only index hint present. + +* You can use the hint on a keyspace on the right-hand side of an ANSI JOIN or ANSI NEST. + +* You cannot use it on a keyspace on the inner side of a legacy JOIN or NEST, like LOOKUP JOIN/NEST or INDEX JOIN/NEST. + +* INDEX_COMBINE is an alias for INDEX_ALL. +You can use either as the hint keyword. + +* Negative hints are not available for INDEX_ALL. +==== + +=== Simple Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=gsi-all-hint-simple] +---- + +image::n1ql-language-reference/gsi-all-hint-simple.png["Syntax diagram: refer to source code listing", align=left] + +With the simple syntax, this hint specifies a single keyspace expression along with zero, one, or more indexes. +You can use this hint multiple times within the hint comment to specify hints for more than one keyspace. + +NOTE: You must specify at least two indexes. +The hint is invalid if you provide zero or one index. + +==== Arguments + +keyspace:: +The keyspace or alias to which this hint applies. + +index:: +A secondary index that the optimizer should consider for the given keyspace. +This argument is optional. +If omitted, the optimizer considers all secondary indexes available in the given keyspace. + +=== JSON Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=gsi-all-hint-json] +---- + +image::n1ql-language-reference/gsi-all-hint-json.png["Syntax diagram: refer to source code listing", align=left] + +With the JSON syntax, this hint takes the form of an `index_all` property. +You may only use this property once within the hint comment. +The value of this property may be an <> or an <>. + +[#index-array-all] +==== Index Array + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=index-array] +---- + +image::n1ql-language-reference/index-array.png["Syntax diagram: refer to source code listing", align=left] + +Use this array to specify indexes for multiple keyspaces. +Each element must be an <>. + +[#index-object-all] +==== Index Object + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=index-object] +---- + +image::n1ql-language-reference/index-object.png["Syntax diagram: refer to source code listing", align=left] + +Use this object to specify indexes for a single keyspace. +It must contain a <> and an <>. +The order of the properties within the object is not significant. + +[#keyspace-property-all] +==== Keyspace Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-property] +---- + +image::n1ql-language-reference/keyspace-property.png["Syntax diagram: refer to source code listing", align=left] + +Synonym for `"keyspace"`: `"alias"` + +The value of this property is the keyspace or alias to which this hint applies. + +[#indexes-property-all] +==== Indexes Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=indexes-property] +---- + +image::n1ql-language-reference/indexes-property.png["Syntax diagram: refer to source code listing", align=left] + +The value of this property may be: + +[horizontal] +null:: +The optimizer considers all secondary indexes available in the given keyspace. + +An index string:: +A secondary index that the optimizer should consider for the given keyspace. + +An array of index strings:: +An array of secondary indexes that the optimizer should consider for the given keyspace. + +[#index-all-examples,reftext="INDEX_ALL Examples"] +=== Examples + +{cbo-preamble} + +include::ROOT:partial$query-context.adoc[tag=section] + +[#ex-index-all-opt] +.Optimized index selection +==== +The following query does not include an index hint. + +.Query +[source,sqlpp] +---- +include::example$select/index-opt.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the optimizer has selected the index `def_inventory_route_sourceairport`, which is installed with the travel sample dataset. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/index-opt.jsonc[tag=index] +---- +==== + +[#ex-index-all-hint] +.INDEX_ALL hint +==== +The following query hints that the optimizer should select indexes `def_inventory_route_route_src_dst_day` and `def_inventory_route_sourceairport` for the keyspace `route`. + +.Query +[source,sqlpp] +---- +include::example$select/index-all-hint.n1ql[tag=query] +---- +<.> The keyspace is not given an explicit alias in the query. +You must therefore refer to the keyspace using the keyspace name or implicit alias -- in this case, `route`. +<.> The implicit alias is the last element in the keyspace path. + +If you examine the plan for this query, you can see that the query uses the suggested index. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/index-all-hint.jsonc[tag=index] +---- +==== + == INDEX_FTS This hint directs the optimizer to consider one or more specified full-text indexes. @@ -328,6 +540,8 @@ This hint directs the optimizer to consider a nested-loop join for the specified This hint must be specified on the keyspace on the right-hand side of the join. If not specified, the optimizer selects the optimal join method. +NOTE: This hint is only available in xref:n1ql-language-reference/selectclause.adoc[SELECT] and xref:n1ql-language-reference/merge.adoc[MERGE] statements. + === Simple Syntax [source,ebnf] @@ -471,6 +685,10 @@ Typically, this means you want the build side to be used on the smaller of the t This hint enables you specify whether the right side of the join should be the build side or the probe side. If you specify that the right side of the join is the build side, then the left side will be the probe side, and vice versa. +[NOTE] +==== +This hint is only available in xref:n1ql-language-reference/selectclause.adoc[SELECT] and xref:n1ql-language-reference/merge.adoc[MERGE] statements. +==== === Simple Syntax @@ -681,4 +899,5 @@ If you do this, the optimizer hints and the `USE` clause are both marked as erro * xref:n1ql-language-reference/cost-based-optimizer.adoc[] * xref:n1ql-language-reference/optimizer-hints.adoc[] -* xref:n1ql-language-reference/query-hints.adoc[] \ No newline at end of file +* xref:n1ql-language-reference/query-hints.adoc[] +* xref:n1ql-language-reference/negative-keyspace-hints.adoc[] \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/merge.adoc b/modules/n1ql/pages/n1ql-language-reference/merge.adoc index 0176afdb2..2c8fc3d45 100644 --- a/modules/n1ql/pages/n1ql-language-reference/merge.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/merge.adoc @@ -74,11 +74,23 @@ image::n1ql-language-reference/merge.png["Syntax diagram: refer to source code l // TODO: Automatic links from EBNF [horizontal.compact] +hint-comment:: <> icon:caret-down[] ansi-merge:: <> icon:caret-down[] lookup-merge:: <> icon:caret-down[] limit-clause:: <> icon:caret-down[] returning-clause:: <> icon:caret-down[] +[[hint-comment]] +=== Optimizer Hints +[.status]#Couchbase Server 8.0# + +You can supply hints to the optimizer within a specially formatted hint comment. +For more information, see xref:n1ql-language-reference/optimizer-hints.adoc[]. + +NOTE: Optimizer hints are available only in <>. +You can use both hash and join hints, but ORDERED hints are not supported. +For an example of using an optimizer hint, see <>. + [[ansi-merge]] == ANSI Merge @@ -154,9 +166,16 @@ If you assign an alias to the keyspace reference, the `AS` keyword may be omitte You can use a `USE INDEX` hint on the merge target to specify that the merge should use a particular index. For details, refer to {use-index-clause}[USE INDEX Clause]. -NOTE: The `USE INDEX` hint is the only hint allowed on the target. +[NOTE] +==== +The `USE INDEX` hint is the only hint allowed on the target. You cannot specify a `USE KEYS` hint or a join hint (`USE NL` or `USE HASH`) on the target of a merge statement. +In Couchbase Server 8.0 and later, you can also use <> on the merge target. +However, you cannot specify a hint for the same keyspace using both the USE clause and an optimizer hint. +If you do this, the USE clause and the optimizer hint are both marked as erroneous and ignored by the optimizer. +==== + [[ansi-merge-source]] === ANSI Merge Source @@ -307,6 +326,10 @@ If omitted, the default hint is `USE NL`. If you are using a nested-loop join, i.e. `USE NL` is specified or no join hint is specified, the target keyspace reference must have an appropriate secondary index defined for the join to work. If such an index cannot be found an error will be returned. + +In Couchbase Server 8.0 and later, you can also use <> on the merge source. +However, you cannot specify a hint for the same keyspace using both the USE clause and an optimizer hint. +If you do this, the USE clause and the optimizer hint are both marked as erroneous and ignored by the optimizer. -- [[ansi-merge-predicate]] @@ -749,6 +772,25 @@ include::example$dml/ansi-merge-expire.n1ql[] Note that it is possible to preserve the document expiration using the request-level {preserve_expiry}[preserve_expiry] parameter. ==== +[[example-5]] +.ANSI merge with an optimizer hint +==== + +The following query hints the optimizer to use a hash join for the keyspace `airport`. + +[source,sqlpp] +---- +include::example$dml/ansi-merge-hint.n1ql[] +---- + +If you examine the query plan, you can see that it uses the suggested join method. + +[source,json,indent=0] +---- +include::example$dml/ansi-merge-hint.jsonc[tag=hint] +---- +==== + .Lookup merge with expression source ==== Lookup merge version of <>. diff --git a/modules/n1ql/pages/n1ql-language-reference/negative-keyspace-hints.adoc b/modules/n1ql/pages/n1ql-language-reference/negative-keyspace-hints.adoc new file mode 100644 index 000000000..272fd5ba9 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/negative-keyspace-hints.adoc @@ -0,0 +1,605 @@ += Negative Keyspace Hints +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:imagesdir: ../../assets/images +:description: Negative hints direct the optimizer not to use certain indexes or join methods. +:cbo-preamble: For the examples in this section, it's assumed that the cost-based optimizer is active, and all optimizer statistics are up-to-date. + +[abstract] +{description} + +A negative hint is a type of xref:n1ql-language-reference/optimizer-hints.adoc[optimizer hint] that applies to a specific keyspace. +Unlike xref:n1ql-language-reference/keyspace-hints.adoc[positive keyspace hints], which direct the optimizer to use specific indexes or join methods, negative hints instruct it what not to use. + +Negative hints are of two types: index hints and join hints. +Index hints direct optimizer not to use specific indexes, and join hints direct it not to use specific join methods. + +For each negative hint, you must specify the keyspace or keyspaces that the hint applies to. +If a keyspace is given an explicit alias in the query, then the hint must refer to the explicit alias, not the keyspace name. +This is to avoid confusion in situations where the same keyspace can be used multiple times (with different aliases) in the same query. + +If the keyspace is not given an explicit alias in the query, the hint must refer to the keyspace using the keyspace name. +(If the keyspace name is a dotted path, the hint must refer to the keyspace using its implicit alias, which is the last component in the keyspace path.) + +Negative hints support two prefixes: `NO_` and `AVOID_`. +You can specify them using either simple syntax or JSON syntax, but you cannot mix the two in the same hint comment. + +== NO_INDEX + +This hint is the negative equivalent of the xref:n1ql-language-reference/keyspace-hints.adoc#index[INDEX hint]. +It directs the optimizer not to use a specific secondary index for a keyspace. +You can add one or more secondary indexes in the hint. +If you do not specify this hint, the optimizer selects the optimal available index. + +=== Simple Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-gsi-hint-simple] +---- + +image::n1ql-language-reference/no-gsi-hint-simple.png["Syntax diagram: refer to source code listing", align=left] + +With the simple syntax, this hint specifies a single keyspace expression along with zero, one, or more indexes to avoid. +You can either use `NO_INDEX` or `AVOID_INDEX` as the hint keyword. +You can also use this hint multiple times within a hint comment to apply it to more than one keyspace. + +NOTE: For this hint to work effectively, you must specify at least one index. +The optimizer ignores the hint if you do not specify any indexes. + +==== Arguments + +keyspace:: +The keyspace or alias to which this hint applies. + +index:: +A secondary index that the optimizer must not use for the given keyspace. +This argument is optional. +However, you must specify at least one index. +Otherwise, the optimizer ignores the hint. + +=== JSON Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-gsi-hint-json] +---- + +image::n1ql-language-reference/no-gsi-hint-json.png["Syntax diagram: refer to source code listing", align=left] + +With the JSON syntax, this hint takes the form of a `no_index` or `avoid_index` property. +You can only use this property once within a hint comment. +The value of this property can be an <> or an <>. + +[#index-array] +==== Index Array + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=index-array] +---- + +image::n1ql-language-reference/index-array.png["Syntax diagram: refer to source code listing", align=left] + +Use this array to specify indexes for multiple keyspaces. +Each element must be an <>. + +[#index-object] +==== Index Object + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=index-object] +---- + +image::n1ql-language-reference/index-object.png["Syntax diagram: refer to source code listing", align=left] + +Use this object to specify indexes for a single keyspace. +It must contain a <> and an <>. +The order of the properties within the object is not significant. + +[#keyspace-property] +==== Keyspace Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-property] +---- + +image::n1ql-language-reference/keyspace-property.png["Syntax diagram: refer to source code listing", align=left] + +Synonym for `"keyspace"`: `"alias"` + +The value of this property is the keyspace or alias to which this hint applies. + +[#indexes-property] +==== Indexes Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=indexes-property] +---- + +image::n1ql-language-reference/indexes-property.png["Syntax diagram: refer to source code listing", align=left] + +The value of this property can be: + +[horizontal] +null:: +The optimizer ignores the hint when the value is `null`. +For the hint to work effectively, you must specify at least one index. + +An index string:: +A secondary index that the optimizer must not use for the given keyspace. + +An array of index strings:: +An array of secondary indexes that the optimizer must not use for the given keyspace. + +[#no-index-examples,reftext="NO_INDEX Examples"] +=== Examples + +{cbo-preamble} + +include::ROOT:partial$query-context.adoc[tag=section] + +[#ex-index-opt] +.Query without any hints +==== +The following query does not include an index hint. + +.Query +[source,sqlpp] +---- +include::example$select/index-opt.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the optimizer has selected the index `def_inventory_route_sourceairport`, which is installed with the travel sample dataset. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/index-opt.jsonc[tag=index] +---- +==== + +[#ex-no-ndex-hint] +.Query with the NO_INDEX hint +==== +The following query hints the optimizer to avoid using the index `def_inventory_route_sourceairport` for the keyspace `route`. + +.Query +[source,sqlpp] +---- +include::example$select/no-index-hint.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the query omits the specified index, forcing the optimizer to consider other available indexes. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/no-index-hint.jsonc[tag=index] +---- +==== + +== NO_INDEX_FTS + +This hint is the negative equivalent of the xref:n1ql-language-reference/keyspace-hints.adoc#index_fts[INDEX_FTS hint]. +It directs the optimizer not to use a specific full-text index for a keyspace. +You can add one or more full-text indexes in the hint. +If you do not specify this hint, the optimizer selects the optimal available index. + +=== Simple Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-fts-hint-simple] +---- + +image::n1ql-language-reference/no-fts-hint-simple.png["Syntax diagram: refer to source code listing", align=left] + +With the simple syntax, this hint specifies a single keyspace expression along with zero, one, or more indexes. +You can either use `NO_INDEX_FTS` or `AVOID_INDEX_FTS` as the hint keyword. +You can also use this hint multiple times within a hint comment to apply it to more than one keyspace. + +NOTE: For this hint to work effectively, you must specify at least one index. +The optimizer ignores the hint if you do not specify any indexes. + +==== Arguments + +keyspace:: +The keyspace or alias to which this hint applies. + +index:: +A full-text index that the optimizer must not use for the given keyspace. +This argument is optional. +However, you must specify at least one index. +Otherwise, the optimizer ignores the hint. + +=== JSON Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-gsi-hint-json] +---- + +image::n1ql-language-reference/no-gsi-hint-json.png["Syntax diagram: refer to source code listing", align=left] + +With the JSON syntax, this hint takes the form of a `no_index_fts` or `avoid_index_fts` property. +You can only use this property once within the hint comment. +The value of this property can be an <> or an <>. + +[#index-array-no-fts] +==== Index Array + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=index-array] +---- + +image::n1ql-language-reference/index-array.png["Syntax diagram: refer to source code listing", align=left] + +Use this array to specify indexes for multiple keyspaces. +Each element must be an <>. + +[#index-object-no-fts] +==== Index Object + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=index-object] +---- + +image::n1ql-language-reference/index-object.png["Syntax diagram: refer to source code listing", align=left] + +Use this object to specify indexes for a single keyspace. +It must contain a <> and an <>. +The order of the properties within the object is not significant. + +[#keyspace-property-no-fts] +==== Keyspace Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-property] +---- + +image::n1ql-language-reference/keyspace-property.png["Syntax diagram: refer to source code listing", align=left] + +Synonym for `"keyspace"`: `"alias"` + +The value of this property is the keyspace or alias to which this hint applies. + +[#indexes-property-no-fts] +==== Indexes Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=indexes-property] +---- + +image::n1ql-language-reference/indexes-property.png["Syntax diagram: refer to source code listing", align=left] + +The value of this property can be: + +[horizontal] +null:: +The optimizer ignores the hint when the value is `null`. +For the hint to work effectively, you must specify at least one index. + +An index string:: +A full-text index that the optimizer must not use for the given keyspace. + +An array of index strings:: +An array of full-text indexes that the optimizer must not use for the given keyspace. + + +[#no-index-fts-examples,reftext="NO_INDEX_FTS Example"] +=== Examples +.NO_INDEX_FTS hint +==== +This example specifies that the optimizer should not use the FTS index `hotel_state_fts_index`. +To qualify for this query, you must have this FTS index on `state` and `type`, using the keyword analyzer. +(Or alternatively, the FTS index on `state`, with a custom type mapping on `hotel`.) + +.Query +[source,sqlpp] +---- +SELECT /*+ NO_INDEX_FTS (hotel hotel_state_fts_index) */ + META().id +FROM hotel +WHERE state = "Corse" OR state = "California"; +---- + +The optimizer omits the `hotel_state_fts_index` index from the query plan. +If a qualified FTS index is available, it's selected for the query. +If none of the available FTS indexes are qualified, the available GSI indexes are considered instead. +==== + +== NO_USE_NL + +This hint is the negative equivalent of the xref:n1ql-language-reference/keyspace-hints.adoc#use_nl[USE_NL hint]. +It directs the optimizer not to use a nested loop join for a specified keyspace. +This hint must be specified on the keyspace on the right-hand side of the join. +If not specified, the optimizer selects the optimal join method. + +NOTE: This hint is only available in xref:n1ql-language-reference/selectclause.adoc[SELECT] and xref:n1ql-language-reference/merge.adoc[MERGE] statements. + +=== Simple Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-nl-hint-simple] +---- + +image::n1ql-language-reference/no-nl-hint-simple.png["Syntax diagram: refer to source code listing", align=left] + +With the simple syntax, this hint specifies one or more keyspaces. +You can either use `NO_USE_NL` or `AVOID_NL` as the hint keyword. +You can also use this hint multiple times within the hint comment. + +==== Arguments + +keyspace:: +The keyspace or alias to which this hint applies. + +=== JSON Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-nl-hint-json] +---- + +image::n1ql-language-reference/no-nl-hint-json.png["Syntax diagram: refer to source code listing", align=left] + +With the JSON syntax, this hint takes the form of a `no_use_nl` or `avoid_nl` property. +You can only use this property once within the hint comment. +The value of this property can be a <> or a <>. + +[#keyspace-array-no-nl] +==== Keyspace Array + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-array] +---- + +image::n1ql-language-reference/keyspace-array.png["Syntax diagram: refer to source code listing", align=left] + +Use this array to apply the hint to multiple keyspaces. +Each element must be a <>. + +[#keyspace-object-no-nl] +==== Keyspace Object + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-object] +---- + +image::n1ql-language-reference/keyspace-object.png["Syntax diagram: refer to source code listing", align=left] + +Use this object to apply the hint to a single keyspace. +It must contain a <>. + +[#keyspace-property-no-nl] +==== Keyspace Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-property] +---- + +image::n1ql-language-reference/keyspace-property.png["Syntax diagram: refer to source code listing", align=left] + +Synonym for `"keyspace"`: `"alias"` + +The value of this property is the keyspace or alias to which this hint applies. + +[#no-use-nl-examples,reftext="NO_USE_NL Examples"] +=== Examples + +[#ex-no-use-nl-opt] +.Query without a join hint +==== +The following query does not include a join hint. + +.Query +[source,sqlpp] +---- +include::example$select/use-nl-opt.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the optimizer has selected the nested-loop join method. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/no-use-nl-opt.jsonc[tag=join] +---- +==== + +[#ex-no-use-nl-hint] +.NO_USE_NL hint +==== +The following query hints the optimizer to avoid using a nested-loop join. + +.Query +[source,sqlpp] +---- +include::example$select/no-use-nl-hint.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the optimizer avoids using a nested-loop join and considers other join methods. +In this case, the optimizer has selected the hash join method. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/no-use-nl-hint.jsonc[tag=join] +---- +==== + +== NO_USE_HASH + +[.edition]#{enterprise}# + +This hint is the negative equivalent of the xref:n1ql-language-reference/keyspace-hints.adoc#use_hash[USE_HASH hint]. +It directs the optimizer not to use a hash join for a specified keyspace. +This hint must be specified on the keyspace on the right-hand side of the join. +If you do not specify this hint, the optimizer selects the optimal join method. + +Unlike xref:n1ql-language-reference/keyspace-hints.adoc#use_hash[USE_HASH], this hint does not allow you to specify whether the keyspace should appear on the build or probe side of the hash join. +Instead, you can only specify the keyspace name or alias to which this hint applies. + +NOTE: This hint is only available in xref:n1ql-language-reference/selectclause.adoc[SELECT] and xref:n1ql-language-reference/merge.adoc[MERGE] statements. + +=== Simple Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-hash-hint-simple] +---- + +image::n1ql-language-reference/no-hash-hint-simple.png["Syntax diagram: refer to source code listing", align=left] + +With the simple syntax, this hint specifies one or more keyspaces. +You can either use `NO_USE_HASH` or `AVOID_HASH` as the hint keyword. +You may also use this hint multiple times within a hint comment. + +==== Arguments + +keyspace:: +The keyspace or alias to which this hint applies. + +=== JSON Syntax + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=no-hash-hint-json] +---- + +image::n1ql-language-reference/no-hash-hint-json.png["Syntax diagram: refer to source code listing", align=left] + +With the JSON syntax, this hint takes the form of a `no_use_hash` or `avoid_hash` property. +You can only use this property once within a hint comment. +The value of this property can be a <> or a <>. + +[#keyspace-array-no-hash] +==== Keyspace Array + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-array] +---- + +image::n1ql-language-reference/keyspace-array.png["Syntax diagram: refer to source code listing", align=left] + +Use this array to apply the hint to multiple keyspaces. +Each element must be a <>. + +[#keyspace-object-no-hash] +==== Keyspace Object + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-object] +---- + +image::n1ql-language-reference/keyspace-object.png["Syntax diagram: refer to source code listing", align=left] + +Use this object to apply the hint to a single keyspace. +It must contain a <>. + +[#keyspace-property-no-hash] +==== Keyspace Property + +[source,ebnf] +---- +include::partial$grammar/hints.ebnf[tag=keyspace-property] +---- + +image::n1ql-language-reference/keyspace-property.png["Syntax diagram: refer to source code listing", align=left] + +Synonym for `"keyspace"`: `"alias"` + +The value of this property is the keyspace or alias to which this hint applies. + +[#no-use-hash-examples,reftext="NO_USE_HASH Examples"] +=== Examples + +{cbo-preamble} + +include::ROOT:partial$query-context.adoc[tag=section] + +[#ex-no-use-hash-opt] +.Query without a join hint +==== +The following query does not include a join hint. + +.Query +[source,sqlpp] +---- +include::example$select/use-hash-opt.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the optimizer has selected to use the hash join method. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/use-hash-opt.jsonc[tags=method;ellipsis] +---- +==== + +[#ex-no-use-hash-hint] +.Query with the NO_USE_HASH hint +==== +The following query hints the optimizer to avoid using a hash join for the keyspace `aline`. + +.Query +[source,sqlpp] +---- +include::example$select/no-use-hash-hint.n1ql[tag=query] +---- + +If you examine the plan for this query, you can see that the optimizer avoids using a hash join and considers other join methods. +In this case, the optimizer has selected the lookup join method. + +.Explain plan +[source,json,indent=0] +---- +include::example$select/no-use-hash-hint.jsonc[tag=join] +---- +==== + +== Legacy Equivalent + +Unlike xref:n1ql-language-reference/keyspace-hints.adoc[positive keyspace hints], negative hints do not have legacy equivalents. +However, you cannot specify a negative hint and the `USE` clause on the same keyspace. +If you do this, the negative hint and the `USE` clause are both marked as erroneous and ignored by the optimizer. + +== Interaction between Positive and Negative Hints + +As a best practice, avoid using positive and negative hints of the same type on the same keyspace. +This can create conflicts and may cause the optimizer to ignore both hints. + +=== Join Hints + +You can only specify one join hint per keyspace or alias. +This can be either a positive (xref:n1ql-language-reference/keyspace-hints.adoc#use_hash[USE HASH], xref:n1ql-language-reference/keyspace-hints.adoc#use_nl[USE_NL]) or a negative (xref:n1ql-language-reference/negative-keyspace-hints.adoc#no_use_hash[NO_USE_HASH], xref:n1ql-language-reference/negative-keyspace-hints.adoc#no_use_nl[NO_USE_NL]) join hint. + +=== Index Hints + +You can specify both positive (xref:n1ql-language-reference/keyspace-hints.adoc#index[INDEX], xref:n1ql-language-reference/keyspace-hints.adoc#index_fts[INDEX_FTS]) and negative (xref:n1ql-language-reference/negative-keyspace-hints.adoc#no_index[NO_INDEX], xref:n1ql-language-reference/negative-keyspace-hints.adoc#no_index_fts[NO_INDEX_FTS]) index hints on the same keyspace or alias, provided the list of indexes are non-overlapping. + +If an index is included in both the positive and negative hint lists, the optimizer ignores both hints. +Similarly, omitting the index list in either a positive or negative hint may result in conflicts, causing the hints to be ignored. + +== Related Links + +* xref:n1ql-language-reference/cost-based-optimizer.adoc[] +* xref:n1ql-language-reference/optimizer-hints.adoc[] +* xref:n1ql-language-reference/keyspace-hints.adoc[] +* xref:n1ql-language-reference/query-hints.adoc[] + diff --git a/modules/n1ql/pages/n1ql-language-reference/optimizer-hints.adoc b/modules/n1ql/pages/n1ql-language-reference/optimizer-hints.adoc index a43b4f6a4..796473492 100644 --- a/modules/n1ql/pages/n1ql-language-reference/optimizer-hints.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/optimizer-hints.adoc @@ -74,9 +74,8 @@ WHERE city = "San Francisco"; == Placement -Currently, a hint comment is only supported in the `SELECT` statement. -The hint comment must be located immediately after the `SELECT` keyword. -For details, refer to xref:n1ql-language-reference/selectclause.adoc[SELECT Clause]. +In Couchbase Server 8.0 and later, a hint comment is supported in `SELECT`, `DELETE`, `UPDATE`, and `MERGE` statements only. +The hint comment must be located immediately after the statement keyword. There can only be one hint comment in a query block. If there is more than one hint comment, a syntax error is generated. @@ -261,9 +260,10 @@ When the optimizer follows a JSON hint, the hint is shown in the explain plan in .Explain plan for <> [source,sqlpp] ---- -EXPLAIN SELECT /*+ {"index": {"keyspace": "airport", - "indexes": "def_inventory_airport_city"}} */ - airportname, faa +EXPLAIN +SELECT /*+ {"index": {"keyspace": "airport", + "indexes": "def_inventory_airport_city"}} */ + airportname, faa FROM airport WHERE city = "San Francisco"; ---- @@ -417,13 +417,78 @@ WHERE a.city = "San Francisco"; ---- ==== +[#ex-update-hint-explain] +.Explain plan for UPDATE with a simple index hint +==== +When the optimizer follows a simple hint in an UPDATE query, the hint is shown in the explain plan. + +.Explain plan +[source,sqlpp] +---- +EXPLAIN +UPDATE /*+ INDEX(airport def_inventory_airport_city) */ airport +SET updated = true +WHERE city = "San Jose"; +---- + +.Result +[source,json] +---- +[ + { + "optimizer_hints": { + "hints_followed": [ + "INDEX(airport def_inventory_airport_city)" + ] + }, +// ... + } +] +---- +==== + +[#ex-delete-hint-explain] +.Explain plan for DELETE with a simple index hint +==== +When the optimizer follows a simple hint in a DELETE query, the hint is shown in the explain plan. + +.Explain plan +[source,sqlpp] +---- +EXPLAIN +DELETE /*+ INDEX (hotel def_inventory_hotel_city) */ +FROM `hotel` +WHERE city = "San Francisco"; +---- + +.Result +[source,json] +---- +[ + { + "optimizer_hints": { + "hints_followed": [ + "INDEX(`hotel` `def_inventory_hotel_city`)" + ] + }, +// ... + } +] +---- +==== + == Further Details Refer to the following pages for details of individual optimizer hints: * xref:n1ql-language-reference/query-hints.adoc[] apply to an entire query block. * xref:n1ql-language-reference/keyspace-hints.adoc[] apply to a specific keyspace. +* xref:n1ql:n1ql-language-reference/negative-keyspace-hints.adoc[] apply to a specific keyspace, but instruct the optimizer not to use certain options. == Related Links * xref:n1ql-language-reference/cost-based-optimizer.adoc[Cost-Based Optimizer] +* xref:n1ql-language-reference/selectclause.adoc[SELECT] +* xref:n1ql-language-reference/delete.adoc[DELETE] +* xref:n1ql-language-reference/update.adoc[UPDATE] +* xref:n1ql-language-reference/merge.adoc[MERGE] diff --git a/modules/n1ql/pages/n1ql-language-reference/query-hints.adoc b/modules/n1ql/pages/n1ql-language-reference/query-hints.adoc index 80bff1fb4..e32979b74 100644 --- a/modules/n1ql/pages/n1ql-language-reference/query-hints.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/query-hints.adoc @@ -19,6 +19,8 @@ Note that you cannot mix simple syntax and JSON syntax in the same hint comment. If present, this hint directs the optimizer to order any joins just as they are ordered in the query. If not specified, the optimizer determines the optimal join order. +NOTE: This hint is only available in the xref:n1ql-language-reference/selectclause.adoc[SELECT Clause]. + === Simple Syntax [source,ebnf] diff --git a/modules/n1ql/pages/n1ql-language-reference/update.adoc b/modules/n1ql/pages/n1ql-language-reference/update.adoc index a3b3d1453..617770327 100644 --- a/modules/n1ql/pages/n1ql-language-reference/update.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/update.adoc @@ -80,6 +80,7 @@ image::n1ql-language-reference/update.png["Syntax diagram: refer to source code // TODO: Automatic links from EBNF [horizontal.compact] +hint-comment:: <> icon:caret-down[] target-keyspace:: <> icon:caret-down[] use-keys:: <> icon:caret-down[] set-clause:: <> icon:caret-down[] @@ -88,6 +89,18 @@ where-clause:: <> icon:caret-down[] limit-clause:: <> icon:caret-down[] returning-clause:: <> icon:caret-down[] +[[hint-comment]] +=== Optimizer Hints + +[.status]#Couchbase Server 8.0# + +You can supply hints to the optimizer within a specially formatted hint comment. +For more information, see xref:n1ql-language-reference/optimizer-hints.adoc[]. + +NOTE: UPDATE statements support only index hints. +Other hints, such as join hints and ORDERED hints, are not supported. +For an example of using an optimizer hint, see <>. + [[update-target]] === Update Target @@ -141,11 +154,14 @@ Assigning an alias to the keyspace reference is optional. If you assign an alias to the keyspace reference, the `AS` keyword may be omitted. [[update-hint]] -=== Update Hint +=== USE KEYS Clause You can use a `USE KEYS` hint on the update target to specify the keys of the data items to be updated. For details, refer to {use-keys-clause}[USE KEYS Clause]. +NOTE: You cannot specify a hint for the same update target using both the USE KEYS clause and an <>. +If you do this, the USE KEYS clause and the <> are both marked as erroneous and ignored by the optimizer. + [[set-clause]] === SET Clause @@ -455,3 +471,24 @@ include::example$dml/set-xattr.jsonc[] include::example$dml/unset-xattr.n1ql[] ---- ==== + +[[example-12]] +.Update with an optimizer hint +==== + +The following query hints the optimizer to use the index `def_inventory_airport_city` for the keyspace `airport`. + +[source,sqlpp] +---- +include::example$dml/update-optimizer-hint.n1ql[] +---- + +If you examine the plan for this query, you can see that it uses the suggested index. + +.Result +[source,json,indent=0] +---- +include::example$dml/update-optimizer-hint.jsonc[tag=index] +---- +==== + diff --git a/modules/n1ql/partials/grammar/dml.ebnf b/modules/n1ql/partials/grammar/dml.ebnf index fa4f80c73..6f30043b6 100644 --- a/modules/n1ql/partials/grammar/dml.ebnf +++ b/modules/n1ql/partials/grammar/dml.ebnf @@ -11,7 +11,7 @@ dml-statement ::= delete ********************/ /* tag::delete[] */ -delete ::= 'DELETE' 'FROM' target-keyspace use-keys-clause? where-clause? +delete ::= 'DELETE' hint-comment? 'FROM' target-keyspace use-keys-clause? where-clause? limit-clause? offset-clause? returning-clause? /* end::delete[] */ @@ -43,7 +43,8 @@ insert-select ::= '(' 'PRIMARY'? 'KEY' key ( ',' 'VALUE' value )? *******************/ /* tag::merge[] */ -merge ::= 'MERGE' 'INTO' ( ansi-merge | lookup-merge ) limit-clause? returning-clause? +merge ::= 'MERGE' hint-comment? 'INTO' ( ansi-merge | lookup-merge ) limit-clause? + returning-clause? /* end::merge[] */ /* tag::ansi-merge[] */ @@ -117,7 +118,7 @@ merge-delete ::= 'WHEN' 'MATCHED' 'THEN' 'DELETE' where-clause? ********************/ /* tag::update[] */ -update ::= 'UPDATE' target-keyspace use-keys? set-clause? unset-clause? +update ::= 'UPDATE' hint-comment? target-keyspace use-keys? set-clause? unset-clause? where-clause? limit-clause? returning-clause? /* end::update[] */ diff --git a/modules/n1ql/partials/grammar/hints.ebnf b/modules/n1ql/partials/grammar/hints.ebnf index 5d12583bf..980d7db64 100644 --- a/modules/n1ql/partials/grammar/hints.ebnf +++ b/modules/n1ql/partials/grammar/hints.ebnf @@ -23,9 +23,14 @@ simple-hint-sequence ::= simple-hint+ /* tag::simple-hint[] */ simple-hint ::= ordered-hint-simple | gsi-hint-simple + | gsi-all-hint-simple | fts-hint-simple | hash-hint-simple | nl-hint-simple + | no-gsi-hint-simple + | no-fts-hint-simple + | no-hash-hint-simple + | no-nl-hint-simple /* end::simple-hint[] */ /* tag::ordered-hint-simple[] */ @@ -36,6 +41,10 @@ ordered-hint-simple ::= 'ORDERED' gsi-hint-simple ::= 'INDEX' '(' keyspace index* ')' /* end::gsi-hint-simple[] */ +/* tag::gsi-all-hint-simple[] */ +gsi-all-hint-simple ::= 'INDEX_ALL' '(' keyspace index* ')' +/* end::gsi-all-hint-simple[] */ + /* tag::fts-hint-simple[] */ fts-hint-simple ::= 'INDEX_FTS' '(' keyspace index* ')' /* end::fts-hint-simple[] */ @@ -48,6 +57,22 @@ nl-hint-simple ::= 'USE_NL' '(' ( keyspace )+ ')' hash-hint-simple ::= 'USE_HASH' '(' ( keyspace ( '/' ( 'BUILD' | 'PROBE' ) )? )+ ')' /* end::hash-hint-simple[] */ +/* tag::no-gsi-hint-simple[] */ +no-gsi-hint-simple ::= ( 'NO_INDEX' | 'AVOID_INDEX' ) '(' keyspace index* ')' +/* end::no-gsi-hint-simple[] */ + +/* tag::no-fts-hint-simple[] */ +no-fts-hint-simple ::= ( 'NO_INDEX_FTS' | 'AVOID_INDEX_FTS' ) '(' keyspace index* ')' +/* end::no-fts-hint-simple[] */ + +/* tag::no-hash-hint-simple[] */ +no-hash-hint-simple ::= ( 'NO_USE_HASH' | 'AVOID_HASH' ) '(' ( keyspace )+ ')' +/* end::no-hash-hint-simple[] */ + +/* tag::no-nl-hint-simple[] */ +no-nl-hint-simple ::= ( 'NO_USE_NL' | 'AVOID_NL' ) '(' ( keyspace )+ ')' +/* end::no-nl-hint-simple[] */ + /* tag::json-hint-object[] */ json-hint-object ::= '{' json-hint (',' json-hint )* '}' /* end::json-hint-object[] */ @@ -55,9 +80,14 @@ json-hint-object ::= '{' json-hint (',' json-hint )* '}' /* tag::json-hint[] */ json-hint ::= ordered-hint-json | gsi-hint-json + | gsi-all-hint-json | fts-hint-json | hash-hint-json | nl-hint-json + | no-gsi-hint-json + | no-fts-hint-json + | no-hash-hint-json + | no-nl-hint-json /* end::json-hint[] */ /* tag::ordered-hint-json[] */ @@ -68,6 +98,10 @@ ordered-hint-json ::= '"ordered"' ':' 'true' gsi-hint-json ::= '"index"' ':' ( index-array | index-object ) /* end::gsi-hint-json[] */ +/* tag::gsi-all-hint-json[] */ +gsi-all-hint-json ::= '"index_all"' ':' ( index-array | index-object ) +/* end::gsi-all-hint-json[] */ + /* tag::fts-hint-json[] */ fts-hint-json ::= '"index_fts"' ':' ( index-array | index-object ) /* end::fts-hint-json[] */ @@ -80,6 +114,23 @@ nl-hint-json ::= '"use_nl"' ':' ( keyspace-array | keyspace-object ) hash-hint-json ::= '"use_hash"' ':' ( hash-array | hash-object ) /* end::hash-hint-json[] */ +/* tag::no-gsi-hint-json[] */ +no-gsi-hint-json ::= ( '"no_index"' | '"avoid_index"' ) ':' ( index-array | index-object ) +/* end::no-gsi-hint-json[] */ + +/* tag::no-fts-hint-json[] */ +no-fts-hint-json ::= ( '"no_index_fts"' | '"avoid_index_fts"' ) ':' ( index-array | index-object ) +/* end::no-fts-hint-json[] */ + +/* tag::no-nl-hint-json[] */ +no-nl-hint-json ::= ( '"no_use_nl"' | '"avoid_nl"') ':' ( keyspace-array | keyspace-object ) +/* end::no-nl-hint-json[] */ + +/* tag::no-hash-hint-json[] */ +no-hash-hint-json ::= ( '"no_use_hash"' | '"avoid_hash"' ) ':' + ( keyspace-array | keyspace-object ) +/* end::no-hash-hint-json[] */ + /* tag::index-array[] */ index-array ::= '[' index-object ( ',' index-object )* ']' /* end::index-array[] */ diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index d69105fff..1a102501c 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -84,6 +84,7 @@ endif::flag-devex-javascript-udfs[] *** xref:n1ql:n1ql-language-reference/optimizer-hints.adoc[Hints] **** xref:n1ql:n1ql-language-reference/query-hints.adoc[] **** xref:n1ql:n1ql-language-reference/keyspace-hints.adoc[] + **** xref:n1ql:n1ql-language-reference/negative-keyspace-hints.adoc[] *** xref:n1ql:n1ql-language-reference/booleanlogic.adoc[] *** Statements **** xref:n1ql:n1ql-language-reference/advise.adoc[] From 6ac07e69dae9d3e3b4af0cd8b3d78d1be3ac6e69 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Thu, 25 Sep 2025 14:18:28 +0100 Subject: [PATCH 52/80] DOC-11697: Add landing page for SQL++ statements (#429) * Add landing page for SQL++ statements * Clarify DDL statements: work with objects other than indexes * DOC-10012: Data control language --- .../pages/n1ql-language-reference/index.adoc | 8 +- .../n1ql-language-reference/statements.adoc | 106 ++++++++++++++++++ modules/n1ql/partials/nav.adoc | 2 +- 3 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 modules/n1ql/pages/n1ql-language-reference/statements.adoc diff --git a/modules/n1ql/pages/n1ql-language-reference/index.adoc b/modules/n1ql/pages/n1ql-language-reference/index.adoc index 8fe18b02f..f7709154c 100644 --- a/modules/n1ql/pages/n1ql-language-reference/index.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/index.adoc @@ -29,8 +29,12 @@ The {sqlpp} language is composed of <>, < Date: Tue, 30 Sep 2025 14:06:01 +0530 Subject: [PATCH 53/80] [DOC-9905] Additional date string formats (#433) --- .../n1ql-language-reference/datefun.adoc | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/datefun.adoc b/modules/n1ql/pages/n1ql-language-reference/datefun.adoc index add2ac3da..84393bbfb 100644 --- a/modules/n1ql/pages/n1ql-language-reference/datefun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/datefun.adoc @@ -225,24 +225,48 @@ The date string codes are given below. | `MM` | 2-digit month +| `MONTH` / `Month` / `month` +| Full English month name in uppercase, mixed case, or lowercase + +| `MON` / `Mon` / `mon` +| Abbreviated English month name in uppercase, mixed case, or lowercase + | `DD` | 2-digit day +| `DAY` / `Day` / `day` +| Full English day name in uppercase, mixed case, or lowercase + +| `DY` / `Dy` / `dy` +| Abbreviated English day name in uppercase, mixed case, or lowercase + | `hh` | 2-digit hour, 00-23 | `HH` | 2-digit hour, 00-23 -| `mm` +| `HH12` +| 2-digit hour, 01-12 + +| `HH24` +| 2-digit hour, 00-23 + +| `mm` / `MI` | 2-digit minute, 00-59 -| `ss` +| `ss` / `SS` | 2-digit second, 00-59 | `s` | Fraction of a second (down to millisecond) -- output only +| `AM` / `PM` / `PP` +| AM or PM (uppercase) + +| `am` / `pm` / `pp` +| am or pm (lowercase) + | `TZD` | Time Zone (as UTC offset) |==== From 46981686a71978d56e96fda7199c1a3b9afbb26d Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Fri, 3 Oct 2025 17:13:41 +0530 Subject: [PATCH 54/80] [DOC-13546] Update reserved keywords list (#423) --- .../reservedwords.adoc | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/reservedwords.adoc b/modules/n1ql/pages/n1ql-language-reference/reservedwords.adoc index 531547c32..0e2fbe2ee 100644 --- a/modules/n1ql/pages/n1ql-language-reference/reservedwords.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/reservedwords.adoc @@ -50,7 +50,7 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | AT | BEGIN -| BETWEEN +| xref:n1ql-language-reference/comparisonops.adoc#between[BETWEEN] | xref:n1ql-language-reference/datatypes.adoc#datatype-binary[BINARY] | xref:n1ql-language-reference/datatypes.adoc#datatype-boolean[BOOLEAN] | BREAK @@ -60,7 +60,7 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | BY | CACHE | CALL -| CASE +| xref:n1ql-language-reference/conditionalops.adoc[CASE] | CAST | CLUSTER @@ -100,15 +100,15 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | xref:n1ql-language-reference/collectionops.adoc#collection-op-every[EVERY] | xref:n1ql-language-reference/union.adoc[EXCEPT] -| EXCLUDE -| EXECUTE +| xref:n1ql-language-reference/selectclause.adoc#sec_ExcludeClause[EXCLUDE] +| xref:n1ql-language-reference/execute.adoc[EXECUTE] | xref:n1ql-language-reference/collectionops.adoc#exists[EXISTS] | xref:n1ql-language-reference/explain.adoc[EXPLAIN] | FALSE | FETCH | FILTER -| FIRST +| xref:n1ql-language-reference/collectionops.adoc#first[FIRST] | FLATTEN | FLATTEN_KEYS @@ -121,7 +121,7 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | xref:n1ql-language-reference/createfunction.adoc[FUNCTION] | GOLANG -| GRANT +| xref:n1ql-language-reference/grant.adoc[GRANT] | xref:n1ql-language-reference/groupby.adoc[GROUP] | xref:n1ql-language-reference/window.adoc#window-frame-clause[GROUPS] | xref:n1ql-language-reference/hints.adoc#index-type[GSI] @@ -136,14 +136,14 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | INCLUDE | INCREMENT | INDEX -| INFER +| xref:n1ql-language-reference/infer.adoc[INFER] | INLINE | INNER | xref:n1ql-language-reference/insert.adoc[INSERT] | xref:n1ql-language-reference/union.adoc[INTERSECT] | INTO -| IS +| xref:n1ql-language-reference/comparisonops.adoc#is[IS] | xref:n1ql:n1ql-language-reference/set-transaction.adoc[ISOLATION] | xref:n1ql-language-reference/createfunction.adoc[JAVASCRIPT] @@ -161,7 +161,7 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | LETTING | xref:n1ql:n1ql-language-reference/set-transaction.adoc[LEVEL] -| LIKE +| xref:n1ql-language-reference/comparisonops.adoc#like[LIKE] | xref:n1ql-language-reference/limit.adoc[LIMIT] | LSM | MAP @@ -171,133 +171,144 @@ The following keywords are reserved and cannot be used as unescaped identifiers: | MATERIALIZED | MAXVALUE | xref:n1ql-language-reference/merge.adoc[MERGE] +| MINUS | MINVALUE | xref:n1ql-language-reference/comparisonops.adoc#null-and-missing[MISSING] -| NAMESPACE +| NAMESPACE +| NAMESPACE_ID | xref:n1ql-language-reference/nest.adoc[NEST] | NEXT | NEXTVAL | xref:n1ql-language-reference/join.adoc#use-nl-hint[NL] + | xref:n1ql-language-reference/window.adoc#window-frame-exclusion[NO] | xref:n1ql-language-reference/logicalops.adoc#logical-op-not[NOT] - +| NOT_A_TOKEN | xref:n1ql-language-reference/windowfun.adoc#fn-window-nth-value[NTH_VALUE] | xref:n1ql-language-reference/comparisonops.adoc#null-and-missing[NULL] | xref:n1ql-language-reference/window.adoc#nulls-treatment[NULLS] + | NUMBER | OBJECT | xref:n1ql-language-reference/offset.adoc[OFFSET] - | ON | OPTION | xref:n1ql-language-reference/insert.adoc#insert-values[OPTIONS] + | xref:n1ql-language-reference/logicalops.adoc#or-operator[OR] | xref:n1ql-language-reference/orderby.adoc[ORDER] | xref:n1ql-language-reference/window.adoc#window-frame-exclusion[OTHERS] - | OUTER | xref:n1ql-language-reference/window.adoc[OVER] | PARSE + | PARTITION | PASSWORD | PATH - | POOL | xref:n1ql-language-reference/window.adoc#window-frame-extent[PRECEDING] -| PREPARE +| xref:n1ql-language-reference/prepare.adoc[PREPARE] + | PREV | PREVIOUS | PREVVAL - | PRIMARY | PRIVATE | PRIVILEGE + | xref:n1ql-language-reference/join.adoc#use-hash-hint[PROBE] | PROCEDURE | PUBLIC - | xref:n1ql-language-reference/window.adoc#window-frame-clause[RANGE] | RAW | READ + | REALM | RECURSIVE | REDUCE - | RENAME | REPLACE | xref:n1ql-language-reference/window.adoc#nulls-treatment[RESPECT] + | RESTART | RESTRICT | RETURN - | RETURNING -| REVOKE +| xref:n1ql-language-reference/revoke.adoc[REVOKE] | RIGHT + | ROLE +| ROLES | xref:n1ql:n1ql-language-reference/rollback-transaction.adoc[ROLLBACK] | xref:n1ql-language-reference/window.adoc#window-frame-extent[ROW] - | xref:n1ql-language-reference/window.adoc#window-frame-clause[ROWS] | SATISFIES + | xref:n1ql:n1ql-language-reference/savepoint.adoc[SAVEPOINT] | SCHEMA | SCOPE | xref:n1ql-language-reference/selectclause.adoc[SELECT] - | SELF | SEQUENCE + +| SEMI | SET | SHOW | SOME | START - | STATISTICS + | STRING | SYSTEM | THEN | xref:n1ql-language-reference/window.adoc#window-frame-exclusion[TIES] | TO - | xref:n1ql:n1ql-language-reference/begin-transaction.adoc[TRAN] + | xref:n1ql:n1ql-language-reference/begin-transaction.adoc[TRANSACTION] | TRIGGER | TRUE | TRUNCATE | xref:n1ql-language-reference/window.adoc#window-frame-extent[UNBOUNDED] - | UNDER + | xref:n1ql-language-reference/union.adoc[UNION] | UNIQUE | UNKNOWN | xref:n1ql-language-reference/unnest.adoc[UNNEST] -| UNSET - +| xref:n1ql-language-reference/update.adoc#unset-clause[UNSET] | xref:n1ql-language-reference/update.adoc[UPDATE] + | xref:n1ql-language-reference/upsert.adoc[UPSERT] | xref:n1ql-language-reference/hints.adoc[USE] | USER | USERS | USING - | VALIDATE + | VALUE | VALUED | VALUES | VECTOR | VIA - | VIEW + | WHEN | xref:n1ql-language-reference/where.adoc[WHERE] | WHILE -| WINDOW -| WITH - +| xref:n1ql-language-reference/window.adoc[WINDOW] +| xref:n1ql-language-reference/with.adoc[WITH] | xref:n1ql-language-reference/collectionops.adoc#collection-op-within[WITHIN] + | xref:n1ql:n1ql-language-reference/begin-transaction.adoc[WORK] | XOR | | | -|=== \ No newline at end of file +| + +|=== + +NOTE: The word `AI` is not a reserved word, even though you can use it in combination with the `USING` keyword as part of the xref:n1ql-language-reference/using-ai.adoc[USING AI] statement. +You do not have to escape the word `AI` inside backticks when using it by itself as an identifier. \ No newline at end of file From 3f81400df116890c17bf0b8b0c67663c00fbb8d1 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:59:54 +0100 Subject: [PATCH 55/80] DOC-13588: Issues with streaming completed requests (#434) * Fix property name * Add completed-stream-size to Configure Queries ToC * Vale updates * Update preview config --- .../n1ql-manage/monitoring-n1ql-query.adoc | 65 +++++++++---------- .../pages/n1ql-manage/query-settings.adoc | 20 +++--- preview/HEAD.yml | 2 + 3 files changed, 44 insertions(+), 43 deletions(-) diff --git a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc index 7c0d18927..0f1d8596c 100644 --- a/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc +++ b/modules/n1ql/pages/n1ql-manage/monitoring-n1ql-query.adoc @@ -1,7 +1,7 @@ = Manage and Monitor Queries :example-caption!: :alt-markdown-links: -:description: Monitoring and profiling {sqlpp} queries, query service nodes, and corresponding system resources is very important for smoother operational performance and efficiency of the system. +:description: Monitoring and profiling {sqlpp} queries, Query Service nodes, and corresponding system resources is important for smoother operational performance and efficiency of the system. ifdef::basebackend-html[] ++++ @@ -55,22 +55,22 @@ endif::[] [abstract] {description} -In fact, often it is vital for diagnosing and troubleshooting issues such as query performance, resource bottlenecks, and overloading of various services. +In fact, often it's vital for diagnosing and troubleshooting issues such as query performance, resource bottlenecks, and overloading of various services. include::ROOT:partial$component-signpost.adoc[] -System keyspaces provide various monitoring details and statistics about individual queries and the Query service. +System keyspaces provide various monitoring details and statistics about individual queries and the Query Service. When running on a cluster with multiple query nodes, stats about all queries on all query nodes are collected in the Query management and monitoring system keyspaces. For example, this can help identify: * The top 10 slow or fast queries running on a particular query node or the cluster. -* Resource usage statistics of the query service, or resources used for a particular query. +* Resource usage statistics of the Query Service, or resources used for a particular query. * Details about the active, completed, and prepared queries. * Find long running queries that are running for more than 2 minutes. These system keyspaces are transient in nature, and are not persisted to disk or permanent storage. -Hence, the information in the keyspaces pertains to the current instantiation of the Query service. +Hence, the information in the keyspaces pertains to the current instantiation of the Query Service. You can access the Query management and monitoring system keyspaces using any of the following: @@ -85,7 +85,7 @@ Using {sqlpp} enables you to obtain further insights from the keyspaces. == Authentication and Client Privileges Users must have permission to access restricted system keyspaces. -For more details about cluster credentials, see xref:clusters:manage-database-users.adoc[]. +For information about cluster credentials, see xref:clusters:manage-database-users.adoc[]. ifdef::flag-devex-rest-api[] == Examples on this Page @@ -101,7 +101,7 @@ endif::flag-devex-rest-api[] == Monitor System Vitals The `system:vitals` catalog provides data about the running state and health of the query nodes, such as number of logical cores, active threads, queued threads, CPU utilization, memory usage, network utilization, garbage collection percentage, and so on. -This information can be very useful to assess the current workload and performance characteristics of a query node. +This information can be useful to assess the current workload and performance characteristics of a query node. [#sys-vitals-get] === Get System Vitals @@ -569,7 +569,7 @@ Getting prepared statements, as described in <>, returns resul } ---- -In this example, the names of the prepared statements are identical, but they are associated with different query contexts. +In this example, the names of the prepared statements are identical, but they're associated with different query contexts. <.> The name of the prepared statement for the default query context <.> The name of the prepared statement showing the associated query context @@ -626,7 +626,7 @@ SELECT * FROM system:completed_requests; -- ==== -Note that the `completed` state means that the request was started and completed by the Query service, but it does not mean that it was necessarily successful. +The `completed` state means that the request was started and completed by the Query Service, but it does not mean that it was necessarily successful. The request could have been successful, or completed with errors. To find requests that completed successfully, search for completed requests whose `state` is `completed` and whose `errorCount` field has the value `0`. @@ -718,7 +718,7 @@ DELETE FROM system:completed_requests WHERE requestTime LIKE "2015-09-09%"; [[sys-completed-examples]] === Completed Request Details -To try the examples in this section, first run a query which takes at least 1000ms (the default value of the `completed-threshold` query setting) to get registered in the `system:completed_requests` keyspace. +To try the examples in this section, first run a query which takes at least 1000{nbsp}ms (the default value of the `completed-threshold` query setting) to get registered in the `system:completed_requests` keyspace. .Run a long query ==== @@ -829,7 +829,7 @@ curl $BASE_URL/admin/settings -u $USER:$PASSWORD \ === Logging Qualifiers You can specify the following logging qualifiers. -A completed request is logged if _any_ of the qualifiers are met (logical OR). +A completed request is logged if any of the qualifiers are met (logical OR). [horizontal] `threshold`:: The execution time threshold in milliseconds. @@ -844,11 +844,12 @@ A completed request is logged if _any_ of the qualifiers are met (logical OR). For full details, see xref:n1ql-rest-admin:index.adoc#Logging_Parameters[Logging Parameters]. -The basic syntax adds a qualifier to the logging parameters, i.e. any existing qualifiers are not removed. +The basic syntax adds a qualifier to the logging parameters. +Any existing qualifiers are not removed. You can change the value of a logging qualifier by specifying the same qualifier again with a new value. -To add a new instance of an existing qualifier, use a plus sign (`+`) before the qualifier name, e.g. `+user`. -To remove a qualifier, use a minus sign (`-`) before the qualifier name, e.g. `-user`. +To add a new instance of an existing qualifier, use a plus sign (`+`) before the qualifier name, such as `+user`. +To remove a qualifier, use a minus sign (`-`) before the qualifier name, such as `-user`. For example, the following request will add user `simon` to those tracked, and remove error `12003`. @@ -899,7 +900,7 @@ You cannot add a new instance of an existing qualifier to a tagged set using a p For example, you cannot add a `user` qualifier to a tagged set that already contains a `user` qualifier. If you need to track two users with the same error, create two tagged sets, one per user. -You can remove a qualifier from a tagged set using a minus sign (`-`) before the qualifier name, e.g. `-user`. +You can remove a qualifier from a tagged set using a minus sign (`-`) before the qualifier name, such as `-user`. When you remove the last qualifier from a tagged set, the tagged set is removed. [NOTE] @@ -916,7 +917,7 @@ In this case, completed requests are logged if they match any of the individual The [.param]`completed-threshold` field provides another way of specifying the `threshold` qualifier within the `completed` field. This field sets the minimum request duration after which requests are added to the `system:completed_requests` catalog. -The default value is 1000ms. +The default value is 1000{nbsp}ms. Specify [.in]`0` to log all requests and [.in]`-1` to not log any requests to the keyspace. To specify a different value, use: @@ -948,13 +949,11 @@ curl $BASE_URL/admin/settings -u $USER:$PASSWORD \ In clusters running Couchbase Server 7.6.4 and later, you can stream completed requests to disk. -To enable completed request streaming, use the xref:n1ql:n1ql-rest-api/admin.adoc[Admin REST API] `/admin/settings` endpoint to specify the `completed_stream_size` property. - [source,sh] ---- curl $BASE_URL/admin/settings -u $USER:$PASSWORD \ -H 'Content-Type: application/json' \ - -d '{"completed_stream_size":500}' + -d '{"completed-stream-size": 500}' ---- This property is a file size in MiB. @@ -964,8 +963,8 @@ When set to any size greater than `0`, completed requests are streamed to archiv The value of this property determines the size of the data to retain, per node. The configuration for completed requests determines which requests are saved. -NOTE: The additional processing required to save completed requests to disk may limit overall request throughput on a Query node, but typically only when every completed request is being recorded, and requests are very small or short-lived. -The speed of the file system on which the server logs directory resides naturally affects the potential impact too. +NOTE: The additional processing required to save completed requests to disk may limit overall request throughput on a Query node, but typically only when every completed request is being recorded, and requests are small or short-lived. +The speed of the file system on which the server logs directory resides may affect the request throughput also. [#sys-history-files] === Archived Request Files @@ -973,16 +972,16 @@ The speed of the file system on which the server logs directory resides naturall When streaming is enabled, completed requests are saved to GZIP archives with the prefix `local_request_log` in the Couchbase Server `logs` directory. Each saved GZIP archive file contains multiple JSON entries, one for each for each recorded completed request. -Couchbase Server writes multiple archive files in parallel, so whilst the order of requests in a file is sequential, a single given file may not contain a contiguous sequence of requests. +Couchbase Server writes multiple archive files in parallel, so while the order of requests in a file is sequential, a single given file may not contain a contiguous sequence of requests. -When an archive file reaches or exceeds 100 MiB, it is finalized and saved to disk. +When an archive file reaches or exceeds 100 MiB, it's finalized and saved to disk. This is not a hard limit -- entries are not truncated to adhere to it. Files may also be finalized with less content, if nothing has been written to them for an extended period. -Files that are actively being written are not available for reading, and they don't count towards the configured size limit until they're finalized. +Files that are actively being written are not available for reading, and they do not count towards the configured size limit until they're finalized. Couchbase Server tries to manage and retain archive files such that the total disk space used by the files is within the specified limit for the node. When the specified limit is reached, older files are removed as necessary to make space for newly finalized files. -When a file is removed, it isn't guaranteed that only the oldest requests are evicted, given that Couchbase Server writes to multiple archive files in parallel. +When a file is removed, it's not guaranteed that only the oldest requests are evicted, given that Couchbase Server writes to multiple archive files in parallel. [#sys-history-view] === View Archived Requests @@ -1014,7 +1013,7 @@ SELECT * FROM system:completed_requests_history; -- ==== -The `system:completed_requests_history` keyspace is provided for {sqlpp} access to the archived files, but as they are external GZIP archives performance is restricted, particularly with large histories on clusters with multiple Query service nodes. +The `system:completed_requests_history` keyspace is provided for {sqlpp} access to the archived files, but as they're external GZIP archives performance is restricted, particularly with large histories on clusters with multiple Query Service nodes. Directly reading the files may be more useful in some cases. endif::flag-devex-rest-api[] @@ -1031,7 +1030,7 @@ You can set query profiling to the following levels: You can set query profiling: ifdef::flag-devex-rest-api[] -* At the <>, so that it is enabled for all queries on that node. +* At the <>, so that it's enabled for all queries on that node. endif::flag-devex-rest-api[] * At the <>, for individual queries. @@ -1196,16 +1195,16 @@ When a query executes a user-defined function, profiling information is availabl When profiling is enabled: -* If you are using +* If you're using ifdef::flag-devex-rest-api[] the Query REST API or endif::flag-devex-rest-api[] the cbq shell, query profiling information is returned with the query results. -* If you are using the Query tab, query profiling information is not returned with the query results. +* If you're using the Query tab, query profiling information is not returned with the query results. .Phases Profile ==== -If you are using +If you're using ifdef::flag-devex-rest-api[] the Query REST API or endif::flag-devex-rest-api[] @@ -1267,7 +1266,7 @@ the cbq shell, the following statistics are returned when `profile` is set to `p .Timings Profile ==== -If you are using +If you're using ifdef::flag-devex-rest-api[] the Query REST API or endif::flag-devex-rest-api[] @@ -1448,7 +1447,7 @@ include::n1ql-rest-query:partial$definitions/Statistics/definition-end.adoc[opts [[plan]] === Profiling Details in System Catalogs -The <> and <> system catalogs always return profiling information regarding query phases: that is, phase times, phase counts, and phase operators. +The <> and <> system catalogs always return profiling information regarding query phases: namely, phase times, phase counts, and phase operators. The <>, <>, and <> system catalogs also support the `meta().plan` virtual attribute. This captures the whole query plan, and includes profiling information regarding execution timings. @@ -1657,4 +1656,4 @@ a| icon:check[fw] timings == Related Links -* Refer to xref:n1ql:n1ql-intro/sysinfo.adoc[Getting System Information] for more information on the system namespace. +* For more information on the system namespace, see xref:n1ql:n1ql-intro/sysinfo.adoc[Getting System Information]. diff --git a/modules/n1ql/pages/n1ql-manage/query-settings.adoc b/modules/n1ql/pages/n1ql-manage/query-settings.adoc index ace989e97..ef7e8d4c2 100644 --- a/modules/n1ql/pages/n1ql-manage/query-settings.adoc +++ b/modules/n1ql/pages/n1ql-manage/query-settings.adoc @@ -1,5 +1,5 @@ = Configure Queries -:description: You can configure the Query service using request-level query parameters. +:description: You can configure the Query Service using request-level query parameters. :page-partial: :alt-markdown-links: @@ -172,7 +172,7 @@ include::n1ql-rest-query:index.adoc[tag=Credentials] [discrete#transactional-scan-consistency] ===== Transactional Scan Consistency -If the request contains a `BEGIN TRANSACTION` statement, or a DML statement with the <> parameter set to `true`, then the <> parameter sets the [def]__transactional scan consistency__. +If the request contains a `BEGIN TRANSACTION` statement, or a DML statement with the <> parameter set to `true`, then the <> parameter sets the transactional scan consistency. If you specify a transactional scan consistency of `request_plus`, `statement_plus`, or `at_plus`, or if you specify no transactional scan consistency, the transactional scan consistency is set to `request_plus`; otherwise, the transactional scan consistency is set as specified. .Transactional scan consistency @@ -199,7 +199,7 @@ If you specify a scan consistency of `not_bounded` for a statement within the tr When you specify a scan consistency of `request_plus`, `statement_plus`, or `at_plus` for a statement within the transaction, the scan consistency for the statement is set to `request_plus`. However, `request_plus` consistency is not supported for statements using a full-text index. -If any statement within the transaction uses a full-text index, by means of the SEARCH function or the Flex Index feature, the scan consistency is set to `not_bounded` for the duration of the full-text search. +If any statement within the transaction uses a full-text index, by means of the SEARCH function or the Flex Index feature, the scan consistency is set to `not_bounded` for the duration of the Full-Text Search. .Overriding the transactional scan consistency [%header, cols="2"] @@ -209,7 +209,7 @@ If any statement within the transaction uses a full-text index, by means of the | Not set | Transactional scan consistency + - (`not_bounded` for full-text search) + (`not_bounded` for Full-Text Search) | `not_bounded` | `not_bounded` @@ -218,7 +218,7 @@ If any statement within the transaction uses a full-text index, by means of the `statement_plus` + `at_plus` | `request_plus` + - (`not_bounded` for full-text search) + (`not_bounded` for Full-Text Search) |=== [#section_srh_tlm_n1b] @@ -402,13 +402,13 @@ include::query-settings.adoc[tag=note-positions] -- ==== -For more details and examples, including examples using SDKs, see the xref:guides:prep-statements.adoc[] guide. +For more information and examples, including examples using SDKs, see the xref:guides:prep-statements.adoc[] guide. ifdef::flag-devex-rest-api[] == Related Links -* For more details about the {sqlpp} REST API, refer to {n1ql-rest-api-index}[]. -* For more details about the Admin REST API, refer to {n1ql-rest-api-admin}[]. -* For more details about the Query Settings API, refer to {rest-cluster-query-settings}[]. -* For more details about API content and settings, refer to {rest-intro}[]. +* For more information about the {sqlpp} REST API, see {n1ql-rest-api-index}[]. +* For more information about the Admin REST API, see {n1ql-rest-api-admin}[]. +* For more information about the Query Settings API, see {rest-cluster-query-settings}[]. +* For more information about API content and settings, see {rest-intro}[]. endif::flag-devex-rest-api[] diff --git a/preview/HEAD.yml b/preview/HEAD.yml index 8d2d1d2da..15ff9ba82 100644 --- a/preview/HEAD.yml +++ b/preview/HEAD.yml @@ -1,6 +1,8 @@ sources: docs-capella: branches: [8-0-docs-uptake] + cb-swagger: + branches: [capella] override: site: startPage: cloud:get-started:intro.adoc \ No newline at end of file From 87cb7d8d8de6603d2c932d0612d1c8e615608185 Mon Sep 17 00:00:00 2001 From: sarahlwelton <110928505+sarahlwelton@users.noreply.github.com> Date: Thu, 9 Oct 2025 15:34:27 -0400 Subject: [PATCH 56/80] [AV-110544] Updates for Unexpected Search UI Changes (#445) * [AV-110544] First draft/attempt at figuring out how to document unexpected Search UI changes * [AV-110544] Quick procedure tweak --- .../search/pages/create-custom-analyzer.adoc | 2 +- .../pages/create-custom-date-time-parser.adoc | 2 +- .../search/pages/create-search-index-ui.adoc | 21 +--- modules/search/pages/customize-index.adoc | 119 ++++++++++++++---- .../pages/default-analyzers-reference.adoc | 2 +- .../search/pages/set-advanced-settings.adoc | 59 +++++++++ modules/search/partials/nav.adoc | 1 + 7 files changed, 161 insertions(+), 45 deletions(-) create mode 100644 modules/search/pages/set-advanced-settings.adoc diff --git a/modules/search/pages/create-custom-analyzer.adoc b/modules/search/pages/create-custom-analyzer.adoc index 65eed8405..fe39d9c13 100644 --- a/modules/search/pages/create-custom-analyzer.adoc +++ b/modules/search/pages/create-custom-analyzer.adoc @@ -86,7 +86,7 @@ Remove a token filter from your custom analyzer by clicking the *x* next to a li == Next Steps -After you create a custom analyzer, you can xref:create-search-index-ui.adoc#default-analyzer[set it as the default analyzer] for your Search index. +After you create a custom analyzer, you can xref:set-advanced-settings.adoc#default-analyzer[set it as the default analyzer] for your Search index. You can also use the custom analyzer when you create a type mapping or mapping while you xref:create-search-index-ui.adoc[]. diff --git a/modules/search/pages/create-custom-date-time-parser.adoc b/modules/search/pages/create-custom-date-time-parser.adoc index a70d39038..48b1c21b8 100644 --- a/modules/search/pages/create-custom-date-time-parser.adoc +++ b/modules/search/pages/create-custom-date-time-parser.adoc @@ -39,7 +39,7 @@ For more information, see the documentation about the https://pkg.go.dev/time#pk == Next Steps -After you create a custom date/time parser, you can xref:create-search-index-ui.adoc#date-time[set it as the default date/time parser] for your Search index. +After you create a custom date/time parser, you can xref:set-advanced-settings.adoc#date-time[set it as the default date/time parser] for your Search index. To continue customizing your Search index, you can also: diff --git a/modules/search/pages/create-search-index-ui.adoc b/modules/search/pages/create-search-index-ui.adoc index faaaa072e..024b82e9a 100644 --- a/modules/search/pages/create-search-index-ui.adoc +++ b/modules/search/pages/create-search-index-ui.adoc @@ -2,15 +2,13 @@ :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} -:page-aliases: create-quick-index.adoc, set-advanced-settings.adoc +:page-aliases: create-quick-index.adoc :description: You can create a Search index using the Couchbase {page-ui-name} to generate a properly formatted Search index definition. :page-toclevels: 3 [abstract] {description} -Use Advanced Mode to create a Search index in the Couchbase {page-ui-name} with full customization and advanced features, such as xref:create-custom-analyzer.adoc[creating custom analyzers] or xref:set-type-identifier.adoc[setting a document filter]. - You must create a Search index before you can xref:simple-search-ui.adoc[run a search] with the Search Service. == Prerequisites @@ -49,27 +47,12 @@ If you select specific collections, you can only use documents from these collec . Click *Index everything from: $COLLECTION_NAME*. . Click btn:[Index All Fields]. . Click btn:[Add to Index]. -. (Optional) <>. +. (Optional) xref:set-advanced-settings.adoc[Choose to add and configure advanced settings on your Search index]. . (Optional) Expand *Replicas & Partitions* and configure your *Number of Replicas* and *Number of Partitions*. + For more information, see xref:customize-index.adoc#replica[Replica and Partition Settings]. . Click btn:[Create Index]. -[#configure-settings] -=== Configure Additional Search Index Settings - -To configure additional settings for your Search index: - -. [[default-analyzer]]In the *Default Analyzer* list, select the xref:customize-index.adoc#analyzers[default analyzer] to assign to new xref:customize-index.adoc#type-mappings[type mappings] in your index. -. [[date-time]]In the *Default Date/Time Parser* list, select the xref:customize-index.adoc#date-time[default date/time parser] to use for date data in your index. -+ -TIP: If you're editing your index in xref:create-search-indexes.adoc#advanced-mode[Advanced Mode Editing], you can also choose to xref:create-custom-analyzer.adoc[] or xref:create-custom-date-time-parser.adoc[]. -. (Advanced Mode Only) Under *Document Filter*, xref:set-type-identifier.adoc[configure a document filter] for your Search index. -. (Advanced Mode Only) Under *Scoring Model*, choose the scoring model to use for your Search index. -For more information, see xref:run-searches.adoc#scoring[Scoring for Search Queries] or xref:customize-index.adoc#scoring-model[Scoring Model]. -+ -TIP: If you choose the `bm25` scoring model, make sure to include the xref:search-request-params.adoc#global_scoring[`global_scoring`] property in Search queries for this index. - == Next Steps Your Search index will contain documents that match the collection type mapping you specified. diff --git a/modules/search/pages/customize-index.adoc b/modules/search/pages/customize-index.adoc index d3b7741f0..dd9dea4f1 100644 --- a/modules/search/pages/customize-index.adoc +++ b/modules/search/pages/customize-index.adoc @@ -11,14 +11,47 @@ Some features are only available in xref:create-search-indexes.adoc#advanced-mod You can add the following components and configure the following options for a Search index: -* <> -* <> -* <> -* <> -* <> -* <> -* <> -* <> +[cols="2,1,1"] +|==== +|Option |Quick Mode |Advanced Mode + +|<> +|✓ +|✓ + +|<> +| +|✓ + +|<> +| +|✓ + +|<> +| +|✓ + +|<> +| +|✓ + +|<> +| +|✓ + +|<> +|✓ +|✓ + +|<> +|✓ +|✓ + +|<> +| +|✓ + +|==== [#analyzers] @@ -29,7 +62,7 @@ Use analyzers to improve and customize the search results in your index. Analyzers transform input text into tokens, which give you greater control over your index's text matching. The *Default Analyzer* sets the analyzer that's used by default for new <> across your Search index. -You can use one of Couchbase's built-in analyzers as the *Default Analyzer* or the analyzer for a specific <>. +You can use 1 of Couchbase's built-in analyzers as the *Default Analyzer* or the analyzer for a specific <>. If you use Advanced Mode, you can create your own analyzer. Analyzers have different components that control how text is transformed for search. @@ -79,6 +112,58 @@ If a collection mapping has a document filter, only documents that pass the filt For more information about how to create a document filter, see xref:set-type-identifier.adoc[]. +[#synonyms] +== Synonym Sources + +[.status]#Couchbase Server 8.0# + +As of Couchbase Server version 8.0 and later, you can add a Synonym Source to a Search index to use synonym searches on text fields. + +After you xref:synonyms/create-synonym-collection-docs.adoc[create a synonym collection and synonym documents], and xref:synonyms/add-synonym-source.adoc[add a synonym source], you can run a search for a term and return results that include terms with similar meanings. + +For example, you could run a search for `happy` and get results for `joyful`, `cheerful`, or `delighted`. + +For more information about synonym search for the Search Service, see xref:synonyms/synonyms-search.adoc[]. + +[#scoring-model] +== Scoring Model + +[.status]#Couchbase Server version 8.0# + +As of Couchbase Server version 8.0, in Advanced Mode editing, you can choose the specific scoring model you want to use for a Search index. +Your scoring model changes the calculation the Search Service uses for scoring documents and ranking them in your search results. + +The following scoring model algorithms are available: + +* `tfidf`: The standard scoring model for the Search Service. +A higher tf-idf score for a document places that document higher in your search results. +* `bm25`: A scoring model better suited to hybrid searches with the Search Service. +A hybrid Search query uses xref:vector-search:vector-search.adoc[Vector Search] together with a standard Search query. +For more information about the calculations for scoring for each algorithm, see xref:run-searches.adoc#scoring[Scoring for Search Queries]. + +[#dynamic-fields] +== Dynamic Fields Settings + +When you add <> to your Search index, in *Advanced Mode*, you can choose how the Search Service handles these dynamic type mappings: + +* <> +* <> + +[#store-dynamic] +=== Store Dynamic Fields + +If you turn on *Store Dynamic Fields*, the Search Service stores the content of any fields under a dynamic type mapping. +Storing field content allows you to return the value of a field in search results. + +This increases the size of your index. + +[#index-dynamic] +=== Index Dynamic Fields + +If you turn on *Index Dynamic Fields*, the Search Service includes fields or whole documents in your Search index that match a dynamic type mapping. + +This increases the size of your index. + [#type-mappings] == Type Mappings and Mappings @@ -98,7 +183,7 @@ For more information about how to configure settings for the different types of For more information about how to configure a type mapping in the Search index editor, see xref:create-type-mapping.adoc[]. -You can create two types of type mappings with the Search Service: +You can create 2 types of type mappings with the Search Service: * <> * <> @@ -119,18 +204,6 @@ For example, you could create a static type mapping to only include the contents Configure this type of mapping by selecting a field in your document schema in the Search index editor when you xref:create-type-mapping.adoc[]. -[#synonyms] -== Synonym Sources - -[.status]#Couchbase Server 8.0# - -As of Couchbase Server version 8.0 and later, you can add a Synonym Source to a Search index to use synonym searches on text fields. - -After you xref:synonyms/create-synonym-collection-docs.adoc[create a synonym collection and synonym documents], and xref:synonyms/add-synonym-source.adoc[add a synonym source], you can run a search for a term and return results that include terms with similar meanings. - -For example, you could run a search for `happy` and get results for `joyful`, `cheerful`, or `delighted`. - -For more information about synonym search for the Search Service, see xref:synonyms/synonyms-search.adoc[]. [#replica] == Replica and Partition Settings @@ -154,7 +227,7 @@ Partitions improve Search index performance, but increase the complexity of a Se It's recommended to set your Search index partitions to the number of nodes running the Search Service in your operational cluster, to get the most efficient resource usage. [#custom-filters] -== Custom Analyzers and Other Filters +== Custom Analyzers and Custom Filters Custom filters are components of a Search index <>. diff --git a/modules/search/pages/default-analyzers-reference.adoc b/modules/search/pages/default-analyzers-reference.adoc index 881e27ebe..5963a552a 100644 --- a/modules/search/pages/default-analyzers-reference.adoc +++ b/modules/search/pages/default-analyzers-reference.adoc @@ -24,7 +24,7 @@ The following default analyzer options are available: |Analyzer |Description | inherit -| If you set an analyzer to `inherit`, the Search index component inherits the xref:create-search-index-ui.adoc#default-analyzer[default analyzer set for an index]. +| If you set an analyzer to `inherit`, the Search index component inherits the xref:set-advanced-settings.adoc#default-analyzer[default analyzer set for an index]. | Arabic - ar | An Arabic language analyzer. diff --git a/modules/search/pages/set-advanced-settings.adoc b/modules/search/pages/set-advanced-settings.adoc new file mode 100644 index 000000000..1c7819e87 --- /dev/null +++ b/modules/search/pages/set-advanced-settings.adoc @@ -0,0 +1,59 @@ += Set Search Index Advanced Settings +:page-topic-type: guide +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: When using the Advanced Mode editor in Couchbase {page-ui-name}, you can configure additional advanced settings for your Search index. + +[abstract] +{description} + +Advanced Mode adds full customization and advanced features such as xref:create-custom-analyzer.adoc[creating custom analyzers] or xref:set-type-identifier.adoc[setting a document filter]. +For more information about the different settings and features available in a Search index, see xref:customize-index.adoc[]. + +You must create a Search index before you can xref:simple-search-ui.adoc[run a search] with the Search Service. + +== Prerequisites + +* You have the Search Service enabled on a node in your operational cluster. +For more information about how to change Services on your operational cluster, see xref:cloud:clusters:modify-database.adoc[]. + +* You have a bucket with scopes and collections in your operational cluster. +For more information, see xref:cloud:clusters:data-service/manage-buckets.adoc[]. + +* You have created a basic Search index with the {page-ui-name}. +For more information, see xref:create-search-index-ui.adoc[]. + +* You have logged in to the Couchbase {page-ui-name}. + +== Procedure + +To set advanced settings for a Search index with the {page-ui-name}: + +. On the *Operational Clusters* page, select the operational cluster where you created your Search index. +. Go to menu:Data Tools[Search]. +. Click the name of the index where you want to configure advanced settings. +. Click btn:[Enable Advanced Mode]. +. Do any of the following: +.. [[default-analyzer]]In the *Default Analyzer* list, select the xref:customize-index.adoc#analyzers[default analyzer] to assign to new xref:customize-index.adoc#type-mappings[type mappings] in your index. ++ +You can also choose to xref:create-custom-analyzer.adoc[]. +.. [[date-time]]In the *Default Date/Time Parser* list, select the xref:customize-index.adoc#date-time[default date/time parser] to use for date data in your index. ++ +You can also choose to xref:create-custom-date-time-parser.adoc[]. +.. Add a document filter to control how documents are included in your type mappings. +For more information, see xref:set-type-identifier.adoc[]. +.. Add a synonym source to support synonym searches. +For more information, see xref:synonyms-search.adoc[]. +.. Choose the scoring model you want to use with your Search index. +For more information about scoring models, see xref:customize-index.adoc#scoring-model[Scoring Model]. +.. If you're using xref:customize-index.adoc#dynamic[dynamic type mappings], choose how to handle dynamic fields in your Search index: +... To store the content of any fields added to a Search index from a dynamic type mapping, turn on *Store Dynamic Fields*. +... To include fields or whole documents in your Search index that match a dynamic type mapping, turn on *Index Dynamic Fields*. +. Click btn:[Update Index]. + +== Next Steps + +You can keep adding additional features to your Search index to improve performance and search results. +For more information, see xref:customize-index.adoc[]. + +For more information about how to run a search, see xref:simple-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/search/partials/nav.adoc b/modules/search/partials/nav.adoc index c781a9059..849079578 100644 --- a/modules/search/partials/nav.adoc +++ b/modules/search/partials/nav.adoc @@ -5,6 +5,7 @@ **** xref:cloud:search:create-type-mapping.adoc[] ***** xref:cloud:search:type-mapping-options.adoc[] **** xref:cloud:search:set-type-identifier.adoc[] + **** xref:cloud:search:set-advanced-settings.adoc[] **** xref:cloud:search:create-custom-analyzer.adoc[] ***** xref:cloud:search:create-custom-character-filter.adoc[] ***** xref:cloud:search:create-custom-tokenizer.adoc[] From ac1fdc5b2a8522176d2b32b36b4a0b960756930e Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 10 Oct 2025 14:04:42 +0100 Subject: [PATCH 57/80] DOC-13513: Update Configure Queries page (#446) * Remove credentials section * Remove 7.6 sidebar * TEMP: Update preview config --- modules/n1ql/pages/n1ql-manage/query-settings.adoc | 11 ----------- preview/AV-68634-tutorial-feature-branch.yml | 6 ------ preview/AV-91970-8-0-docs-uptake-capella.yml | 8 ++++++++ 3 files changed, 8 insertions(+), 17 deletions(-) delete mode 100644 preview/AV-68634-tutorial-feature-branch.yml create mode 100644 preview/AV-91970-8-0-docs-uptake-capella.yml diff --git a/modules/n1ql/pages/n1ql-manage/query-settings.adoc b/modules/n1ql/pages/n1ql-manage/query-settings.adoc index ef7e8d4c2..58b76424c 100644 --- a/modules/n1ql/pages/n1ql-manage/query-settings.adoc +++ b/modules/n1ql/pages/n1ql-manage/query-settings.adoc @@ -165,10 +165,6 @@ The table below contains details of all request-level parameters, along with exa .Request-Level Parameters include::n1ql-rest-query:index.adoc[tags=Request;!desc-more] -[[Credentials,Credentials]] -**Credentials** -include::n1ql-rest-query:index.adoc[tag=Credentials] - [discrete#transactional-scan-consistency] ===== Transactional Scan Consistency @@ -240,13 +236,6 @@ The name of this property is a dollar sign `$` or an at sign `@` followed by the You can supply the values for placeholder parameters using any of the methods used to specify <>. -**** -[.status]#Couchbase Server 7.6# - -The at sign `@` syntax is only supported in clusters running Couchbase Server 7.6.0 or later. -The dollar sign `$` syntax is supported in all versions of Couchbase Server. -**** - === Examples include::ROOT:partial$query-context.adoc[tag=section] diff --git a/preview/AV-68634-tutorial-feature-branch.yml b/preview/AV-68634-tutorial-feature-branch.yml deleted file mode 100644 index fbcb9168f..000000000 --- a/preview/AV-68634-tutorial-feature-branch.yml +++ /dev/null @@ -1,6 +0,0 @@ -sources: - docs-capella: - branches: [AV-68634-dev-tutorial-navigation] -override: - site: - startPage: cloud:get-started:intro.adoc diff --git a/preview/AV-91970-8-0-docs-uptake-capella.yml b/preview/AV-91970-8-0-docs-uptake-capella.yml new file mode 100644 index 000000000..ae98af0ca --- /dev/null +++ b/preview/AV-91970-8-0-docs-uptake-capella.yml @@ -0,0 +1,8 @@ +sources: + docs-capella: + branches: [8-0-docs-uptake] + cb-swagger: + branches: [AV-91970-8-0-docs-uptake-capella] +override: + site: + startPage: cloud:get-started:intro.adoc From b3879a325289826026987732dd3d3c1ebdbbd07a Mon Sep 17 00:00:00 2001 From: Gary Gray <137797428+ggray-cb@users.noreply.github.com> Date: Wed, 10 Sep 2025 10:12:31 -0400 Subject: [PATCH 58/80] DOC-12565 vector search concepts (#325) Full draft of the vector index concepts. --------- Co-authored-by: Simon Dew <39966290+simon-dew@users.noreply.github.com> --- .../images/cosine-similarity-example.svg | 1097 + .../assets/images/dot-product-example.svg | 1462 + .../assets/images/embedding-vectors.svg | 443 + .../images/euclidean-distance-example.svg | 1185 + .../assets/images/euclidean-example.svg | 779 + .../images/hypserscale-w-scalar-plan.svg | 1101 + .../assets/images/ivf-centroid-diagram.png | Bin 0 -> 465084 bytes .../assets/images/ivf-centroid-diagram.svg | 174743 +++++++++++++++ .../images/ivf-diagram-with-vectors.svg | 773 + .../assets/images/pq-centroid-diagram.png | Bin 0 -> 439296 bytes .../assets/images/pq-centroid-diagram.svg | 174443 ++++++++++++++ .../vector-index/assets/images/pq-diagram.svg | 1432 + .../vector-index/assets/images/sq-diagram.svg | 1288 + .../assets/images/vector-space-example.svg | 1411 + .../source/draw-centroid-ivf-diagram.py | 86 + .../assets/source/draw-centroid-pq-diagram.py | 86 + .../assets/source/draw-cosine-diagram.py | 155 + .../assets/source/draw-dot-product-diagram.py | 125 + .../source/draw-euclidean-distance-diagram.py | 67 + .../source/draw-vector-space-diagram.py | 41 + .../examples/composite-vector-data.json | 66 + .../examples/find-reranking-cases.py | 75 + .../examples/gsi-vector-idx-examples.sqlpp | 3184 + .../examples/hyperscale-idx-data.json | 395 + .../examples/hyperscale-idx-examples.sqlpp | 239 + .../pages/composite-vector-index.adoc | 468 + .../vector-index/pages/hyperscale-filter.adoc | 57 + .../pages/hyperscale-reranking.adoc | 89 + .../pages/hyperscale-vector-index.adoc | 280 + .../pages/use-vector-indexes.adoc | 284 + .../pages/vector-index-best-practices.adoc | 273 + .../pages/vectors-and-indexes-overview.adoc | 411 + .../partials/ai-app-workflow.puml | 96 + .../composite-vector-app-workflow.puml | 83 + .../partials/distance-metric-list.adoc | 8 + .../partials/fts-vector-app-workflow.puml | 74 + .../hyperscale-vector-app-workflow.puml | 82 + .../partials/index-algorithm-settings.adoc | 156 + modules/vector-index/partials/nav.adoc | 15 + 39 files changed, 367052 insertions(+) create mode 100644 modules/vector-index/assets/images/cosine-similarity-example.svg create mode 100644 modules/vector-index/assets/images/dot-product-example.svg create mode 100644 modules/vector-index/assets/images/embedding-vectors.svg create mode 100644 modules/vector-index/assets/images/euclidean-distance-example.svg create mode 100644 modules/vector-index/assets/images/euclidean-example.svg create mode 100644 modules/vector-index/assets/images/hypserscale-w-scalar-plan.svg create mode 100644 modules/vector-index/assets/images/ivf-centroid-diagram.png create mode 100644 modules/vector-index/assets/images/ivf-centroid-diagram.svg create mode 100644 modules/vector-index/assets/images/ivf-diagram-with-vectors.svg create mode 100644 modules/vector-index/assets/images/pq-centroid-diagram.png create mode 100644 modules/vector-index/assets/images/pq-centroid-diagram.svg create mode 100644 modules/vector-index/assets/images/pq-diagram.svg create mode 100644 modules/vector-index/assets/images/sq-diagram.svg create mode 100644 modules/vector-index/assets/images/vector-space-example.svg create mode 100644 modules/vector-index/assets/source/draw-centroid-ivf-diagram.py create mode 100644 modules/vector-index/assets/source/draw-centroid-pq-diagram.py create mode 100644 modules/vector-index/assets/source/draw-cosine-diagram.py create mode 100644 modules/vector-index/assets/source/draw-dot-product-diagram.py create mode 100644 modules/vector-index/assets/source/draw-euclidean-distance-diagram.py create mode 100644 modules/vector-index/assets/source/draw-vector-space-diagram.py create mode 100644 modules/vector-index/examples/composite-vector-data.json create mode 100644 modules/vector-index/examples/find-reranking-cases.py create mode 100644 modules/vector-index/examples/gsi-vector-idx-examples.sqlpp create mode 100644 modules/vector-index/examples/hyperscale-idx-data.json create mode 100644 modules/vector-index/examples/hyperscale-idx-examples.sqlpp create mode 100644 modules/vector-index/pages/composite-vector-index.adoc create mode 100644 modules/vector-index/pages/hyperscale-filter.adoc create mode 100644 modules/vector-index/pages/hyperscale-reranking.adoc create mode 100644 modules/vector-index/pages/hyperscale-vector-index.adoc create mode 100644 modules/vector-index/pages/use-vector-indexes.adoc create mode 100644 modules/vector-index/pages/vector-index-best-practices.adoc create mode 100644 modules/vector-index/pages/vectors-and-indexes-overview.adoc create mode 100644 modules/vector-index/partials/ai-app-workflow.puml create mode 100644 modules/vector-index/partials/composite-vector-app-workflow.puml create mode 100644 modules/vector-index/partials/distance-metric-list.adoc create mode 100644 modules/vector-index/partials/fts-vector-app-workflow.puml create mode 100644 modules/vector-index/partials/hyperscale-vector-app-workflow.puml create mode 100644 modules/vector-index/partials/index-algorithm-settings.adoc create mode 100644 modules/vector-index/partials/nav.adoc diff --git a/modules/vector-index/assets/images/cosine-similarity-example.svg b/modules/vector-index/assets/images/cosine-similarity-example.svg new file mode 100644 index 000000000..3c88ede3c --- /dev/null +++ b/modules/vector-index/assets/images/cosine-similarity-example.svg @@ -0,0 +1,1097 @@ + + + + + + + + 2025-01-16T14:23:50.569388 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/dot-product-example.svg b/modules/vector-index/assets/images/dot-product-example.svg new file mode 100644 index 000000000..e43e36c59 --- /dev/null +++ b/modules/vector-index/assets/images/dot-product-example.svg @@ -0,0 +1,1462 @@ + + + + + + + + 2025-01-16T11:01:53.235124 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/embedding-vectors.svg b/modules/vector-index/assets/images/embedding-vectors.svg new file mode 100644 index 000000000..bdfc5c963 --- /dev/null +++ b/modules/vector-index/assets/images/embedding-vectors.svg @@ -0,0 +1,443 @@ + + + +’Twas brillig, and the slithy toves + Did gyre and gimble in the wabe: +All mimsy were the borogoves, + And the mome raths outgrabe. + +“Beware the Jabberwock, my son! + The jaws that bite, the claws that catch! +Beware the Jubjub bird, and shun + The frumious Bandersnatch!” DataEmbedding ModelsVectors +all-MiniLM-L6-v2Resnet50OpenL3[ -3.3394, -2.3334, -3.0436, -3.3161, -1.9979, ... ][ -0.34820265, 0.6125417 -0.13429512, 0.25497625, ... ][ 0.00599869 -0.0045266 -0.0341841 -0.04532388 -0.03882601, ... ]TextImageAudio diff --git a/modules/vector-index/assets/images/euclidean-distance-example.svg b/modules/vector-index/assets/images/euclidean-distance-example.svg new file mode 100644 index 000000000..2727227de --- /dev/null +++ b/modules/vector-index/assets/images/euclidean-distance-example.svg @@ -0,0 +1,1185 @@ + + + + + + + + 2025-01-15T15:53:22.729761 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/euclidean-example.svg b/modules/vector-index/assets/images/euclidean-example.svg new file mode 100644 index 000000000..a797a01a0 --- /dev/null +++ b/modules/vector-index/assets/images/euclidean-example.svg @@ -0,0 +1,779 @@ + + + + + + + + 2025-01-15T13:58:48.604022 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/hypserscale-w-scalar-plan.svg b/modules/vector-index/assets/images/hypserscale-w-scalar-plan.svg new file mode 100644 index 000000000..d97f91b3a --- /dev/null +++ b/modules/vector-index/assets/images/hypserscale-w-scalar-plan.svg @@ -0,0 +1,1101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Main Query + + + + + + + + Sub Queries + + + + + + + + Stream + 00:00.002 (9.3%) + 3 in / 3 out + + + + + + Subquery + select raw ((((`rgb-questions`.`cou... + + + + + + + Limit + 3 + 00:00.000 + 3 in / 3 out + + + + + Collect + 1 in + + + + + + + Project + 3 terms + 00:00.000 (0.2%) + 3 in / 3 out + + + + + Project + 1 terms + 1 in / 1 out + + + + + + Filter + (170 < (`b`.`brightness`)) + 00:00.000 (0.1%) + 3 in / 3 out + + + + + Filter + ((meta(`rgb-questions`).`id`) = "#8... + 1 in / 1 out + + + + + + Fetch + rgb as b + 00:00.003 (12.3%) + 3 in / 3 out + + + + + Fetch + rgb-questions + 1 in / 1 out + + + + + + IndexScan3 + rgb.color_desc_hyperscale_brightnes... + as: b + 3 + 00:00.022 (77%) + + + + IndexScan3 + rgb-questions.#sequentialscan + 1 in / 1 out + + + + + + With + 00:00.000 (1.2%) + + + + + + + Authorize + 00:00.000 + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/ivf-centroid-diagram.png b/modules/vector-index/assets/images/ivf-centroid-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d31cd36cf44b1f65c14b7b9fd3e768b526087955 GIT binary patch literal 465084 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¨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≥~cN8RoFmC6VYF=%asFWQL>uet2D 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

5nrdq|4?y@Hpsnu=`{*mkKJuuZ&M?QAx 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 literal 0 HcmV?d00001 diff --git a/modules/vector-index/assets/images/ivf-centroid-diagram.svg b/modules/vector-index/assets/images/ivf-centroid-diagram.svg new file mode 100644 index 000000000..b5fa25b68 --- /dev/null +++ b/modules/vector-index/assets/images/ivf-centroid-diagram.svg @@ -0,0 +1,174743 @@ + + + + + + + + 2025-01-21T11:22:36.926818 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/ivf-diagram-with-vectors.svg b/modules/vector-index/assets/images/ivf-diagram-with-vectors.svg new file mode 100644 index 000000000..2aab94227 --- /dev/null +++ b/modules/vector-index/assets/images/ivf-diagram-with-vectors.svg @@ -0,0 +1,773 @@ + + + +Inverted File[0.6112, 0.8848, 0.8647, ... ][0.7873, 0.5196, 0.7417, ... ][0.7582, 0.1887, 0.3127, ... ]Centroids[0.5310, 0.8713, 0.9366, ... ][0.6948, 0.8841, 0.9403, ... ][0.6086, 0.8479, 0.9275, ... ] ... [0.9351, 0.4427, 0.6946, ... ][0.9070, 0.3921, 0.8074, ... ][0.6943, 0.3971, 0.6288, ... ] ... [0.5971, 0.3632, 0.2923, ... ][0.9355, 0.3466, 0.3779, ... ][0.6862, 0.0993, 0.4445, ... ] ... Vectors diff --git a/modules/vector-index/assets/images/pq-centroid-diagram.png b/modules/vector-index/assets/images/pq-centroid-diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..2b3761f653c7e8692af098ccf5dfc1e4c06edc79 GIT binary patch literal 439296 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

#J!zkWdv0e&dA*(% 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�*LczujrG6Z+86M`X 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%0AFi-d!mgKLp*IRjETiU_~sgQKdv znIiZVlG%lrV+=_^I}*bi*rf_t`x9v8A}R|LLR^m{8%`T55v~*}CT^$uMfds|T>5yJ zzc*{xMAn43KRfi4F{|eJVsPX=F7Jl)s-ir#ZAKL7=ExSpn5$Td>_Yr)%}&0K?^ru~ zTs%w19K@xR51QDNVoo@th;A^iUOh{FU> zVwzKttjQU})OY^`HuK@iw||c)($EXnnVIxXR4r#akexmkCGvB~ z-cz0LdE=tX%hUZO-Rb+$H>svi92sl(K_QALA!)Rj43H4fYcNeVZZ~̻|@FDFsT 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 z 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%0Dq@A_CB)L<%Dw;jsDdrxFvG~^}K8Rau% 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

?jrcBE-w<{CoVOvISI}Ht>b2bkE+@%NDDv9auUt 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

PS90PTzuf9VlFuY|wt8n^oud>U$F+64% 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 JowdW>|3B + + + + + + + 2025-01-21T14:44:37.531670 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/images/pq-diagram.svg b/modules/vector-index/assets/images/pq-diagram.svg new file mode 100644 index 000000000..dc9892172 --- /dev/null +++ b/modules/vector-index/assets/images/pq-diagram.svg @@ -0,0 +1,1432 @@ + + + +1Subspace 1Subspace 2Subspace X. . .[0.2113, 0.3594, ..., 0.1787, 0.7915, 0.1175, ..., 0.2543, [0.6404, 0.3555, ..., 0.2011, 0.8088, 0.1800, ..., 0.2837,0.8855, 0.6129, ..., 0.1616][0.6502, 0.6809, ..., 0.8088, 0.5766, 0.2704, ..., 0.4346, 0.1050, 0.8578, ..., 0.6275]. . .0.9007, 0.0672, ..., 0.2275]. . .Subspace 1Subspace 2Subspace X. . .. . .134214. . .CentroidIndex[0.6212, 0.6790, ..., 0.8101 ]1[0.7873, 0.5196, 0.7417, ... ]2[0.7582, 0.1887, 0.3127, ... ]3Codebook[0.6212, 0.6790, ..., 0.8101 ][0.7873, 0.5196, 0.7417, ... ][0.7582, 0.1887, 0.3127, ... ]CentroidIndex123Codebook1485314. . .11162102. . .Product QuantizationRaw VectorsQuantized Vectors diff --git a/modules/vector-index/assets/images/sq-diagram.svg b/modules/vector-index/assets/images/sq-diagram.svg new file mode 100644 index 000000000..c4ef0deda --- /dev/null +++ b/modules/vector-index/assets/images/sq-diagram.svg @@ -0,0 +1,1288 @@ + + + +1. . .[162,[60,[10,57,241,19,...]...]...]. . .Scalar QuantizationRaw VectorsQuantized Vectors[0.0421, 0.1594, ...] [0.2404, 0.8555, ...][0.6502, 0.2809, ...] . . .. . .0 0.0021 0.0000 - 0.0040 1 0.0067 0.0041 - 0.0080 Bin #CentroidDimensionValue Range162 0.6507 0.6480 - 0.6520 163 0.6534 0.6521 - 0.6560 . . .. . .CentroidBin#DimensionValue Range0 0.1016 0.1000 - 0.1031 1 0.1049 0.1032 - 0.1063 57 0.2799 0.2781 - 0.2812 58 0.2831 0.2813 - 0.2844 diff --git a/modules/vector-index/assets/images/vector-space-example.svg b/modules/vector-index/assets/images/vector-space-example.svg new file mode 100644 index 000000000..cdf4d3bd5 --- /dev/null +++ b/modules/vector-index/assets/images/vector-space-example.svg @@ -0,0 +1,1411 @@ + + + + + + + + 2025-01-15T13:56:45.816393 + image/svg+xml + + + Matplotlib v3.10.0, https://matplotlib.org/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/vector-index/assets/source/draw-centroid-ivf-diagram.py b/modules/vector-index/assets/source/draw-centroid-ivf-diagram.py new file mode 100644 index 000000000..0e80e3de0 --- /dev/null +++ b/modules/vector-index/assets/source/draw-centroid-ivf-diagram.py @@ -0,0 +1,86 @@ +# Illustrates how euclidean distance works +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.patches import FancyArrowPatch +from mpl_toolkits.mplot3d.proj3d import proj_transform +import numpy as np +import random + + +# Draws a cluster of random points around a point in space, labels the center with a star, and draws a +# sphere around the area. +def draw_cluster(x, y, z, color, dist=0.4, numpoints=10): + point_list = '' + # Draw some random points around the area + my_xs = [] + my_ys = [] + my_zs = [] + for point in range(numpoints): + my_x = random.uniform(x-dist, x+dist) + my_y = random.uniform(y-dist, y+dist) + my_z = random.uniform(z-dist, z+dist) + ax.scatter(my_x, my_y, my_z, color=color, s=20, alpha=0.8, edgecolors='black') + point_list += f' {point}: [{my_x:.4f}, {my_y:.4f}, {my_z:.4f}]\n' + my_xs.append(my_x) + my_ys.append(my_y) + my_zs.append(my_z) + + # Find center of all random points getting average of points + cx = np.mean(my_xs) + cy = np.mean(my_ys) + cz = np.mean(my_zs) + + # Plot centroid as a star + ax.scatter(cx, cy, cz, color=color, marker='*', s=100, edgecolors='black') + + # Draw a sphere to highlight the area + radius = dist + 0.1 + u = np.linspace(0, 2 * np.pi, 100) + v = np.linspace(0, np.pi, 100) + sx = radius * np.outer(np.cos(u), np.sin(v)) + cx + sy = radius * np.outer(np.sin(u), np.sin(v)) + cy + sz = radius * np.outer(np.ones(np.size(u)), np.cos(v)) + cz + # Add the sphere as a transparent surface + ax.plot_surface(sx, sy, sz, color=color, alpha=0.2) + point_list = f'centroid [{cx:.4f}, {cy:.4f}, {cz:.4f}] ({color})\n' + point_list + return point_list + +# Set up the 3D plot +fig = plt.figure(figsize=(12, 6)) +ax = fig.add_subplot(111, projection='3d') + +# Move the 3D plot to the left +ax.set_position([0.05, 0.1, 0.5, 0.8]) # [left, bottom, width, height] + +# Adjust size of 3d plot +fig.subplots_adjust(left=0.0, right=0.5, top=0.9, bottom=0.1) + +point_list = 'All points:\n' + +# Call to create a bunch of regions +point_list += draw_cluster(0.8, 0.5, 0.7, 'red', 0.15, 20) +point_list += draw_cluster(0.1, 0.1, 0.5, 'blue', 0.1, 20) +point_list += draw_cluster(0.75, 0.2, 0.3, 'green', 0.2, 30) +point_list += draw_cluster(0.2, 0.8, 0.6, 'orange', 0.15, 20) +point_list += draw_cluster(0.1, 0.7, 0.15, 'purple', 0.1, 10) +point_list += draw_cluster(0.25, 0.3, 0.1, 'maroon', 0.1, 10) +point_list += draw_cluster(0.6, 0.9, 0.85, 'cyan', 0.1, 10) + +print(point_list) + +# Set axis limits for better visibility +ax.set_xlim(0, 1) +ax.set_ylim(0, 1) +ax.set_zlim(0, 1) + +# Suppress numeric labels +ax.set_xticklabels([]) +ax.set_yticklabels([]) +ax.set_zticklabels([]) + + +# Show plot + +plt.savefig('ivf-centroid-diagram.svg') # Save as an image +plt.savefig('ivf-centroid-diagram.png') # Save as an image +plt.show() \ No newline at end of file diff --git a/modules/vector-index/assets/source/draw-centroid-pq-diagram.py b/modules/vector-index/assets/source/draw-centroid-pq-diagram.py new file mode 100644 index 000000000..44c30455c --- /dev/null +++ b/modules/vector-index/assets/source/draw-centroid-pq-diagram.py @@ -0,0 +1,86 @@ +# Illustrates how euclidean distance works +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +from matplotlib.patches import FancyArrowPatch +from mpl_toolkits.mplot3d.proj3d import proj_transform +import numpy as np +import random + + +# Draws a cluster of random points around a point in space, labels the center with a star, and draws a +# sphere around the area. +def draw_cluster(x, y, z, color, dist=0.4, numpoints=10): + point_list = '' + # Draw some random points around the area + my_xs = [] + my_ys = [] + my_zs = [] + for point in range(numpoints): + my_x = random.uniform(x-dist, x+dist) + my_y = random.uniform(y-dist, y+dist) + my_z = random.uniform(z-dist, z+dist) + ax.scatter(my_x, my_y, my_z, color=color, s=40, alpha=0.8) + point_list += f' {point}: [{my_x:.4f}, {my_y:.4f}, {my_z:.4f}]\n' + my_xs.append(my_x) + my_ys.append(my_y) + my_zs.append(my_z) + + # Find center of all random points getting average of points + cx = np.mean(my_xs) + cy = np.mean(my_ys) + cz = np.mean(my_zs) + + # Plot centroid as a star + ax.scatter(cx, cy, cz, color=color, marker='*', s=100, edgecolors='black') + + # Draw a sphere to highlight the area + radius = dist + 0.1 + u = np.linspace(0, 2 * np.pi, 100) + v = np.linspace(0, np.pi, 100) + sx = radius * np.outer(np.cos(u), np.sin(v)) + cx + sy = radius * np.outer(np.sin(u), np.sin(v)) + cy + sz = radius * np.outer(np.ones(np.size(u)), np.cos(v)) + cz + # Add the sphere as a transparent surface + ax.plot_surface(sx, sy, sz, color=color, alpha=0.2) + point_list = f'centroid [{cx:.4f}, {cy:.4f}, {cz:.4f}] ({color})\n' + point_list + return point_list + +# Set up the 3D plot +fig = plt.figure(figsize=(12, 6)) +ax = fig.add_subplot(111, projection='3d') + +# Move the 3D plot to the left +ax.set_position([0.05, 0.1, 0.5, 0.8]) # [left, bottom, width, height] + +# Adjust size of 3d plot +fig.subplots_adjust(left=0.0, right=0.5, top=0.9, bottom=0.1) + +point_list = 'All points:\n' + +# Call to create a bunch of regions +point_list += draw_cluster(0.8, 0.5, 0.7, 'red', 0.15, 10) +point_list += draw_cluster(0.1, 0.1, 0.5, 'blue', 0.1, 10) +point_list += draw_cluster(0.75, 0.2, 0.3, 'green', 0.2, 15) +point_list += draw_cluster(0.2, 0.8, 0.6, 'orange', 0.15, 10) +point_list += draw_cluster(0.1, 0.7, 0.15, 'purple', 0.1, 5) +point_list += draw_cluster(0.25, 0.3, 0.1, 'maroon', 0.1, 5) +point_list += draw_cluster(0.6, 0.9, 0.85, 'cyan', 0.1, 5) + +print(point_list) + +# Set axis limits for better visibility +ax.set_xlim(0, 1) +ax.set_ylim(0, 1) +ax.set_zlim(0, 1) + +# Suppress numeric labels +ax.set_xticklabels([]) +ax.set_yticklabels([]) +ax.set_zticklabels([]) + + +# Show plot + +plt.savefig('pq-centroid-diagram.svg') # Save as an image +plt.savefig('pq-centroid-diagram.png') # Save as an image +plt.show() \ No newline at end of file diff --git a/modules/vector-index/assets/source/draw-cosine-diagram.py b/modules/vector-index/assets/source/draw-cosine-diagram.py new file mode 100644 index 000000000..9aa892bbc --- /dev/null +++ b/modules/vector-index/assets/source/draw-cosine-diagram.py @@ -0,0 +1,155 @@ +import matplotlib.pyplot as plt +import numpy as np + + +def calculate_midpoint(origin, vector): + """ + Calculate the midpoint of a vector given an origin. + + Parameters: + origin (array-like): The coordinates of the origin (x, y, z). + vector (array-like): The components of the vector (vx, vy, vz). + + Returns: + numpy array: The coordinates of the midpoint. + """ + origin = np.array(origin) + vector = np.array(vector) + endpoint = origin + vector + midpoint = (origin + endpoint) / 2 + return midpoint + + +def calculate_endpoint(origin, vector): + """ + Calculate the midpoint of a vector given an origin. + + Parameters: + origin (array-like): The coordinates of the origin (x, y, z). + vector (array-like): The components of the vector (vx, vy, vz). + + Returns: + numpy array: The coordinates of the midpoint. + """ + origin = np.array(origin) + vector = np.array(vector) + endpoint = origin + vector + return endpoint + +def vector_magnitude(origin, vector): + # Convert origin and vector to numpy arrays + origin = np.array(origin) + vector = np.array(vector) + + # Calculate the difference between the origin and vector + diff = vector - origin + + # Calculate the magnitude (Euclidean distance) + magnitude = np.linalg.norm(diff) + + return magnitude + +def normalize(vector, origin=None): + if origin is not None: + # Subtract origin from the vector + vector = np.array(vector) - np.array(origin) + # Calculate the magnitude of the vector + magnitude = np.linalg.norm(vector) + # Normalize the vector + return vector / magnitude + +# Define two vectors in 3D space +v1 = np.array([2, 3, 5]) +v2 = np.array([6, 4, 6]) + +v1_origin = np.array([0, 0, 0]) +v2_origin = np.array([1, 0, 0]) + +v1_norm = normalize(v1, v1_origin) +v2_norm = normalize(v2, v2_origin) + +# Define two points in 3D space +#point1 = np.array([2, 3, 5]) +#point2 = np.array([6, 7, 2]) +point1 = calculate_endpoint(v1_origin, v1_norm) +point2 = calculate_endpoint(v2_origin, v2_norm) + + +# Compute a vector from point1 to point2 +vector = point2 - point1 +midpoint = (point1 + point2) / 2 + +# Find a perpendicular vector (normal to the line connecting the two points) +arbitrary_vector = np.array([1, 0, 0]) if vector[0] == 0 else np.array([0, 1, 0]) +normal_vector = np.cross(vector, arbitrary_vector).astype(float) # Convert to float +normal_vector /= np.linalg.norm(normal_vector) # Normalize the normal vector + +# Control the "height" of the arc (smaller values for a shallower arc) +arc_height = 0.5 + +# Generate points on the arc +t = np.linspace(0, 1, 100) +arc_points = (1 - t)[:, None] * point1 + t[:, None] * point2 + arc_height * np.sin(np.pi * t)[:, None] * normal_vector + +# Set up the plot +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +# Plot the vectors +ax.quiver(0, 0, 0, v1_norm[0], v1_norm[1], v1_norm[2], color='b', linewidth=2) +ax.quiver(1, 0, 0, v2_norm[0], v2_norm[1], v2_norm[2], color='r', linewidth=2) + +# Plot the original points +ax.scatter(*point1, color='b', s=100) +ax.scatter(*point2, color='r', s=100) + +# Plot the arc +ax.plot3D(arc_points[:, 0], arc_points[:, 1], arc_points[:, 2], 'g', linestyle='dotted', linewidth=2) + +# Label the arc +ax.text(*midpoint, r'$\theta$', color='k', fontsize=14) + +# Move the lables showing the vector magnitude a bit. +# text_offset = np.array([-1.3, 0, 2]) + +# Add vector magnitudes +#ax.text(*(point1 + text_offset), r'$\left| \mathbf{v_1} \right| = $' + "{:.2f}".format(vector_magnitude(v1_origin, v1)), color='b', fontsize=14) + + +#ax.text(*(point2 + text_offset), r'$\left| \mathbf{v_2} \right| = $' + "{:.2f}".format(vector_magnitude(v2_origin, v2)), color='r', fontsize=14) + + + + +# Set axis limits and labels +ax.set_xlim(0, 2) +ax.set_ylim(0, 2) +ax.set_zlim(0, 2) + +# The values on the axes were too close together, so this will filter out +# half of them. + +# Get the current ticks +x_ticks = ax.get_xticks() +y_ticks = ax.get_yticks() +z_ticks = ax.get_zticks() + +# Filter the ticks to show every other tick +x_ticks_custom = x_ticks[::2] +y_ticks_custom = y_ticks[::2] +z_ticks_custom = z_ticks[::2] + +# Set the custom ticks +ax.set_xticks(x_ticks_custom) +ax.set_yticks(y_ticks_custom) +ax.set_zticks(z_ticks_custom) + + +ax.set_xlabel('X-axis') +ax.set_ylabel('Y-axis') +ax.set_zlabel('Z-axis') +ax.set_title('Cosine Similarity') + +# Show plot +#plt.show() +plt.savefig('cosine-similarity-example.svg') # Save as an image diff --git a/modules/vector-index/assets/source/draw-dot-product-diagram.py b/modules/vector-index/assets/source/draw-dot-product-diagram.py new file mode 100644 index 000000000..11a8f0df4 --- /dev/null +++ b/modules/vector-index/assets/source/draw-dot-product-diagram.py @@ -0,0 +1,125 @@ +import matplotlib.pyplot as plt +import numpy as np + + +def calculate_midpoint(origin, vector): + """ + Calculate the midpoint of a vector given an origin. + + Parameters: + origin (array-like): The coordinates of the origin (x, y, z). + vector (array-like): The components of the vector (vx, vy, vz). + + Returns: + numpy array: The coordinates of the midpoint. + """ + origin = np.array(origin) + vector = np.array(vector) + endpoint = origin + vector + midpoint = (origin + endpoint) / 2 + return midpoint + + +def calculate_endpoint(origin, vector): + """ + Calculate the midpoint of a vector given an origin. + + Parameters: + origin (array-like): The coordinates of the origin (x, y, z). + vector (array-like): The components of the vector (vx, vy, vz). + + Returns: + numpy array: The coordinates of the midpoint. + """ + origin = np.array(origin) + vector = np.array(vector) + endpoint = origin + vector + return endpoint + +def vector_magnitude(origin, vector): + # Convert origin and vector to numpy arrays + origin = np.array(origin) + vector = np.array(vector) + + # Calculate the difference between the origin and vector + diff = vector - origin + + # Calculate the magnitude (Euclidean distance) + magnitude = np.linalg.norm(diff) + + return magnitude + +# Define two vectors in 3D space +v1 = np.array([2, 3, 5]) +v2 = np.array([6, 4, 6]) + +v1_origin = np.array([0, 0, 0]) +v2_origin = np.array([1, 0, 0]) + + + +# Define two points in 3D space +#point1 = np.array([2, 3, 5]) +#point2 = np.array([6, 7, 2]) +point1 = calculate_endpoint(v1_origin, v1) +point2 = calculate_endpoint(v2_origin, v2) + +midpoint1 = calculate_midpoint(v1_origin, v1) +midpoint2 = calculate_midpoint(v2_origin, v2) + + +# Compute a vector from point1 to point2 +vector = point2 - point1 +midpoint = (point1 + point2) / 2 + +# Find a perpendicular vector (normal to the line connecting the two points) +arbitrary_vector = np.array([1, 0, 0]) if vector[0] == 0 else np.array([0, 1, 0]) +normal_vector = np.cross(vector, arbitrary_vector).astype(float) # Convert to float +normal_vector /= np.linalg.norm(normal_vector) # Normalize the normal vector + +# Control the "height" of the arc (smaller values for a shallower arc) +arc_height = 1 + +# Generate points on the arc +t = np.linspace(0, 1, 100) +arc_points = (1 - t)[:, None] * point1 + t[:, None] * point2 + arc_height * np.sin(np.pi * t)[:, None] * normal_vector + +# Set up the plot +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +# Plot the vectors +ax.quiver(0, 0, 0, v1[0], v1[1], v1[2], color='b', linewidth=2) +ax.quiver(1, 0, 0, v2[0], v2[1], v2[2], color='r', linewidth=2) + +# Plot the original points +ax.scatter(*point1, color='b', s=100) +ax.scatter(*point2, color='r', s=100) + +# Plot the arc +ax.plot3D(arc_points[:, 0], arc_points[:, 1], arc_points[:, 2], 'g', linestyle='dotted', linewidth=2) + +# Label the arc +ax.text(*midpoint, r'$\theta$', color='k', fontsize=14) + +# Move the lables showing the vector magnitude a bit. +text_offset = np.array([-1.3, 0, 2]) + +# Add vector magnitudes +ax.text(*(point1 + text_offset), r'$\left| \mathbf{v_1} \right| = $' + "{:.2f}".format(vector_magnitude(v1_origin, v1)), color='b', fontsize=14) + + +ax.text(*(point2 + text_offset), r'$\left| \mathbf{v_2} \right| = $' + "{:.2f}".format(vector_magnitude(v2_origin, v2)), color='r', fontsize=14) + +# Set axis limits and labels +ax.set_xlim(0, 8) +ax.set_ylim(0, 8) +ax.set_zlim(0, 8) +ax.set_xlabel('X-axis') +ax.set_ylabel('Y-axis') +ax.set_zlabel('Z-axis') +ax.set_title('Dot Product') + +# Show plot +# plt.show() +plt.savefig('dot-product-example.svg') # Save as an image diff --git a/modules/vector-index/assets/source/draw-euclidean-distance-diagram.py b/modules/vector-index/assets/source/draw-euclidean-distance-diagram.py new file mode 100644 index 000000000..3f2dbdda4 --- /dev/null +++ b/modules/vector-index/assets/source/draw-euclidean-distance-diagram.py @@ -0,0 +1,67 @@ +# Illustrates how euclidean distance works +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D +import numpy as np + +# Define two vectors in 3D space +v1 = np.array([2, 3, 5]) +v2 = np.array([6, 4, 6]) + +v1_one_third = (1/3) * v1 +v2_one_third = (1/3) * v2 + +v1_two_third = (2/3) * v1 +v2_two_third = (2/3) * v2 + + + +# Set up the 3D plot +fig = plt.figure(figsize=(10, 7)) +ax = fig.add_subplot(111, projection='3d') + +# Plot the vectors +ax.quiver(0, 0, 0, v1[0], v1[1], v1[2], color='b', linewidth=2) +ax.quiver(1, 1, 1, v2[0], v2[1], v2[2], color='r', linewidth=2) + +# Plot points +ax.scatter(0,0,0, color='r', s=100) +ax.scatter(1,1,1, color='r', s=100) + +ax.scatter(v1_one_third[0],v1_one_third[1],v1_one_third[2], color='r', s=100) +ax.scatter(v2_one_third[0]+1,v2_one_third[1]+1,v2_one_third[2]+1, color='r', s=100) + +ax.scatter(v1_two_third[0],v1_two_third[1],v1_two_third[2], color='r', s=100) +ax.scatter(v2_two_third[0]+1,v2_two_third[1]+1,v2_two_third[2]+1, color='r', s=100) + +# Draw dotted lines connecting corresponding points on the two vectors + +ax.plot([0,1], [0,1], [0,1], linestyle='dotted', color='k') + +ax.plot([v1_one_third[0], v2_one_third[0]+1], [v1_one_third[1], v2_one_third[1]+1], [v1_one_third[2], v2_one_third[2]+1], linestyle='dotted', color='k') + +ax.plot([v1_two_third[0], v2_two_third[0]+1], [v1_two_third[1], v2_two_third[1]+1], [v1_two_third[2], v2_two_third[2]+1], linestyle='dotted', color='k') + + + +#ax.plot([v1[0], v2[0]], [v1[1], v1[1]], [v1[2], v1[2]], linestyle='dotted', color='k') # X-axis difference +#ax.plot([v2[0], v2[0]], [v1[1], v2[1]], [v1[2], v1[2]], linestyle='dotted', color='k') # Y-axis difference +#ax.plot([v2[0], v2[0]], [v2[1], v2[1]], [v1[2], v2[2]], linestyle='dotted', color='k') # Z-axis difference + +# Highlight the Euclidean distance with a line between the vector endpoints +ax.plot([v1[0], v2[0]+1], [v1[1], v2[1]+1], [v1[2], v2[2]+1], color='k', linestyle='dotted') + +# Set axis limits for better visibility +ax.set_xlim(0, 7) +ax.set_ylim(0, 7) +ax.set_zlim(0, 7) + +# Labels and title +ax.set_xlabel('X-axis') +ax.set_ylabel('Y-axis') +ax.set_zlabel('Z-axis') +ax.set_title('Euclidean Distance') +ax.legend() + +# Show plot +#plt.show() +plt.savefig('euclidean-distance-example.svg') # Save as an image \ No newline at end of file diff --git a/modules/vector-index/assets/source/draw-vector-space-diagram.py b/modules/vector-index/assets/source/draw-vector-space-diagram.py new file mode 100644 index 000000000..f53a75586 --- /dev/null +++ b/modules/vector-index/assets/source/draw-vector-space-diagram.py @@ -0,0 +1,41 @@ +# Script to generate the 3D vector diagram in +# This mainly came about because ChatGPT lied to me about Kroki supporting +# Matplotlib. It does not. Instead of throwing away the work to generate this +# diagram, I'll just check in the source code and include the SVG file in the document. +# +# If You need to update this diagram, you will need to install Python 3, numpy and +# matplotlib. On MacOS, this can be done via the brew command. + +import numpy as np +import matplotlib.pyplot as plt +from mpl_toolkits.mplot3d import Axes3D + +# Define the AI embedded vectors for feral cats, domestic cats, and Linux command line cat tool +feral_cats_vector = np.array([0.13, 0.21, 0.34]) +domestic_cats_vector = np.array([0.1, 0.27, 0.30]) +linux_cat_vector = np.array([0.4, 0.4, 0.3]) + +# Create a figure and a 3D axis +fig = plt.figure() +ax = fig.add_subplot(111, projection='3d') + +# Plot the vectors +ax.quiver(0, 0, 0.1, feral_cats_vector[0], feral_cats_vector[1], feral_cats_vector[2], color='indianred', label='Feral Cats') +ax.quiver(0, 0.1, 0, domestic_cats_vector[0], domestic_cats_vector[1], domestic_cats_vector[2], color='darkred', label='Domestic Cats') +ax.quiver(0.4, 0.3, 0.1, linux_cat_vector[0], linux_cat_vector[1], linux_cat_vector[2], color='green', label='Linux Cat Command') + +# Set the plot labels +ax.set_xlabel('X') +ax.set_ylabel('Y') +ax.set_zlabel('Z') + +# Set the plot limits +ax.set_xlim([0.0, 0.8]) +ax.set_ylim([0.0, 0.8]) +ax.set_zlim([0.0, 0.8]) + +# Add a legend +ax.legend() + +plt.savefig('vector-space-example.svg') # Save as an image +plt.close() diff --git a/modules/vector-index/examples/composite-vector-data.json b/modules/vector-index/examples/composite-vector-data.json new file mode 100644 index 000000000..95d494f73 --- /dev/null +++ b/modules/vector-index/examples/composite-vector-data.json @@ -0,0 +1,66 @@ +// tag::sample-doc[] +[{ + "brightness": 240.82, + "color": "papaya whip", + "colorvect_l2": [ + 255, + 239, + 213 + ], + "description": "Papaya whip is a soft and mellow color that can be + described as a light shade of peach or coral. It has + a calming and soothing effect, similar to the tropical + fruit it is named after. This color is perfect for + creating a warm and inviting atmosphere, and it pairs + well with other pastel shades or neutral tones. Papaya + whip is a versatile color that can be used in both fashion + and interior design, adding a touch of elegance and + sophistication to any space.", + "embedding_model": "text-embedding-ada-002-v2", + "embedding_vector_dot": [ + -0.014644118957221508, + 0.017003899440169334, + -0.013450744561851025, + 0.0021356006618589163, + "..." + ], + "id": "#FFEFD5", + "verbs": [ + "soften", + "mellow", + "lighten" + ], + "wheel_pos": "other" +}] +// end::sample-doc[] + +// tag::sample-doc-question[] +[{ + "couchbase_search_query": { + "fields": [ + "*" + ], + "knn": [{ + "field": "embedding_vector_dot", + "k": 3, + "vector": [ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + 0.000619320897385478, + "..." + ] + }], + "query": { + "match_none": {} + }, + "sort": [ + "-_score" + ] + }, + "embedding_model": "text-embedding-ada-002-v2", + "id": "#FFEFD5", + "question": "What is the name of the color that is reminiscent of a tropical fruit and has a calming effect, often used in fashion and interior design?", + "wanted_similar_color_from_search": "papaya whip" +}] +// end::sample-doc-question[] diff --git a/modules/vector-index/examples/find-reranking-cases.py b/modules/vector-index/examples/find-reranking-cases.py new file mode 100644 index 000000000..30fae2822 --- /dev/null +++ b/modules/vector-index/examples/find-reranking-cases.py @@ -0,0 +1,75 @@ +# This script just iterates over all of the colors in the example dataset to find cases +# where reranking improved the search results. + +import sys +from couchbase.cluster import Cluster, ClusterOptions +from couchbase.auth import PasswordAuthenticator +from couchbase.options import QueryOptions +from datetime import timedelta + + +# --- Configuration --- +COUCHBASE_URL = "couchbase://localhost" +USERNAME = "Administrator" +PASSWORD = "password" +BUCKET_NAME = "vector-sample" + +# --- Connect to Cluster --- +cluster = Cluster(COUCHBASE_URL, ClusterOptions(PasswordAuthenticator(USERNAME, PASSWORD))) +cluster.wait_until_ready(timedelta(seconds=10)) + +# --- Get all search-color IDs --- +get_ids_query = "SELECT META().id AS id FROM `vector-sample`.`color`.`rgb`" +search_colors = cluster.query(get_ids_query) +search_color_ids = [row["id"] for row in search_colors] + +# --- Function to run vector queries --- +def run_vector_query(search_color_id, use_rerank=False, limit=10): + rerank_str = "TRUE" if use_rerank else "FALSE" + query = f""" + WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "{search_color_id}") + SELECT b.color, b.description, b.id + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4, {rerank_str}) + LIMIT {limit}; + """ + return list(cluster.query(query)) + +# --- Analyze and compare results --- +for search_color_id in search_color_ids: + # print(f"\n🔍 Search Color: {search_color_id}") + + try: + # Run both queries + results1 = run_vector_query(search_color_id, use_rerank=False) + results2 = run_vector_query(search_color_id, use_rerank=True) + except Exception as e: + print(f"⚠️ Query error for {search_color_id}: {e}") + continue + + ids1 = [doc["id"] for doc in results1] + ids2 = [doc["id"] for doc in results2] + + in_both = search_color_id in ids1 and search_color_id in ids2 + + if in_both: + idx1 = ids1.index(search_color_id) + idx2 = ids2.index(search_color_id) + if idx2 < idx1: + print(f"✅ Reranking improved rank for {search_color_id}: {idx1} ➜ {idx2}") + # sys.exit(0) + # else: + # print(f"→ No improvement (Rank: {idx1} ➜ {idx2})") + # else: + # if search_color_id in ids1: + # print("⚠️ Present only in first query, not in reranked results.") + # elif search_color_id in ids2: + # print("⚠️ Present only in reranked results, not in first query.") + # else: + # print("❌ Not present in either result set.") + +# --- Final Message --- +# print("\n❌ Reranking did not improve the rank of any search-color.") diff --git a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp new file mode 100644 index 000000000..5cbd1303e --- /dev/null +++ b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp @@ -0,0 +1,3184 @@ +/* tag::get-sample-doc[] */ +SELECT RAW OBJECT_PUT(d, "embedding_vector_dot", + ARRAY_CONCAT(d.embedding_vector_dot[0:4], ["..."]) +) +FROM `vector-sample`.`color`.`rgb` AS d +USE KEYS ["#FFEFD5"]; +/* end::get-sample-doc[] */ + +/* tag::get-sample-doc-question[] */ +SELECT RAW OBJECT_PUT(d, "couchbase_search_query", + OBJECT_PUT(d.couchbase_search_query, "knn", + ARRAY OBJECT_PUT(k, "vector", + ARRAY_CONCAT(k.vector[0:4], ["..."]) + ) + FOR k IN d.couchbase_search_query.knn END + ) +) +FROM `vector-sample`.`color`.`rgb-questions` AS d +USE KEYS ["#FFEFD5"]; +/* end::get-sample-doc-question[] */ + + +/* tag::create-rgb-idx[] */ +CREATE INDEX `color_vectors_idx` ON `vector-sample`.`color`.`rgb` + (`colorvect_l2` VECTOR, color, brightness) + WITH { "dimension":3 , "similarity":"L2", "description":"IVF,SQ8"}; +/* end::create-rgb-idx[] */ + +/* tag::create-vectors-idx[] */ +CREATE INDEX `color_desc_idx` ON `vector-sample`.`color`.`rgb` + (`embedding_vector_dot` VECTOR, color, brightness) + WITH { "dimension":1536, "similarity":"DOT", "description":" IVF,SQ8" } +/* end::create-vectors-idx[] */ + +/* tag::query-rgb-idx[] */ +SELECT b.color, b.colorvect_l2, b.brightness from `rgb` AS b +ORDER BY APPROX_VECTOR_DISTANCE(b.colorvect_l2,[128,128,128],"L2") +LIMIT 5; +/* end::query-rgb-idx[] */ + +/* tag::query-rgb-idx-w-predicate[] */ +SELECT b.color, b.colorvect_l2, b.brightness from `rgb` AS b +WHERE b.brightness > 128 +ORDER BY APPROX_VECTOR_DISTANCE(b.colorvect_l2,[128,128,128],"L2") +LIMIT 5; +/* end::query-rgb-idx-w-predicate[] */ + +/* tag::query-vectors-idx-subquery[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + from `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#FFEFD5") +SELECT b.color, b.description from `rgb` AS b +order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +question_vec[0], "DOT") LIMIT 3; +/* end::query-vectors-idx-subquery[] */ + +/* tag::query-vectors-idx-truncated[] */ +SELECT b.color, b.description from `rgb` AS b +order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +[ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + /* long list of vector values omitted */ + -0.005022349301725626, + 0.002007648814469576, + -0.03757078945636749 + ], "DOT") LIMIT 3; +/* end::query-vectors-idx-truncated[] */ + +/* tag::query-vectors-idx-subquery-filtered[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + from `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#FFEFD5") +SELECT b.color, b.description, b.brightness from `rgb` AS b +WHERE b.brightness > 190.0 +order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +question_vec[0], "DOT") LIMIT 3; +/* end::query-vectors-idx-subquery-filtered[] */ + +/* tag::query-vectors-idx-whole[] */ +SELECT b.color, b.description from `rgb` AS b +order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +[ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + 0.000619320897385478, + 0.006700769532471895, + 0.018410978838801384, + -0.010367471724748611, + -0.019805356860160828, + 0.013059400022029877, + -0.011271236464381218, + -0.011251870542764664, + -0.004915834404528141, + -0.0031744735315442085, + 0.00843728892505169, + -0.01706824265420437, + 0.013362806290388107, + 0.04694411903619766, + 0.011258325539529324, + 0.01298193447291851, + -0.01080644316971302, + -0.01744265854358673, + 0.0044155362993478775, + -0.00742378132417798, + 0.014214927330613136, + -0.01248486340045929, + 0.0009481459856033325, + 0.027293693274259567, + -0.029204510152339935, + 0.006355402525514364, + 0.016254853457212448, + 0.02933361940085888, + -0.017352283000946045, + 0.007236572913825512, + -0.017094064503908157, + 0.002293302910402417, + -0.018139848485589027, + 0.007811109069734812, + 0.015028315596282482, + -0.008785883896052837, + -0.013453182764351368, + -8.422360406257212e-05, + 0.010896819643676281, + 0.002246500924229622, + -0.010586957447230816, + -0.0011482653208076954, + -0.003537593176588416, + 0.02017977461218834, + -0.013491915538907051, + -0.00977356918156147, + 0.01215563528239727, + 0.032122381031513214, + 0.02827492356300354, + 0.002995334332808852, + -0.027396980673074722, + 0.004583378322422504, + 0.0007577098440378904, + 0.00016683334251865745, + 0.025731472298502922, + 0.006158510688692331, + -0.008288813754916191, + 0.00016885067452676594, + 0.01956005021929741, + -0.01309813279658556, + 0.009934956207871437, + -0.007920851930975914, + 0.008721329271793365, + -0.032354775816202164, + -0.0031050771940499544, + -0.0049997554160654545, + 0.029178688302636147, + 0.0075980788096785545, + 0.024995548650622368, + 0.018165670335292816, + -0.008463110774755478, + 0.025292500853538513, + -0.0031518794130533934, + -0.01706824265420437, + -0.00925713311880827, + -0.013375717215240002, + 0.0066749476827681065, + 0.015144513919949532, + -0.0011805426329374313, + -0.037312570959329605, + 0.015092870220541954, + 0.01786871999502182, + 0.015002493746578693, + -0.020631656050682068, + 0.0021415995433926582, + -0.004912606440484524, + -0.004880329128354788, + -0.012523596175014973, + 0.024246715009212494, + 0.02413051761686802, + 0.0008162125013768673, + -0.02077367715537548, + 0.005419360473752022, + 0.008508299477398396, + 0.010470759123563766, + 0.0004575308703351766, + -0.01443441305309534, + -0.00852766539901495, + 0.017326461151242256, + -0.03674449026584625, + -0.009579905308783054, + -0.018643373623490334, + -0.0009473390528000891, + 0.00832109060138464, + -0.0016057961620390415, + 0.023614080622792244, + -0.024272536858916283, + -0.042502760887145996, + 0.03207073733210564, + 0.009534717537462711, + -0.041082561016082764, + -0.010651512071490288, + -0.01997319981455803, + 0.016306497156620026, + 0.015648040920495987, + -0.00894081499427557, + -0.03473038598895073, + -0.00884398352354765, + 0.018010739237070084, + 0.019004879519343376, + -0.015970813110470772, + 0.01914690062403679, + 0.0008166159386746585, + -0.006232748739421368, + -0.033568404614925385, + -0.03416230529546738, + -0.02494390495121479, + 0.02163870818912983, + 0.01701659895479679, + -0.004396169912070036, + 0.003786128479987383, + -0.008372734300792217, + 0.014563522301614285, + -0.01029646210372448, + 0.005622707307338715, + 0.010270640254020691, + 0.0004607586015481502, + 0.032096557319164276, + 0.021096449345350266, + -0.00034355162642896175, + -0.007966040633618832, + -0.004928745329380035, + 0.02806834876537323, + 0.010528858751058578, + 0.013349895365536213, + -0.006629759445786476, + -0.01913398876786232, + 0.02205185778439045, + -0.015480197966098785, + 0.02580893784761429, + 0.013362806290388107, + 0.010244818404316902, + 0.024246715009212494, + -0.0043122489005327225, + 0.0009594430448487401, + -0.02948855049908161, + 0.005044943653047085, + -0.004499457310885191, + -0.010373927652835846, + 0.0007040488417260349, + 0.012032981030642986, + 0.02039925940334797, + 0.02788759581744671, + 0.01807529479265213, + 0.008695507422089577, + 0.0015170335536822677, + 0.02059292420744896, + -0.012291199527680874, + 0.02706129662692547, + -0.009663826785981655, + 0.01101301796734333, + -0.013336984440684319, + 0.025705650448799133, + 0.006765324156731367, + 0.007197840139269829, + 0.024156339466571808, + -0.012975478544831276, + -0.03098621778190136, + -0.004870646167546511, + -0.000659667537547648, + -0.01186513900756836, + -0.007849842309951782, + -0.005797004792839289, + 0.022310076281428337, + -0.02099316194653511, + 0.0013346667401492596, + -0.011600465513765812, + -0.002236817730590701, + 0.020825320854783058, + 0.0010651513002812862, + -0.022826513275504112, + -0.6420344114303589, + 8.150020585162565e-05, + -0.014214927330613136, + -0.015841703861951828, + 0.02079949900507927, + 0.020205596461892128, + 0.037544965744018555, + 0.012265377677977085, + 0.0005870435852557421, + -0.01665509305894375, + 0.005919658578932285, + 0.013349895365536213, + 0.016577627509832382, + -0.01664218120276928, + 0.0006382837891578674, + -0.013969619758427143, + -0.017326461151242256, + -0.00033669269760139287, + -0.013027122244238853, + 0.00042283275979571044, + -0.00431870436295867, + 0.02161288633942604, + -0.007572256959974766, + 0.007262394763529301, + 0.019469672814011574, + 0.01372431218624115, + 0.001147458446212113, + -0.013479004614055157, + 0.014279481954872608, + 0.043587278574705124, + -0.027138762176036835, + 0.015118692070245743, + 8.61400694702752e-05, + 0.00968319270759821, + 0.04738309234380722, + 0.01579006016254425, + -0.026544859632849693, + 0.03506607189774513, + -0.022348809987306595, + 0.05510382354259491, + -0.01931474171578884, + 0.011671475134789944, + 0.02081240899860859, + -0.03098621778190136, + 0.0003318511007819325, + 0.021574154496192932, + 0.024272536858916283, + -0.015854615718126297, + 0.028378210961818695, + -0.015467287041246891, + 0.019689159467816353, + 0.005471004173159599, + 0.014718453399837017, + 0.0048641907051205635, + 0.00894081499427557, + 0.010845175944268703, + 0.030056631192564964, + -0.016538893803954124, + 0.012317021377384663, + 0.009366875514388084, + -0.003025997895747423, + 0.0029791956767439842, + -0.01434403657913208, + -0.019185632467269897, + -0.014976671896874905, + 0.03465292230248451, + -0.013788866810500622, + -0.013091676868498325, + -0.0024353230837732553, + -0.028791360557079315, + -0.005522647872567177, + -0.008630952797830105, + -0.02286524698138237, + 0.009418519213795662, + 0.00011145758617203683, + -0.0103932935744524, + 0.012342843227088451, + 0.017584679648280144, + -0.008288813754916191, + 0.009754203259944916, + 0.0016525982646271586, + -0.00712683005258441, + -0.005467776209115982, + 0.0034956326708197594, + 0.0353759340941906, + 0.013324073515832424, + -0.03535011038184166, + -0.04258022829890251, + 0.01322078611701727, + 0.011193770915269852, + 0.023756099864840508, + 0.030934574082493782, + 0.0018236680189147592, + -0.0009667054400779307, + -0.012588150799274445, + 0.003983020316809416, + -0.02369154617190361, + -0.015234890393912792, + -0.026299552991986275, + -0.007107463665306568, + 0.00779174268245697, + -0.015389821492135525, + -0.012310566380620003, + 0.008262991905212402, + 0.02664814703166485, + -0.0017284499481320381, + -0.0297467689961195, + 0.022607028484344482, + 0.023575346916913986, + -0.017326461151242256, + 0.020115219056606293, + -0.026751434430480003, + 0.0026580365374684334, + 0.003090552520006895, + 0.03596983477473259, + -0.02451784536242485, + 0.02471150830388069, + -0.003347157035022974, + -0.007533524185419083, + -0.02556362934410572, + 0.02933361940085888, + -0.013298251666128635, + -0.014279481954872608, + 0.007507702335715294, + 0.017571767792105675, + 0.00280489819124341, + -0.008424378000199795, + -0.0010514333844184875, + -0.0030469780322164297, + -0.0012862507719546556, + 0.021161004900932312, + -0.0022755505051463842, + -0.0011644039768725634, + 0.0031744735315442085, + -0.00047205566079355776, + -0.014576433226466179, + 0.004460724536329508, + -0.010031787678599358, + 0.008256535977125168, + -0.04513658955693245, + -0.019288919866085052, + -0.013233697041869164, + 0.00965091586112976, + 0.0026709474623203278, + -0.021884016692638397, + -0.03516935929656029, + -0.03281956911087036, + 0.008663230575621128, + -0.038784414529800415, + -0.010322283953428268, + -0.016474340111017227, + -0.013788866810500622, + -0.022568294778466225, + 0.03183833882212639, + 0.025834759697318077, + -0.0028807499911636114, + -0.02100607380270958, + -0.02249082922935486, + -0.01434403657913208, + -0.007365682162344456, + 0.01994737796485424, + 0.02972094714641571, + -0.008837527595460415, + -0.009457251988351345, + -0.013595202937722206, + -0.04121166840195656, + -0.009605727158486843, + 0.013111043721437454, + -0.010877453722059727, + -0.023368772119283676, + 0.012420308776199818, + -0.012820547446608543, + -0.006842789705842733, + 0.012523596175014973, + -0.005935797467827797, + 0.013646846637129784, + -0.006868611555546522, + -0.021264292299747467, + -0.002252956386655569, + -0.007681999821215868, + 0.00020627219055313617, + 0.009089291095733643, + -0.005713083781301975, + -0.005212785676121712, + 0.03496278449892998, + 0.001072413637302816, + 0.022090591490268707, + 0.07266268134117126, + -0.02431127056479454, + 0.032974500209093094, + -0.0030485920142382383, + 0.009289409965276718, + -0.01660344935953617, + 0.001254780450835824, + -0.01340153906494379, + 0.01103238482028246, + 0.010199629701673985, + -0.0026919275987893343, + -0.012142724357545376, + -0.005038488190621138, + 0.031709231436252594, + 0.023562436923384666, + 0.011781218461692333, + -0.003963653929531574, + 0.016164477914571762, + -0.02034761570394039, + 0.016745468601584435, + 0.0006649125716648996, + 0.008069328032433987, + 0.022168057039380074, + -0.0036215141881257296, + -0.03199326992034912, + -0.008366279304027557, + -0.014576433226466179, + 0.006668492220342159, + 0.0007762692985124886, + 0.00029594259103760123, + 0.010864542797207832, + -0.0174555703997612, + 0.013349895365536213, + 0.017984917387366295, + 0.010993652045726776, + 0.01976662501692772, + -0.013956708833575249, + -0.00499007198959589, + 0.007546435110270977, + 0.014498967677354813, + -0.0032164340373128653, + -0.01974080316722393, + -0.03395573049783707, + -0.013853421434760094, + -0.0065393829718232155, + -0.005961619317531586, + 0.0028016704600304365, + -0.005122409202158451, + 0.005061082076281309, + 0.01603536866605282, + -0.024595310911536217, + 0.03449799120426178, + 0.008217803202569485, + 0.01891450397670269, + 0.031683407723903656, + 0.005170824937522411, + 0.006481283809989691, + 0.04433611407876015, + -0.02637701854109764, + 0.0172231737524271, + 0.005474231671541929, + 0.0028710667975246906, + 0.0050417156890034676, + -0.026351196691393852, + -0.007681999821215868, + -0.04808028042316437, + 0.009780025109648705, + 0.011619831435382366, + -0.013982530683279037, + 0.014576433226466179, + -0.0004478476766962558, + 0.020864052698016167, + 0.017545945942401886, + 0.02428544871509075, + -0.019043613225221634, + 0.009986599907279015, + -0.01952131651341915, + 0.00379258394241333, + 0.008004773408174515, + 0.004909378942102194, + 0.003116374369710684, + -0.018785394728183746, + -0.008095149882137775, + 0.008701963350176811, + -0.0237173680216074, + 0.009082835167646408, + -0.02453075535595417, + -0.0049674781039357185, + 0.0127753596752882, + -0.003941059578210115, + -0.018165670335292816, + -0.00499007198959589, + 0.00441230833530426, + -0.010193174704909325, + -0.032328955829143524, + 0.004309020936489105, + 0.0170553307980299, + -0.005080448463559151, + -0.018630463629961014, + -0.00671368045732379, + 0.030237384140491486, + -0.026958009228110313, + 0.0016606675926595926, + 0.024375824257731438, + 0.033800799399614334, + 0.022619938477873802, + -0.0027839180547744036, + -0.0024272536393254995, + -0.02493099495768547, + 0.017829986289143562, + 0.004564011935144663, + 0.010690244846045971, + -0.00247244187630713, + 0.006426412612199783, + -0.006271481513977051, + -0.024220893159508705, + 0.008295268751680851, + 0.02227134443819523, + 0.017300639301538467, + 0.002096411306411028, + -0.00018418239778839052, + 0.00420250603929162, + -0.019430940970778465, + -0.010774166323244572, + -0.011903871782124043, + 0.0039023268036544323, + -0.00925713311880827, + 0.009276499040424824, + 0.015118692070245743, + -0.016383962705731392, + -0.018359335139393806, + 0.042270366102457047, + -0.013582292012870312, + 0.0026806306559592485, + -0.011206681840121746, + -0.014821740798652172, + 0.007075186353176832, + 0.05422588065266609, + -0.006026173941791058, + -0.010412660427391529, + 0.0015331722097471356, + 0.019676247611641884, + 0.012058802880346775, + -0.021303024142980576, + -0.02076076529920101, + 0.00893435999751091, + 0.004357437137514353, + -0.0068105123937129974, + 0.003177701262757182, + -0.014770097099244595, + 0.008469566702842712, + 0.0034052561968564987, + 0.001760727260261774, + -0.0002231169055448845, + -0.02892046980559826, + -0.006868611555546522, + -0.028326567262411118, + -0.014369858428835869, + 0.014395680278539658, + -0.005064310040324926, + 0.015467287041246891, + -0.010787077248096466, + 0.010832265019416809, + 0.038242157548666, + 0.018785394728183746, + 0.006449006497859955, + -0.020463814958930016, + 0.014679720625281334, + 0.0031486516818404198, + -0.007694910746067762, + 0.001307231024838984, + -0.030237384140491486, + -0.003976564854383469, + -0.020902786403894424, + -0.005809915717691183, + -0.01404708530753851, + -0.003650563769042492, + -0.003025997895747423, + 0.015660950914025307, + -0.014176194556057453, + -0.0116262873634696, + 0.01331116259098053, + -0.010535313747823238, + -0.014085818082094193, + 0.003834544448181987, + -0.013956708833575249, + 0.01422783825546503, + 0.007656177971512079, + -0.0012346070725470781, + -0.0008440516539849341, + -0.006145599763840437, + 0.0010465917875990272, + 0.0094766179099679, + -0.023188019171357155, + -0.0028339477721601725, + 0.01321433112025261, + -0.019689159467816353, + -0.0012321863323450089, + -0.022335898131132126, + 0.0003241852391511202, + 0.008256535977125168, + -0.011613376438617706, + -0.04136659950017929, + 0.005361261311918497, + -0.038242157548666, + -0.01059341337531805, + -0.014576433226466179, + -0.005667895544320345, + -0.027319515123963356, + -0.012704349122941494, + 0.01828186959028244, + 0.02349788136780262, + 0.02330421842634678, + 0.007236572913825512, + 0.00861804187297821, + 0.01975371316075325, + 0.01621612161397934, + -0.0014678107108920813, + -0.009424974210560322, + -0.006681403145194054, + -0.018772482872009277, + -0.0005394345498643816, + -0.0009868787601590157, + 0.0320449136197567, + -0.015635129064321518, + -0.01580297201871872, + 0.010122164152562618, + 0.016177387908101082, + -0.013259518891572952, + 0.03413648530840874, + -0.021057717502117157, + -0.00473508145660162, + 0.018152760341763496, + 0.011000107042491436, + 0.015919169411063194, + -0.004273516125977039, + -0.027758486568927765, + 0.008914993144571781, + -0.026983831077814102, + -0.0003104673814959824, + -0.02206476964056492, + 0.012168546207249165, + -0.00358600914478302, + -0.009308775886893272, + 0.0029097995720803738, + -0.018979057669639587, + -0.007385048549622297, + 0.010464304126799107, + -0.005532330833375454, + 0.004405852872878313, + 0.023562436923384666, + -0.006629759445786476, + 0.007101008202880621, + -0.023536615073680878, + 0.030857108533382416, + -0.00613914430141449, + -0.028817182406783104, + 0.012213733978569508, + -0.05587847903370857, + 0.0013596817152574658, + -0.0006209347629919648, + -0.022168057039380074, + 0.0028807499911636114, + 0.006303758826106787, + -0.00539999408647418, + 0.00671368045732379, + -0.0013120726216584444, + 0.002383679384365678, + 0.013149776495993137, + -0.007772376295179129, + -0.022568294778466225, + -0.04898404702544212, + -0.004215416964143515, + 0.011019473895430565, + 0.016345230862498283, + -0.004915834404528141, + -0.020463814958930016, + -0.01891450397670269, + 0.03300032392144203, + -0.015209068544209003, + -0.02121264860033989, + -0.03568579629063606, + -0.030624711886048317, + 0.033129431307315826, + 0.0057485890574753284, + -0.009941411204636097, + 0.02680307812988758, + -0.026364106684923172, + -0.00288559147156775, + -0.013995441608130932, + 0.014369858428835869, + -7.84742078394629e-05, + -0.014447323977947235, + -0.03196744993329048, + -0.017804164439439774, + 0.018385156989097595, + -0.005532330833375454, + 0.01112921629101038, + 0.015480197966098785, + 0.032742105424404144, + 0.011000107042491436, + -0.017197351902723312, + -0.010212540626525879, + -0.015441465191543102, + 0.002488580532371998, + -0.01600954681634903, + 0.012859280221164227, + 0.02429835870862007, + 0.014692631550133228, + 0.00968319270759821, + 0.00819843728095293, + 0.03116697072982788, + 0.022297166287899017, + 0.008689052425324917, + -0.01892741397023201, + -0.008863349445164204, + -0.02413051761686802, + -0.014653898775577545, + 0.005671123508363962, + -0.009625094011425972, + -0.00072664296021685, + 0.02493099495768547, + 0.009786480106413364, + 0.0253828763961792, + 0.017106974497437477, + -0.009689648635685444, + 0.004954567179083824, + 0.029798412695527077, + 0.010244818404316902, + 0.024569489061832428, + -0.005290251225233078, + 0.01206525880843401, + -0.03989475592970848, + -0.032948680222034454, + 0.0032067508436739445, + -0.024827707558870316, + -0.007230117451399565, + 0.0014653898542746902, + 0.009005369618535042, + 0.011961971409618855, + -0.0028016704600304365, + 0.011903871782124043, + 0.022374631837010384, + 0.014279481954872608, + 0.002787145785987377, + 0.008256535977125168, + -0.007920851930975914, + -0.0590287446975708, + -0.008179070428013802, + -0.04596288874745369, + -0.04172810539603233, + 0.0019027474336326122, + 0.006784690544009209, + -0.038552019745111465, + 0.026570681482553482, + 0.010012421756982803, + -0.002772620879113674, + -0.008153248578310013, + -0.0035827814135700464, + 0.00415731780230999, + -0.020334705710411072, + 0.0441037155687809, + -0.004292882513254881, + -0.00043211248703300953, + -0.009115112945437431, + 0.001920499955303967, + -0.016074100509285927, + -0.011755396611988544, + 0.03496278449892998, + 0.019418029114603996, + -0.001509771216660738, + -0.020864052698016167, + 0.022710315883159637, + 0.005758272018283606, + -0.015015404671430588, + -0.009192578494548798, + 0.004983616527169943, + 0.040230438113212585, + 0.0032842163927853107, + -0.039817288517951965, + 0.030185740441083908, + -0.02413051761686802, + 0.03341347351670265, + 0.0032083645928651094, + -0.018036561086773872, + 0.016732558608055115, + -0.02183237299323082, + 0.0003052223182749003, + 0.022723225876688957, + -0.017106974497437477, + 0.022568294778466225, + -0.00087632896611467, + 0.014176194556057453, + -0.01289155799895525, + 0.008753607049584389, + -0.022193878889083862, + -0.004238010849803686, + -0.0060584512539207935, + 0.0023304217029362917, + 0.01770087704062462, + 0.003155107144266367, + 0.011581098660826683, + 0.014628076925873756, + 0.0070170871913433075, + 0.01621612161397934, + 0.011774762533605099, + 0.027810130268335342, + -0.010141531005501747, + 0.014318214729428291, + -0.013737223111093044, + 0.0001642108109081164, + 0.0021545104682445526, + -0.0005850262241438031, + 0.0009626707760617137, + -0.0011571416398510337, + -0.0033891175407916307, + -0.015919169411063194, + 0.03881023824214935, + -0.00852766539901495, + -0.0292819757014513, + 0.01413746178150177, + 0.001689717173576355, + 0.009986599907279015, + -0.030908752232789993, + -0.017326461151242256, + 0.02330421842634678, + 0.0007924079545773566, + -0.03119279257953167, + -0.020257240161299706, + 3.0058245101827197e-05, + 0.018578819930553436, + 0.001744588604196906, + -0.012471952475607395, + -0.005761499982327223, + -0.0022077681496739388, + -0.020915696397423744, + 0.03488531708717346, + -0.007688455283641815, + 0.010548224672675133, + -0.009818757884204388, + 0.012323477305471897, + -0.0036150587256997824, + -0.04596288874745369, + 0.026983831077814102, + -0.01952131651341915, + -0.035453397780656815, + -0.011807040311396122, + 0.01847553253173828, + 0.014240749180316925, + -0.009547628462314606, + -0.0049707056023180485, + 0.0062262932769954205, + 0.006449006497859955, + -0.006158510688692331, + 0.0026919275987893343, + -0.016913311555981636, + 0.012736626900732517, + -0.008146793581545353, + -0.01372431218624115, + 0.015518930740654469, + -0.006048767827451229, + -0.005877698305994272, + -0.031915806233882904, + -0.005909975618124008, + -0.007139740977436304, + -0.031244436278939247, + -0.003595692338421941, + -0.0068105123937129974, + 0.036873601377010345, + -0.007165562827140093, + -0.014150372706353664, + -0.015183246694505215, + 0.0006019718130119145, + -0.01622903160750866, + 0.01874666102230549, + 0.012020070105791092, + -0.01619029976427555, + -0.017403926700353622, + 0.029462728649377823, + 0.022180967032909393, + 0.0210189837962389, + -0.007572256959974766, + -0.01644851826131344, + -0.01825604774057865, + -0.018385156989097595, + -0.01466680970042944, + -0.00905055832117796, + -0.0055839745327830315, + 0.027371158823370934, + 0.02597677893936634, + -0.04059194400906563, + -0.030857108533382416, + 0.023781921714544296, + -0.023420415818691254, + -0.025834759697318077, + 0.016371052712202072, + 0.004722170531749725, + -0.0015210682759061456, + 0.01724899560213089, + -0.004993299953639507, + 0.018991969525814056, + 0.004809319041669369, + -0.01748139224946499, + -0.019237276166677475, + 0.0008916606893762946, + 0.012743081897497177, + -0.030934574082493782, + 0.03842290863394737, + -0.025615273043513298, + -0.03036649338901043, + -0.005680806469172239, + 0.01932765357196331, + -0.0033923452720046043, + 0.0026725612115114927, + 0.004583378322422504, + 0.010361016727983952, + 0.019882822409272194, + -0.004883557092398405, + 0.033129431307315826, + -0.0001690524077275768, + 0.003650563769042492, + 0.009011825546622276, + -0.020063575357198715, + -0.02286524698138237, + -0.02081240899860859, + 0.03661538287997246, + -0.036073122173547745, + 0.013750134035944939, + 0.023162197321653366, + 0.012846369296312332, + -0.026958009228110313, + -0.019392207264900208, + -0.006219837814569473, + 0.006013263016939163, + -0.019043613225221634, + -0.001880153315141797, + 0.003411711659282446, + -0.014305303804576397, + -0.008359823375940323, + -0.011897416785359383, + -0.015867525711655617, + -0.006100411526858807, + -0.025499075651168823, + -0.013995441608130932, + -0.0001231581118190661, + 0.021483777090907097, + -0.0021464412566274405, + -0.0072236619889736176, + -0.016525983810424805, + 0.016061190515756607, + -0.01829477958381176, + -0.018578819930553436, + -0.02680307812988758, + -0.02726787142455578, + -0.01600954681634903, + 0.028972113505005836, + 0.016371052712202072, + -0.014382769353687763, + 0.007843386381864548, + -0.014692631550133228, + -0.007055819965898991, + 0.0005442761466838419, + -0.0042799715884029865, + 0.005874470341950655, + -0.04758966714143753, + 0.010361016727983952, + 0.009818757884204388, + -0.02969512529671192, + -0.003356840228661895, + -0.003760306630283594, + 0.007772376295179129, + 0.01788162998855114, + 0.03176087513566017, + 0.22434021532535553, + 0.022206788882613182, + -0.0009489529184065759, + 0.039171744138002396, + 0.0189532358199358, + 0.022387541830539703, + 0.02620917558670044, + 0.022168057039380074, + -0.0061326888389885426, + 0.026570681482553482, + 0.0018317373469471931, + 0.016990777105093002, + 0.0008521209820173681, + 0.00717201828956604, + 0.008237170055508614, + -0.007778831757605076, + -0.04635021835565567, + -0.00758516788482666, + -0.02014104090631008, + 0.0025369965005666018, + 0.005935797467827797, + -0.024453289806842804, + -0.021767817437648773, + -0.008986003696918488, + 0.0469699427485466, + 0.013530648313462734, + -0.004231555387377739, + 0.011878049932420254, + 0.004512368235737085, + -0.006113322451710701, + -0.002269095042720437, + 0.006681403145194054, + 0.00701063172891736, + -0.0016316180117428303, + -0.02034761570394039, + -0.0013120726216584444, + -0.012181457132101059, + -0.031657587736845016, + 0.02450493350625038, + 0.022916890680789948, + -0.025938047096133232, + 0.006946077104657888, + -0.018436800688505173, + 0.0010780622251331806, + -0.02056710235774517, + 0.01331116259098053, + -0.025912225246429443, + -0.018139848485589027, + 0.030082453042268753, + 0.006636214908212423, + -0.018862860277295113, + -0.0018220541533082724, + 0.032922856509685516, + 0.027164584025740623, + 0.0049674781039357185, + 0.004890012554824352, + 0.013375717215240002, + 0.001705855829641223, + -0.0007004176150076091, + 0.022826513275504112, + -0.016525983810424805, + 0.019172722473740578, + -0.014602255076169968, + 0.027371158823370934, + -0.010109253227710724, + -0.009250677190721035, + -0.027319515123963356, + -0.0037570788990706205, + 0.015699684619903564, + -0.006100411526858807, + -9.284770203521475e-05, + -0.006997720804065466, + 0.0019172722240909934, + 0.02329130657017231, + -0.00461565563455224, + -0.013685579411685467, + 0.005170824937522411, + -0.0017203806200996041, + 0.011639198288321495, + 0.016964955255389214, + -0.008856894448399544, + -0.013788866810500622, + -0.022206788882613182, + 0.013027122244238853, + -0.008327546529471874, + -0.012026526033878326, + 0.00020344792574178427, + 0.00208027265034616, + 0.001817212556488812, + -0.00914738979190588, + 0.002096411306411028, + 0.024801885709166527, + -0.006571660283952951, + -0.006784690544009209, + 0.014279481954872608, + 0.014150372706353664, + 0.0026709474623203278, + 0.008559943176805973, + -0.009076380170881748, + 0.01402126345783472, + -0.0292819757014513, + -0.004083079751580954, + 0.020283062011003494, + 0.012194368056952953, + -0.01624194346368313, + 0.008689052425324917, + -0.011761851608753204, + 0.003563415026292205, + 0.04289009049534798, + -0.0017591133946552873, + -0.009747747331857681, + 0.00556138064712286, + 0.018656285479664803, + -0.014382769353687763, + -0.0028823637403547764, + -0.005170824937522411, + -0.0009061854798346758, + -0.016138656064867973, + 0.003221275517717004, + -0.00014050716708879918, + -0.007094552740454674, + -0.022180967032909393, + -0.03075382113456726, + 0.01372431218624115, + -0.017403926700353622, + -0.007966040633618832, + -0.03653791546821594, + 0.013052944093942642, + 0.020115219056606293, + -0.03119279257953167, + 0.00556138064712286, + -0.0019156583584845066, + 0.02409178391098976, + -0.03305196762084961, + -0.01537691056728363, + 0.016500161960721016, + 0.015854615718126297, + -0.014008352532982826, + 0.014537700451910496, + -0.018036561086773872, + -0.01507995929569006, + -0.03488531708717346, + 0.02494390495121479, + -0.013763044960796833, + 0.005593657959252596, + -0.030289027839899063, + -0.024788973852992058, + 0.003569870488718152, + -0.015893347561359406, + -0.031115327030420303, + 0.007966040633618832, + -0.0341106615960598, + -0.009812301956117153, + -0.014524789527058601, + 0.016461428254842758, + -0.0013120726216584444, + -0.003531137714162469, + 0.004305793438106775, + 0.023988496512174606, + 0.014886295422911644, + -0.023846477270126343, + 0.0060584512539207935, + 0.027319515123963356, + 0.008185526356101036, + -0.01665509305894375, + -0.011871594935655594, + -0.16247107088565826, + 0.04035954922437668, + 0.017003687098622322, + -0.0315801203250885, + 0.0046995761804282665, + 0.011096939444541931, + -0.007197840139269829, + 0.012000704184174538, + -0.010193174704909325, + 0.016099922358989716, + 0.016500161960721016, + 0.004973933566361666, + -0.01971498131752014, + -0.029798412695527077, + -0.01080644316971302, + -0.0011305127991363406, + -0.032509706914424896, + 0.009599272161722183, + 0.03225148841738701, + 0.0255507193505764, + 0.003721573855727911, + -0.015454376116394997, + 0.022929800674319267, + 0.0010328739881515503, + 4.037815870105987e-06, + 0.005090131890028715, + -0.01528653409332037, + -0.004086307715624571, + 0.016964955255389214, + -0.014718453399837017, + -0.011671475134789944, + 0.005903520155698061, + 0.016706736758351326, + 0.01484756264835596, + 0.001228151610121131, + 0.0060294014401733875, + 0.009754203259944916, + 0.005745361093431711, + -0.0023772239219397306, + 0.02664814703166485, + -0.0033051965292543173, + 0.0022109958808869123, + 0.003171245800331235, + 0.02409178391098976, + -0.016745468601584435, + 0.02391103096306324, + 0.020502546802163124, + -0.01203943695873022, + -0.01030291710048914, + -0.018824126571416855, + 0.006219837814569473, + -0.01620320975780487, + 0.008772972971200943, + -0.004564011935144663, + 0.004709259606897831, + 0.015131602995097637, + 0.03558250889182091, + 0.00420250603929162, + 0.005432271398603916, + -0.014176194556057453, + -0.007094552740454674, + -0.007417325861752033, + 0.018772482872009277, + 0.0015840090345591307, + 0.017158618196845055, + -0.015196157619357109, + 0.0010005966760218143, + -0.0034407612401992083, + -0.022710315883159637, + 0.024840617552399635, + -0.025899313390254974, + -0.025279588997364044, + 0.003889415878802538, + -0.01059986837208271, + 0.0070493645034730434, + 0.009786480106413364, + 0.0005386276170611382, + -0.005629162769764662, + -0.017765432596206665, + -0.006481283809989691, + -0.04260604828596115, + 0.0211868267506361, + -0.015699684619903564, + 0.02015395276248455, + 0.005109498277306557, + 0.010193174704909325, + -0.015325266867876053, + 0.00905055832117796, + -0.017003687098622322, + -0.018630463629961014, + 0.032303132116794586, + -0.036279696971178055, + 0.01810111664235592, + -0.03912010043859482, + 0.025060104206204414, + 0.021741995587944984, + -0.0008488932508043945, + 0.01870792917907238, + -0.006171421613544226, + -0.0001905370008898899, + 0.017726698890328407, + -0.013763044960796833, + 0.0060907285660505295, + -0.0021157776936888695, + 0.030108274891972542, + 0.015712594613432884, + -0.012491319328546524, + 0.026067156344652176, + 0.03757078945636749, + 0.004628566559404135, + -0.027990883216261864, + 0.005409677047282457, + 0.036692846566438675, + 0.027500268071889877, + -0.02289106883108616, + 0.008275902830064297, + 0.013801777735352516, + -0.018036561086773872, + 0.01994737796485424, + 0.003921693190932274, + 0.05012020841240883, + -0.028972113505005836, + -0.011878049932420254, + 0.009670281782746315, + -0.0016542121302336454, + -0.004651160445064306, + -0.09636713564395905, + 0.013298251666128635, + 0.02558945119380951, + -0.008656774647533894, + 0.0031841567251831293, + 0.026880543678998947, + 0.010722522623836994, + 0.014731364324688911, + 0.011167949065566063, + 0.014989582821726799, + 0.00011952691420447081, + -0.015118692070245743, + -0.015351088717579842, + -0.014615166001021862, + -0.004676982294768095, + 0.007178473751991987, + -0.01321433112025261, + -0.0021851740311831236, + -0.034394703805446625, + 0.0041766841895878315, + -0.0012846369063481688, + -0.02619626559317112, + -0.016900399699807167, + -0.011309969238936901, + -0.01496376097202301, + -0.0008892398909665644, + -0.024698598310351372, + 0.011548821814358234, + 0.006468372885137796, + 0.02830074541270733, + -0.0017558856634423137, + -0.025873491540551186, + -0.007081641815602779, + -0.012032981030642986, + -0.026751434430480003, + -0.028145814314484596, + -0.0124590415507555, + 0.007075186353176832, + -0.0004353402182459831, + -0.020670389756560326, + 0.004770586267113686, + -0.014860473573207855, + 0.017829986289143562, + -0.013905065134167671, + 0.024982638657093048, + -0.020954430103302002, + -0.016125744208693504, + 0.018837038427591324, + 0.02428544871509075, + -0.003297127317637205, + -0.01994737796485424, + 0.006875067017972469, + -0.003363295691087842, + -0.0033277906477451324, + 0.030314849689602852, + -0.02930779755115509, + 0.012284744530916214, + 0.007184929214417934, + -0.014731364324688911, + -0.0052805677987635136, + -0.01622903160750866, + 0.027706842869520187, + -0.007468969561159611, + 0.018875770270824432, + -0.0013758203713223338, + 0.0021916294936090708, + -0.005780866369605064, + 0.008889171294867992, + 0.020915696397423744, + -0.022193878889083862, + -0.04263187199831009, + 0.005548469722270966, + -0.019004879519343376, + 0.0062262932769954205, + -0.032561350613832474, + 0.0063715409487485886, + -0.034807853400707245, + 0.009734836407005787, + -0.003019542433321476, + 0.0006003579474054277, + -0.014524789527058601, + -0.011251870542764664, + -0.014331125654280186, + -0.005874470341950655, + 0.0014960533007979393, + 0.043561458587646484, + 0.010348105803132057, + -0.006694314070045948, + -0.0012450972571969032, + -0.03240641951560974, + -0.01913398876786232, + 0.018152760341763496, + 0.0034536721650511026, + 0.0028178091160953045, + -0.00041839462937787175, + 0.014899206347763538, + 0.0057485890574753284, + 0.01018026378005743, + 0.03811304643750191, + -0.012452586553990841, + -0.011600465513765812, + -0.007972495630383492, + -0.06326352804899216, + 0.016977865248918533, + 0.01873375102877617, + -0.010858086869120598, + 0.02577020414173603, + 0.013775955885648727, + 0.027112940326333046, + 0.013479004614055157, + -0.009851034730672836, + -0.0170553307980299, + -0.008250080980360508, + 0.032535530626773834, + -0.0118586840108037, + -0.02180655114352703, + -0.025266679003834724, + 0.008049961179494858, + 0.024195071309804916, + 0.017972007393836975, + 0.011309969238936901, + 0.010832265019416809, + -0.021341757848858833, + 0.021135183051228523, + 0.02948855049908161, + 0.013905065134167671, + -0.023975586518645287, + -0.0034924049396067858, + -0.0065361554734408855, + -0.009063469246029854, + -0.025899313390254974, + 0.005367716774344444, + 0.02161288633942604, + -0.02096734009683132, + -0.0019414802081882954, + 0.04691829904913902, + -0.027371158823370934, + -0.008914993144571781, + 0.010380382649600506, + 0.019017791375517845, + 0.007972495630383492, + -0.020902786403894424, + -0.008166159503161907, + -0.025434520095586777, + -0.0012886716285720468, + -0.022206788882613182, + -0.015234890393912792, + 0.00441230833530426, + -0.009205489419400692, + 0.00014434009790420532, + 0.04059194400906563, + -0.008133882656693459, + 0.025666916742920876, + 0.018372245132923126, + -0.005380627699196339, + -0.004631794057786465, + 0.014214927330613136, + -0.026467394083738327, + 0.02014104090631008, + 0.004031436052173376, + 0.017145708203315735, + -0.008798794820904732, + 0.026092978194355965, + 0.0026644919998943806, + 0.021470867097377777, + 0.0034859494771808386, + 0.009224855341017246, + -0.00832109060138464, + -0.020205596461892128, + -0.01195551548153162, + 0.02597677893936634, + -0.011290603317320347, + -0.008805250748991966, + 0.00395074300467968, + 0.008953725919127464, + 0.007191384676843882, + 0.028145814314484596, + -0.020838230848312378, + 0.006842789705842733, + 0.003640880575403571, + -0.010612779296934605, + 0.03465292230248451, + 0.0011087256716564298, + 0.004305793438106775, + -0.05572354793548584, + 0.0075980788096785545, + 0.017933273687958717, + 0.006468372885137796, + -0.009760658256709576, + 0.0006330387550406158, + 0.004483318421989679, + 0.01786871999502182, + 0.02407887391746044, + -0.011084028519690037, + -0.04472343996167183, + 0.004089535214006901, + -0.008140337653458118, + -0.02079949900507927, + -0.006823423318564892, + -0.015854615718126297, + -0.001550117856822908, + 0.044413577765226364, + 0.019495494663715363, + 0.012730170972645283, + 0.017765432596206665, + -0.019637515768408775, + -0.016267765313386917, + 0.006419957149773836, + -0.013943797908723354, + -0.020437993109226227, + -0.008585765026509762, + 0.004725398030132055, + 0.004215416964143515, + -0.015196157619357109, + -0.0038506831042468548, + 0.012175001204013824, + -0.020231418311595917, + 0.012142724357545376, + -0.030056631192564964, + -0.021909838542342186, + 0.003108304925262928, + 0.02263285033404827, + -0.0094766179099679, + 0.00822425913065672, + 0.013020667247474194, + 0.005596885457634926, + 0.004270288161933422, + 0.006771779619157314, + 0.02207767963409424, + 0.0013701717834919691, + 0.03057306818664074, + 0.005603340920060873, + 0.021664530038833618, + -0.025421610102057457, + -0.0067459577694535255, + -0.017533035948872566, + 0.0064038182608783245, + -0.006187560502439737, + 0.040023863315582275, + 0.004673754330724478, + 0.0036118309944868088, + 0.050404246896505356, + 0.008488932624459267, + -0.031037861481308937, + -0.002519244095310569, + -0.008508299477398396, + 0.015944991260766983, + 0.017804164439439774, + 0.010845175944268703, + -0.02598969079554081, + -0.0043832589872181416, + 0.006277936976402998, + 0.010703155770897865, + 0.023446237668395042, + -0.005651757121086121, + -0.044207002967596054, + 0.011374523863196373, + -0.03535011038184166, + 0.007488335948437452, + -0.0061940159648656845, + -5.169412816030672e-06, + -0.0012289586011320353, + 0.0037635343614965677, + 0.01103238482028246, + 0.002398204058408737, + -0.015105781145393848, + -0.01289801299571991, + -0.015480197966098785, + -0.015944991260766983, + -0.02496972680091858, + -0.018824126571416855, + 0.013672668486833572, + -0.003145423950627446, + -0.04782206192612648, + -0.010154441930353642, + 0.008863349445164204, + -0.003411711659282446, + -0.005028804764151573, + 0.004906150978058577, + 0.005093359388411045, + 0.03612476587295532, + -0.018126938492059708, + 0.017403926700353622, + -0.03473038598895073, + -0.02283942513167858, + -0.0028016704600304365, + -0.004421991761773825, + -0.005022349301725626, + 0.002007648814469576, + -0.03757078945636749 + ], "DOT") LIMIT 3; +/* end::query-vectors-idx-whole[] */ + + +/* tag::query-vectors-idx-filtered-truncated[] */ +SELECT b.color, b.description from `rgb` AS b +WHERE brightness > 190.0 +ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +[ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + /* long list of vector values omitted */ + -0.005022349301725626, + 0.002007648814469576, + -0.03757078945636749 + ], "DOT") LIMIT 3; +/* end::query-vectors-idx-filtered-truncated[] */ + +/* tag::query-vectors-idx-filtered-whole[] */ +SELECT b.color, b.description from `rgb` AS b +WHERE brightness > 190.0 +ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +[ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + 0.000619320897385478, + 0.006700769532471895, + 0.018410978838801384, + -0.010367471724748611, + -0.019805356860160828, + 0.013059400022029877, + -0.011271236464381218, + -0.011251870542764664, + -0.004915834404528141, + -0.0031744735315442085, + 0.00843728892505169, + -0.01706824265420437, + 0.013362806290388107, + 0.04694411903619766, + 0.011258325539529324, + 0.01298193447291851, + -0.01080644316971302, + -0.01744265854358673, + 0.0044155362993478775, + -0.00742378132417798, + 0.014214927330613136, + -0.01248486340045929, + 0.0009481459856033325, + 0.027293693274259567, + -0.029204510152339935, + 0.006355402525514364, + 0.016254853457212448, + 0.02933361940085888, + -0.017352283000946045, + 0.007236572913825512, + -0.017094064503908157, + 0.002293302910402417, + -0.018139848485589027, + 0.007811109069734812, + 0.015028315596282482, + -0.008785883896052837, + -0.013453182764351368, + -8.422360406257212e-05, + 0.010896819643676281, + 0.002246500924229622, + -0.010586957447230816, + -0.0011482653208076954, + -0.003537593176588416, + 0.02017977461218834, + -0.013491915538907051, + -0.00977356918156147, + 0.01215563528239727, + 0.032122381031513214, + 0.02827492356300354, + 0.002995334332808852, + -0.027396980673074722, + 0.004583378322422504, + 0.0007577098440378904, + 0.00016683334251865745, + 0.025731472298502922, + 0.006158510688692331, + -0.008288813754916191, + 0.00016885067452676594, + 0.01956005021929741, + -0.01309813279658556, + 0.009934956207871437, + -0.007920851930975914, + 0.008721329271793365, + -0.032354775816202164, + -0.0031050771940499544, + -0.0049997554160654545, + 0.029178688302636147, + 0.0075980788096785545, + 0.024995548650622368, + 0.018165670335292816, + -0.008463110774755478, + 0.025292500853538513, + -0.0031518794130533934, + -0.01706824265420437, + -0.00925713311880827, + -0.013375717215240002, + 0.0066749476827681065, + 0.015144513919949532, + -0.0011805426329374313, + -0.037312570959329605, + 0.015092870220541954, + 0.01786871999502182, + 0.015002493746578693, + -0.020631656050682068, + 0.0021415995433926582, + -0.004912606440484524, + -0.004880329128354788, + -0.012523596175014973, + 0.024246715009212494, + 0.02413051761686802, + 0.0008162125013768673, + -0.02077367715537548, + 0.005419360473752022, + 0.008508299477398396, + 0.010470759123563766, + 0.0004575308703351766, + -0.01443441305309534, + -0.00852766539901495, + 0.017326461151242256, + -0.03674449026584625, + -0.009579905308783054, + -0.018643373623490334, + -0.0009473390528000891, + 0.00832109060138464, + -0.0016057961620390415, + 0.023614080622792244, + -0.024272536858916283, + -0.042502760887145996, + 0.03207073733210564, + 0.009534717537462711, + -0.041082561016082764, + -0.010651512071490288, + -0.01997319981455803, + 0.016306497156620026, + 0.015648040920495987, + -0.00894081499427557, + -0.03473038598895073, + -0.00884398352354765, + 0.018010739237070084, + 0.019004879519343376, + -0.015970813110470772, + 0.01914690062403679, + 0.0008166159386746585, + -0.006232748739421368, + -0.033568404614925385, + -0.03416230529546738, + -0.02494390495121479, + 0.02163870818912983, + 0.01701659895479679, + -0.004396169912070036, + 0.003786128479987383, + -0.008372734300792217, + 0.014563522301614285, + -0.01029646210372448, + 0.005622707307338715, + 0.010270640254020691, + 0.0004607586015481502, + 0.032096557319164276, + 0.021096449345350266, + -0.00034355162642896175, + -0.007966040633618832, + -0.004928745329380035, + 0.02806834876537323, + 0.010528858751058578, + 0.013349895365536213, + -0.006629759445786476, + -0.01913398876786232, + 0.02205185778439045, + -0.015480197966098785, + 0.02580893784761429, + 0.013362806290388107, + 0.010244818404316902, + 0.024246715009212494, + -0.0043122489005327225, + 0.0009594430448487401, + -0.02948855049908161, + 0.005044943653047085, + -0.004499457310885191, + -0.010373927652835846, + 0.0007040488417260349, + 0.012032981030642986, + 0.02039925940334797, + 0.02788759581744671, + 0.01807529479265213, + 0.008695507422089577, + 0.0015170335536822677, + 0.02059292420744896, + -0.012291199527680874, + 0.02706129662692547, + -0.009663826785981655, + 0.01101301796734333, + -0.013336984440684319, + 0.025705650448799133, + 0.006765324156731367, + 0.007197840139269829, + 0.024156339466571808, + -0.012975478544831276, + -0.03098621778190136, + -0.004870646167546511, + -0.000659667537547648, + -0.01186513900756836, + -0.007849842309951782, + -0.005797004792839289, + 0.022310076281428337, + -0.02099316194653511, + 0.0013346667401492596, + -0.011600465513765812, + -0.002236817730590701, + 0.020825320854783058, + 0.0010651513002812862, + -0.022826513275504112, + -0.6420344114303589, + 8.150020585162565e-05, + -0.014214927330613136, + -0.015841703861951828, + 0.02079949900507927, + 0.020205596461892128, + 0.037544965744018555, + 0.012265377677977085, + 0.0005870435852557421, + -0.01665509305894375, + 0.005919658578932285, + 0.013349895365536213, + 0.016577627509832382, + -0.01664218120276928, + 0.0006382837891578674, + -0.013969619758427143, + -0.017326461151242256, + -0.00033669269760139287, + -0.013027122244238853, + 0.00042283275979571044, + -0.00431870436295867, + 0.02161288633942604, + -0.007572256959974766, + 0.007262394763529301, + 0.019469672814011574, + 0.01372431218624115, + 0.001147458446212113, + -0.013479004614055157, + 0.014279481954872608, + 0.043587278574705124, + -0.027138762176036835, + 0.015118692070245743, + 8.61400694702752e-05, + 0.00968319270759821, + 0.04738309234380722, + 0.01579006016254425, + -0.026544859632849693, + 0.03506607189774513, + -0.022348809987306595, + 0.05510382354259491, + -0.01931474171578884, + 0.011671475134789944, + 0.02081240899860859, + -0.03098621778190136, + 0.0003318511007819325, + 0.021574154496192932, + 0.024272536858916283, + -0.015854615718126297, + 0.028378210961818695, + -0.015467287041246891, + 0.019689159467816353, + 0.005471004173159599, + 0.014718453399837017, + 0.0048641907051205635, + 0.00894081499427557, + 0.010845175944268703, + 0.030056631192564964, + -0.016538893803954124, + 0.012317021377384663, + 0.009366875514388084, + -0.003025997895747423, + 0.0029791956767439842, + -0.01434403657913208, + -0.019185632467269897, + -0.014976671896874905, + 0.03465292230248451, + -0.013788866810500622, + -0.013091676868498325, + -0.0024353230837732553, + -0.028791360557079315, + -0.005522647872567177, + -0.008630952797830105, + -0.02286524698138237, + 0.009418519213795662, + 0.00011145758617203683, + -0.0103932935744524, + 0.012342843227088451, + 0.017584679648280144, + -0.008288813754916191, + 0.009754203259944916, + 0.0016525982646271586, + -0.00712683005258441, + -0.005467776209115982, + 0.0034956326708197594, + 0.0353759340941906, + 0.013324073515832424, + -0.03535011038184166, + -0.04258022829890251, + 0.01322078611701727, + 0.011193770915269852, + 0.023756099864840508, + 0.030934574082493782, + 0.0018236680189147592, + -0.0009667054400779307, + -0.012588150799274445, + 0.003983020316809416, + -0.02369154617190361, + -0.015234890393912792, + -0.026299552991986275, + -0.007107463665306568, + 0.00779174268245697, + -0.015389821492135525, + -0.012310566380620003, + 0.008262991905212402, + 0.02664814703166485, + -0.0017284499481320381, + -0.0297467689961195, + 0.022607028484344482, + 0.023575346916913986, + -0.017326461151242256, + 0.020115219056606293, + -0.026751434430480003, + 0.0026580365374684334, + 0.003090552520006895, + 0.03596983477473259, + -0.02451784536242485, + 0.02471150830388069, + -0.003347157035022974, + -0.007533524185419083, + -0.02556362934410572, + 0.02933361940085888, + -0.013298251666128635, + -0.014279481954872608, + 0.007507702335715294, + 0.017571767792105675, + 0.00280489819124341, + -0.008424378000199795, + -0.0010514333844184875, + -0.0030469780322164297, + -0.0012862507719546556, + 0.021161004900932312, + -0.0022755505051463842, + -0.0011644039768725634, + 0.0031744735315442085, + -0.00047205566079355776, + -0.014576433226466179, + 0.004460724536329508, + -0.010031787678599358, + 0.008256535977125168, + -0.04513658955693245, + -0.019288919866085052, + -0.013233697041869164, + 0.00965091586112976, + 0.0026709474623203278, + -0.021884016692638397, + -0.03516935929656029, + -0.03281956911087036, + 0.008663230575621128, + -0.038784414529800415, + -0.010322283953428268, + -0.016474340111017227, + -0.013788866810500622, + -0.022568294778466225, + 0.03183833882212639, + 0.025834759697318077, + -0.0028807499911636114, + -0.02100607380270958, + -0.02249082922935486, + -0.01434403657913208, + -0.007365682162344456, + 0.01994737796485424, + 0.02972094714641571, + -0.008837527595460415, + -0.009457251988351345, + -0.013595202937722206, + -0.04121166840195656, + -0.009605727158486843, + 0.013111043721437454, + -0.010877453722059727, + -0.023368772119283676, + 0.012420308776199818, + -0.012820547446608543, + -0.006842789705842733, + 0.012523596175014973, + -0.005935797467827797, + 0.013646846637129784, + -0.006868611555546522, + -0.021264292299747467, + -0.002252956386655569, + -0.007681999821215868, + 0.00020627219055313617, + 0.009089291095733643, + -0.005713083781301975, + -0.005212785676121712, + 0.03496278449892998, + 0.001072413637302816, + 0.022090591490268707, + 0.07266268134117126, + -0.02431127056479454, + 0.032974500209093094, + -0.0030485920142382383, + 0.009289409965276718, + -0.01660344935953617, + 0.001254780450835824, + -0.01340153906494379, + 0.01103238482028246, + 0.010199629701673985, + -0.0026919275987893343, + -0.012142724357545376, + -0.005038488190621138, + 0.031709231436252594, + 0.023562436923384666, + 0.011781218461692333, + -0.003963653929531574, + 0.016164477914571762, + -0.02034761570394039, + 0.016745468601584435, + 0.0006649125716648996, + 0.008069328032433987, + 0.022168057039380074, + -0.0036215141881257296, + -0.03199326992034912, + -0.008366279304027557, + -0.014576433226466179, + 0.006668492220342159, + 0.0007762692985124886, + 0.00029594259103760123, + 0.010864542797207832, + -0.0174555703997612, + 0.013349895365536213, + 0.017984917387366295, + 0.010993652045726776, + 0.01976662501692772, + -0.013956708833575249, + -0.00499007198959589, + 0.007546435110270977, + 0.014498967677354813, + -0.0032164340373128653, + -0.01974080316722393, + -0.03395573049783707, + -0.013853421434760094, + -0.0065393829718232155, + -0.005961619317531586, + 0.0028016704600304365, + -0.005122409202158451, + 0.005061082076281309, + 0.01603536866605282, + -0.024595310911536217, + 0.03449799120426178, + 0.008217803202569485, + 0.01891450397670269, + 0.031683407723903656, + 0.005170824937522411, + 0.006481283809989691, + 0.04433611407876015, + -0.02637701854109764, + 0.0172231737524271, + 0.005474231671541929, + 0.0028710667975246906, + 0.0050417156890034676, + -0.026351196691393852, + -0.007681999821215868, + -0.04808028042316437, + 0.009780025109648705, + 0.011619831435382366, + -0.013982530683279037, + 0.014576433226466179, + -0.0004478476766962558, + 0.020864052698016167, + 0.017545945942401886, + 0.02428544871509075, + -0.019043613225221634, + 0.009986599907279015, + -0.01952131651341915, + 0.00379258394241333, + 0.008004773408174515, + 0.004909378942102194, + 0.003116374369710684, + -0.018785394728183746, + -0.008095149882137775, + 0.008701963350176811, + -0.0237173680216074, + 0.009082835167646408, + -0.02453075535595417, + -0.0049674781039357185, + 0.0127753596752882, + -0.003941059578210115, + -0.018165670335292816, + -0.00499007198959589, + 0.00441230833530426, + -0.010193174704909325, + -0.032328955829143524, + 0.004309020936489105, + 0.0170553307980299, + -0.005080448463559151, + -0.018630463629961014, + -0.00671368045732379, + 0.030237384140491486, + -0.026958009228110313, + 0.0016606675926595926, + 0.024375824257731438, + 0.033800799399614334, + 0.022619938477873802, + -0.0027839180547744036, + -0.0024272536393254995, + -0.02493099495768547, + 0.017829986289143562, + 0.004564011935144663, + 0.010690244846045971, + -0.00247244187630713, + 0.006426412612199783, + -0.006271481513977051, + -0.024220893159508705, + 0.008295268751680851, + 0.02227134443819523, + 0.017300639301538467, + 0.002096411306411028, + -0.00018418239778839052, + 0.00420250603929162, + -0.019430940970778465, + -0.010774166323244572, + -0.011903871782124043, + 0.0039023268036544323, + -0.00925713311880827, + 0.009276499040424824, + 0.015118692070245743, + -0.016383962705731392, + -0.018359335139393806, + 0.042270366102457047, + -0.013582292012870312, + 0.0026806306559592485, + -0.011206681840121746, + -0.014821740798652172, + 0.007075186353176832, + 0.05422588065266609, + -0.006026173941791058, + -0.010412660427391529, + 0.0015331722097471356, + 0.019676247611641884, + 0.012058802880346775, + -0.021303024142980576, + -0.02076076529920101, + 0.00893435999751091, + 0.004357437137514353, + -0.0068105123937129974, + 0.003177701262757182, + -0.014770097099244595, + 0.008469566702842712, + 0.0034052561968564987, + 0.001760727260261774, + -0.0002231169055448845, + -0.02892046980559826, + -0.006868611555546522, + -0.028326567262411118, + -0.014369858428835869, + 0.014395680278539658, + -0.005064310040324926, + 0.015467287041246891, + -0.010787077248096466, + 0.010832265019416809, + 0.038242157548666, + 0.018785394728183746, + 0.006449006497859955, + -0.020463814958930016, + 0.014679720625281334, + 0.0031486516818404198, + -0.007694910746067762, + 0.001307231024838984, + -0.030237384140491486, + -0.003976564854383469, + -0.020902786403894424, + -0.005809915717691183, + -0.01404708530753851, + -0.003650563769042492, + -0.003025997895747423, + 0.015660950914025307, + -0.014176194556057453, + -0.0116262873634696, + 0.01331116259098053, + -0.010535313747823238, + -0.014085818082094193, + 0.003834544448181987, + -0.013956708833575249, + 0.01422783825546503, + 0.007656177971512079, + -0.0012346070725470781, + -0.0008440516539849341, + -0.006145599763840437, + 0.0010465917875990272, + 0.0094766179099679, + -0.023188019171357155, + -0.0028339477721601725, + 0.01321433112025261, + -0.019689159467816353, + -0.0012321863323450089, + -0.022335898131132126, + 0.0003241852391511202, + 0.008256535977125168, + -0.011613376438617706, + -0.04136659950017929, + 0.005361261311918497, + -0.038242157548666, + -0.01059341337531805, + -0.014576433226466179, + -0.005667895544320345, + -0.027319515123963356, + -0.012704349122941494, + 0.01828186959028244, + 0.02349788136780262, + 0.02330421842634678, + 0.007236572913825512, + 0.00861804187297821, + 0.01975371316075325, + 0.01621612161397934, + -0.0014678107108920813, + -0.009424974210560322, + -0.006681403145194054, + -0.018772482872009277, + -0.0005394345498643816, + -0.0009868787601590157, + 0.0320449136197567, + -0.015635129064321518, + -0.01580297201871872, + 0.010122164152562618, + 0.016177387908101082, + -0.013259518891572952, + 0.03413648530840874, + -0.021057717502117157, + -0.00473508145660162, + 0.018152760341763496, + 0.011000107042491436, + 0.015919169411063194, + -0.004273516125977039, + -0.027758486568927765, + 0.008914993144571781, + -0.026983831077814102, + -0.0003104673814959824, + -0.02206476964056492, + 0.012168546207249165, + -0.00358600914478302, + -0.009308775886893272, + 0.0029097995720803738, + -0.018979057669639587, + -0.007385048549622297, + 0.010464304126799107, + -0.005532330833375454, + 0.004405852872878313, + 0.023562436923384666, + -0.006629759445786476, + 0.007101008202880621, + -0.023536615073680878, + 0.030857108533382416, + -0.00613914430141449, + -0.028817182406783104, + 0.012213733978569508, + -0.05587847903370857, + 0.0013596817152574658, + -0.0006209347629919648, + -0.022168057039380074, + 0.0028807499911636114, + 0.006303758826106787, + -0.00539999408647418, + 0.00671368045732379, + -0.0013120726216584444, + 0.002383679384365678, + 0.013149776495993137, + -0.007772376295179129, + -0.022568294778466225, + -0.04898404702544212, + -0.004215416964143515, + 0.011019473895430565, + 0.016345230862498283, + -0.004915834404528141, + -0.020463814958930016, + -0.01891450397670269, + 0.03300032392144203, + -0.015209068544209003, + -0.02121264860033989, + -0.03568579629063606, + -0.030624711886048317, + 0.033129431307315826, + 0.0057485890574753284, + -0.009941411204636097, + 0.02680307812988758, + -0.026364106684923172, + -0.00288559147156775, + -0.013995441608130932, + 0.014369858428835869, + -7.84742078394629e-05, + -0.014447323977947235, + -0.03196744993329048, + -0.017804164439439774, + 0.018385156989097595, + -0.005532330833375454, + 0.01112921629101038, + 0.015480197966098785, + 0.032742105424404144, + 0.011000107042491436, + -0.017197351902723312, + -0.010212540626525879, + -0.015441465191543102, + 0.002488580532371998, + -0.01600954681634903, + 0.012859280221164227, + 0.02429835870862007, + 0.014692631550133228, + 0.00968319270759821, + 0.00819843728095293, + 0.03116697072982788, + 0.022297166287899017, + 0.008689052425324917, + -0.01892741397023201, + -0.008863349445164204, + -0.02413051761686802, + -0.014653898775577545, + 0.005671123508363962, + -0.009625094011425972, + -0.00072664296021685, + 0.02493099495768547, + 0.009786480106413364, + 0.0253828763961792, + 0.017106974497437477, + -0.009689648635685444, + 0.004954567179083824, + 0.029798412695527077, + 0.010244818404316902, + 0.024569489061832428, + -0.005290251225233078, + 0.01206525880843401, + -0.03989475592970848, + -0.032948680222034454, + 0.0032067508436739445, + -0.024827707558870316, + -0.007230117451399565, + 0.0014653898542746902, + 0.009005369618535042, + 0.011961971409618855, + -0.0028016704600304365, + 0.011903871782124043, + 0.022374631837010384, + 0.014279481954872608, + 0.002787145785987377, + 0.008256535977125168, + -0.007920851930975914, + -0.0590287446975708, + -0.008179070428013802, + -0.04596288874745369, + -0.04172810539603233, + 0.0019027474336326122, + 0.006784690544009209, + -0.038552019745111465, + 0.026570681482553482, + 0.010012421756982803, + -0.002772620879113674, + -0.008153248578310013, + -0.0035827814135700464, + 0.00415731780230999, + -0.020334705710411072, + 0.0441037155687809, + -0.004292882513254881, + -0.00043211248703300953, + -0.009115112945437431, + 0.001920499955303967, + -0.016074100509285927, + -0.011755396611988544, + 0.03496278449892998, + 0.019418029114603996, + -0.001509771216660738, + -0.020864052698016167, + 0.022710315883159637, + 0.005758272018283606, + -0.015015404671430588, + -0.009192578494548798, + 0.004983616527169943, + 0.040230438113212585, + 0.0032842163927853107, + -0.039817288517951965, + 0.030185740441083908, + -0.02413051761686802, + 0.03341347351670265, + 0.0032083645928651094, + -0.018036561086773872, + 0.016732558608055115, + -0.02183237299323082, + 0.0003052223182749003, + 0.022723225876688957, + -0.017106974497437477, + 0.022568294778466225, + -0.00087632896611467, + 0.014176194556057453, + -0.01289155799895525, + 0.008753607049584389, + -0.022193878889083862, + -0.004238010849803686, + -0.0060584512539207935, + 0.0023304217029362917, + 0.01770087704062462, + 0.003155107144266367, + 0.011581098660826683, + 0.014628076925873756, + 0.0070170871913433075, + 0.01621612161397934, + 0.011774762533605099, + 0.027810130268335342, + -0.010141531005501747, + 0.014318214729428291, + -0.013737223111093044, + 0.0001642108109081164, + 0.0021545104682445526, + -0.0005850262241438031, + 0.0009626707760617137, + -0.0011571416398510337, + -0.0033891175407916307, + -0.015919169411063194, + 0.03881023824214935, + -0.00852766539901495, + -0.0292819757014513, + 0.01413746178150177, + 0.001689717173576355, + 0.009986599907279015, + -0.030908752232789993, + -0.017326461151242256, + 0.02330421842634678, + 0.0007924079545773566, + -0.03119279257953167, + -0.020257240161299706, + 3.0058245101827197e-05, + 0.018578819930553436, + 0.001744588604196906, + -0.012471952475607395, + -0.005761499982327223, + -0.0022077681496739388, + -0.020915696397423744, + 0.03488531708717346, + -0.007688455283641815, + 0.010548224672675133, + -0.009818757884204388, + 0.012323477305471897, + -0.0036150587256997824, + -0.04596288874745369, + 0.026983831077814102, + -0.01952131651341915, + -0.035453397780656815, + -0.011807040311396122, + 0.01847553253173828, + 0.014240749180316925, + -0.009547628462314606, + -0.0049707056023180485, + 0.0062262932769954205, + 0.006449006497859955, + -0.006158510688692331, + 0.0026919275987893343, + -0.016913311555981636, + 0.012736626900732517, + -0.008146793581545353, + -0.01372431218624115, + 0.015518930740654469, + -0.006048767827451229, + -0.005877698305994272, + -0.031915806233882904, + -0.005909975618124008, + -0.007139740977436304, + -0.031244436278939247, + -0.003595692338421941, + -0.0068105123937129974, + 0.036873601377010345, + -0.007165562827140093, + -0.014150372706353664, + -0.015183246694505215, + 0.0006019718130119145, + -0.01622903160750866, + 0.01874666102230549, + 0.012020070105791092, + -0.01619029976427555, + -0.017403926700353622, + 0.029462728649377823, + 0.022180967032909393, + 0.0210189837962389, + -0.007572256959974766, + -0.01644851826131344, + -0.01825604774057865, + -0.018385156989097595, + -0.01466680970042944, + -0.00905055832117796, + -0.0055839745327830315, + 0.027371158823370934, + 0.02597677893936634, + -0.04059194400906563, + -0.030857108533382416, + 0.023781921714544296, + -0.023420415818691254, + -0.025834759697318077, + 0.016371052712202072, + 0.004722170531749725, + -0.0015210682759061456, + 0.01724899560213089, + -0.004993299953639507, + 0.018991969525814056, + 0.004809319041669369, + -0.01748139224946499, + -0.019237276166677475, + 0.0008916606893762946, + 0.012743081897497177, + -0.030934574082493782, + 0.03842290863394737, + -0.025615273043513298, + -0.03036649338901043, + -0.005680806469172239, + 0.01932765357196331, + -0.0033923452720046043, + 0.0026725612115114927, + 0.004583378322422504, + 0.010361016727983952, + 0.019882822409272194, + -0.004883557092398405, + 0.033129431307315826, + -0.0001690524077275768, + 0.003650563769042492, + 0.009011825546622276, + -0.020063575357198715, + -0.02286524698138237, + -0.02081240899860859, + 0.03661538287997246, + -0.036073122173547745, + 0.013750134035944939, + 0.023162197321653366, + 0.012846369296312332, + -0.026958009228110313, + -0.019392207264900208, + -0.006219837814569473, + 0.006013263016939163, + -0.019043613225221634, + -0.001880153315141797, + 0.003411711659282446, + -0.014305303804576397, + -0.008359823375940323, + -0.011897416785359383, + -0.015867525711655617, + -0.006100411526858807, + -0.025499075651168823, + -0.013995441608130932, + -0.0001231581118190661, + 0.021483777090907097, + -0.0021464412566274405, + -0.0072236619889736176, + -0.016525983810424805, + 0.016061190515756607, + -0.01829477958381176, + -0.018578819930553436, + -0.02680307812988758, + -0.02726787142455578, + -0.01600954681634903, + 0.028972113505005836, + 0.016371052712202072, + -0.014382769353687763, + 0.007843386381864548, + -0.014692631550133228, + -0.007055819965898991, + 0.0005442761466838419, + -0.0042799715884029865, + 0.005874470341950655, + -0.04758966714143753, + 0.010361016727983952, + 0.009818757884204388, + -0.02969512529671192, + -0.003356840228661895, + -0.003760306630283594, + 0.007772376295179129, + 0.01788162998855114, + 0.03176087513566017, + 0.22434021532535553, + 0.022206788882613182, + -0.0009489529184065759, + 0.039171744138002396, + 0.0189532358199358, + 0.022387541830539703, + 0.02620917558670044, + 0.022168057039380074, + -0.0061326888389885426, + 0.026570681482553482, + 0.0018317373469471931, + 0.016990777105093002, + 0.0008521209820173681, + 0.00717201828956604, + 0.008237170055508614, + -0.007778831757605076, + -0.04635021835565567, + -0.00758516788482666, + -0.02014104090631008, + 0.0025369965005666018, + 0.005935797467827797, + -0.024453289806842804, + -0.021767817437648773, + -0.008986003696918488, + 0.0469699427485466, + 0.013530648313462734, + -0.004231555387377739, + 0.011878049932420254, + 0.004512368235737085, + -0.006113322451710701, + -0.002269095042720437, + 0.006681403145194054, + 0.00701063172891736, + -0.0016316180117428303, + -0.02034761570394039, + -0.0013120726216584444, + -0.012181457132101059, + -0.031657587736845016, + 0.02450493350625038, + 0.022916890680789948, + -0.025938047096133232, + 0.006946077104657888, + -0.018436800688505173, + 0.0010780622251331806, + -0.02056710235774517, + 0.01331116259098053, + -0.025912225246429443, + -0.018139848485589027, + 0.030082453042268753, + 0.006636214908212423, + -0.018862860277295113, + -0.0018220541533082724, + 0.032922856509685516, + 0.027164584025740623, + 0.0049674781039357185, + 0.004890012554824352, + 0.013375717215240002, + 0.001705855829641223, + -0.0007004176150076091, + 0.022826513275504112, + -0.016525983810424805, + 0.019172722473740578, + -0.014602255076169968, + 0.027371158823370934, + -0.010109253227710724, + -0.009250677190721035, + -0.027319515123963356, + -0.0037570788990706205, + 0.015699684619903564, + -0.006100411526858807, + -9.284770203521475e-05, + -0.006997720804065466, + 0.0019172722240909934, + 0.02329130657017231, + -0.00461565563455224, + -0.013685579411685467, + 0.005170824937522411, + -0.0017203806200996041, + 0.011639198288321495, + 0.016964955255389214, + -0.008856894448399544, + -0.013788866810500622, + -0.022206788882613182, + 0.013027122244238853, + -0.008327546529471874, + -0.012026526033878326, + 0.00020344792574178427, + 0.00208027265034616, + 0.001817212556488812, + -0.00914738979190588, + 0.002096411306411028, + 0.024801885709166527, + -0.006571660283952951, + -0.006784690544009209, + 0.014279481954872608, + 0.014150372706353664, + 0.0026709474623203278, + 0.008559943176805973, + -0.009076380170881748, + 0.01402126345783472, + -0.0292819757014513, + -0.004083079751580954, + 0.020283062011003494, + 0.012194368056952953, + -0.01624194346368313, + 0.008689052425324917, + -0.011761851608753204, + 0.003563415026292205, + 0.04289009049534798, + -0.0017591133946552873, + -0.009747747331857681, + 0.00556138064712286, + 0.018656285479664803, + -0.014382769353687763, + -0.0028823637403547764, + -0.005170824937522411, + -0.0009061854798346758, + -0.016138656064867973, + 0.003221275517717004, + -0.00014050716708879918, + -0.007094552740454674, + -0.022180967032909393, + -0.03075382113456726, + 0.01372431218624115, + -0.017403926700353622, + -0.007966040633618832, + -0.03653791546821594, + 0.013052944093942642, + 0.020115219056606293, + -0.03119279257953167, + 0.00556138064712286, + -0.0019156583584845066, + 0.02409178391098976, + -0.03305196762084961, + -0.01537691056728363, + 0.016500161960721016, + 0.015854615718126297, + -0.014008352532982826, + 0.014537700451910496, + -0.018036561086773872, + -0.01507995929569006, + -0.03488531708717346, + 0.02494390495121479, + -0.013763044960796833, + 0.005593657959252596, + -0.030289027839899063, + -0.024788973852992058, + 0.003569870488718152, + -0.015893347561359406, + -0.031115327030420303, + 0.007966040633618832, + -0.0341106615960598, + -0.009812301956117153, + -0.014524789527058601, + 0.016461428254842758, + -0.0013120726216584444, + -0.003531137714162469, + 0.004305793438106775, + 0.023988496512174606, + 0.014886295422911644, + -0.023846477270126343, + 0.0060584512539207935, + 0.027319515123963356, + 0.008185526356101036, + -0.01665509305894375, + -0.011871594935655594, + -0.16247107088565826, + 0.04035954922437668, + 0.017003687098622322, + -0.0315801203250885, + 0.0046995761804282665, + 0.011096939444541931, + -0.007197840139269829, + 0.012000704184174538, + -0.010193174704909325, + 0.016099922358989716, + 0.016500161960721016, + 0.004973933566361666, + -0.01971498131752014, + -0.029798412695527077, + -0.01080644316971302, + -0.0011305127991363406, + -0.032509706914424896, + 0.009599272161722183, + 0.03225148841738701, + 0.0255507193505764, + 0.003721573855727911, + -0.015454376116394997, + 0.022929800674319267, + 0.0010328739881515503, + 4.037815870105987e-06, + 0.005090131890028715, + -0.01528653409332037, + -0.004086307715624571, + 0.016964955255389214, + -0.014718453399837017, + -0.011671475134789944, + 0.005903520155698061, + 0.016706736758351326, + 0.01484756264835596, + 0.001228151610121131, + 0.0060294014401733875, + 0.009754203259944916, + 0.005745361093431711, + -0.0023772239219397306, + 0.02664814703166485, + -0.0033051965292543173, + 0.0022109958808869123, + 0.003171245800331235, + 0.02409178391098976, + -0.016745468601584435, + 0.02391103096306324, + 0.020502546802163124, + -0.01203943695873022, + -0.01030291710048914, + -0.018824126571416855, + 0.006219837814569473, + -0.01620320975780487, + 0.008772972971200943, + -0.004564011935144663, + 0.004709259606897831, + 0.015131602995097637, + 0.03558250889182091, + 0.00420250603929162, + 0.005432271398603916, + -0.014176194556057453, + -0.007094552740454674, + -0.007417325861752033, + 0.018772482872009277, + 0.0015840090345591307, + 0.017158618196845055, + -0.015196157619357109, + 0.0010005966760218143, + -0.0034407612401992083, + -0.022710315883159637, + 0.024840617552399635, + -0.025899313390254974, + -0.025279588997364044, + 0.003889415878802538, + -0.01059986837208271, + 0.0070493645034730434, + 0.009786480106413364, + 0.0005386276170611382, + -0.005629162769764662, + -0.017765432596206665, + -0.006481283809989691, + -0.04260604828596115, + 0.0211868267506361, + -0.015699684619903564, + 0.02015395276248455, + 0.005109498277306557, + 0.010193174704909325, + -0.015325266867876053, + 0.00905055832117796, + -0.017003687098622322, + -0.018630463629961014, + 0.032303132116794586, + -0.036279696971178055, + 0.01810111664235592, + -0.03912010043859482, + 0.025060104206204414, + 0.021741995587944984, + -0.0008488932508043945, + 0.01870792917907238, + -0.006171421613544226, + -0.0001905370008898899, + 0.017726698890328407, + -0.013763044960796833, + 0.0060907285660505295, + -0.0021157776936888695, + 0.030108274891972542, + 0.015712594613432884, + -0.012491319328546524, + 0.026067156344652176, + 0.03757078945636749, + 0.004628566559404135, + -0.027990883216261864, + 0.005409677047282457, + 0.036692846566438675, + 0.027500268071889877, + -0.02289106883108616, + 0.008275902830064297, + 0.013801777735352516, + -0.018036561086773872, + 0.01994737796485424, + 0.003921693190932274, + 0.05012020841240883, + -0.028972113505005836, + -0.011878049932420254, + 0.009670281782746315, + -0.0016542121302336454, + -0.004651160445064306, + -0.09636713564395905, + 0.013298251666128635, + 0.02558945119380951, + -0.008656774647533894, + 0.0031841567251831293, + 0.026880543678998947, + 0.010722522623836994, + 0.014731364324688911, + 0.011167949065566063, + 0.014989582821726799, + 0.00011952691420447081, + -0.015118692070245743, + -0.015351088717579842, + -0.014615166001021862, + -0.004676982294768095, + 0.007178473751991987, + -0.01321433112025261, + -0.0021851740311831236, + -0.034394703805446625, + 0.0041766841895878315, + -0.0012846369063481688, + -0.02619626559317112, + -0.016900399699807167, + -0.011309969238936901, + -0.01496376097202301, + -0.0008892398909665644, + -0.024698598310351372, + 0.011548821814358234, + 0.006468372885137796, + 0.02830074541270733, + -0.0017558856634423137, + -0.025873491540551186, + -0.007081641815602779, + -0.012032981030642986, + -0.026751434430480003, + -0.028145814314484596, + -0.0124590415507555, + 0.007075186353176832, + -0.0004353402182459831, + -0.020670389756560326, + 0.004770586267113686, + -0.014860473573207855, + 0.017829986289143562, + -0.013905065134167671, + 0.024982638657093048, + -0.020954430103302002, + -0.016125744208693504, + 0.018837038427591324, + 0.02428544871509075, + -0.003297127317637205, + -0.01994737796485424, + 0.006875067017972469, + -0.003363295691087842, + -0.0033277906477451324, + 0.030314849689602852, + -0.02930779755115509, + 0.012284744530916214, + 0.007184929214417934, + -0.014731364324688911, + -0.0052805677987635136, + -0.01622903160750866, + 0.027706842869520187, + -0.007468969561159611, + 0.018875770270824432, + -0.0013758203713223338, + 0.0021916294936090708, + -0.005780866369605064, + 0.008889171294867992, + 0.020915696397423744, + -0.022193878889083862, + -0.04263187199831009, + 0.005548469722270966, + -0.019004879519343376, + 0.0062262932769954205, + -0.032561350613832474, + 0.0063715409487485886, + -0.034807853400707245, + 0.009734836407005787, + -0.003019542433321476, + 0.0006003579474054277, + -0.014524789527058601, + -0.011251870542764664, + -0.014331125654280186, + -0.005874470341950655, + 0.0014960533007979393, + 0.043561458587646484, + 0.010348105803132057, + -0.006694314070045948, + -0.0012450972571969032, + -0.03240641951560974, + -0.01913398876786232, + 0.018152760341763496, + 0.0034536721650511026, + 0.0028178091160953045, + -0.00041839462937787175, + 0.014899206347763538, + 0.0057485890574753284, + 0.01018026378005743, + 0.03811304643750191, + -0.012452586553990841, + -0.011600465513765812, + -0.007972495630383492, + -0.06326352804899216, + 0.016977865248918533, + 0.01873375102877617, + -0.010858086869120598, + 0.02577020414173603, + 0.013775955885648727, + 0.027112940326333046, + 0.013479004614055157, + -0.009851034730672836, + -0.0170553307980299, + -0.008250080980360508, + 0.032535530626773834, + -0.0118586840108037, + -0.02180655114352703, + -0.025266679003834724, + 0.008049961179494858, + 0.024195071309804916, + 0.017972007393836975, + 0.011309969238936901, + 0.010832265019416809, + -0.021341757848858833, + 0.021135183051228523, + 0.02948855049908161, + 0.013905065134167671, + -0.023975586518645287, + -0.0034924049396067858, + -0.0065361554734408855, + -0.009063469246029854, + -0.025899313390254974, + 0.005367716774344444, + 0.02161288633942604, + -0.02096734009683132, + -0.0019414802081882954, + 0.04691829904913902, + -0.027371158823370934, + -0.008914993144571781, + 0.010380382649600506, + 0.019017791375517845, + 0.007972495630383492, + -0.020902786403894424, + -0.008166159503161907, + -0.025434520095586777, + -0.0012886716285720468, + -0.022206788882613182, + -0.015234890393912792, + 0.00441230833530426, + -0.009205489419400692, + 0.00014434009790420532, + 0.04059194400906563, + -0.008133882656693459, + 0.025666916742920876, + 0.018372245132923126, + -0.005380627699196339, + -0.004631794057786465, + 0.014214927330613136, + -0.026467394083738327, + 0.02014104090631008, + 0.004031436052173376, + 0.017145708203315735, + -0.008798794820904732, + 0.026092978194355965, + 0.0026644919998943806, + 0.021470867097377777, + 0.0034859494771808386, + 0.009224855341017246, + -0.00832109060138464, + -0.020205596461892128, + -0.01195551548153162, + 0.02597677893936634, + -0.011290603317320347, + -0.008805250748991966, + 0.00395074300467968, + 0.008953725919127464, + 0.007191384676843882, + 0.028145814314484596, + -0.020838230848312378, + 0.006842789705842733, + 0.003640880575403571, + -0.010612779296934605, + 0.03465292230248451, + 0.0011087256716564298, + 0.004305793438106775, + -0.05572354793548584, + 0.0075980788096785545, + 0.017933273687958717, + 0.006468372885137796, + -0.009760658256709576, + 0.0006330387550406158, + 0.004483318421989679, + 0.01786871999502182, + 0.02407887391746044, + -0.011084028519690037, + -0.04472343996167183, + 0.004089535214006901, + -0.008140337653458118, + -0.02079949900507927, + -0.006823423318564892, + -0.015854615718126297, + -0.001550117856822908, + 0.044413577765226364, + 0.019495494663715363, + 0.012730170972645283, + 0.017765432596206665, + -0.019637515768408775, + -0.016267765313386917, + 0.006419957149773836, + -0.013943797908723354, + -0.020437993109226227, + -0.008585765026509762, + 0.004725398030132055, + 0.004215416964143515, + -0.015196157619357109, + -0.0038506831042468548, + 0.012175001204013824, + -0.020231418311595917, + 0.012142724357545376, + -0.030056631192564964, + -0.021909838542342186, + 0.003108304925262928, + 0.02263285033404827, + -0.0094766179099679, + 0.00822425913065672, + 0.013020667247474194, + 0.005596885457634926, + 0.004270288161933422, + 0.006771779619157314, + 0.02207767963409424, + 0.0013701717834919691, + 0.03057306818664074, + 0.005603340920060873, + 0.021664530038833618, + -0.025421610102057457, + -0.0067459577694535255, + -0.017533035948872566, + 0.0064038182608783245, + -0.006187560502439737, + 0.040023863315582275, + 0.004673754330724478, + 0.0036118309944868088, + 0.050404246896505356, + 0.008488932624459267, + -0.031037861481308937, + -0.002519244095310569, + -0.008508299477398396, + 0.015944991260766983, + 0.017804164439439774, + 0.010845175944268703, + -0.02598969079554081, + -0.0043832589872181416, + 0.006277936976402998, + 0.010703155770897865, + 0.023446237668395042, + -0.005651757121086121, + -0.044207002967596054, + 0.011374523863196373, + -0.03535011038184166, + 0.007488335948437452, + -0.0061940159648656845, + -5.169412816030672e-06, + -0.0012289586011320353, + 0.0037635343614965677, + 0.01103238482028246, + 0.002398204058408737, + -0.015105781145393848, + -0.01289801299571991, + -0.015480197966098785, + -0.015944991260766983, + -0.02496972680091858, + -0.018824126571416855, + 0.013672668486833572, + -0.003145423950627446, + -0.04782206192612648, + -0.010154441930353642, + 0.008863349445164204, + -0.003411711659282446, + -0.005028804764151573, + 0.004906150978058577, + 0.005093359388411045, + 0.03612476587295532, + -0.018126938492059708, + 0.017403926700353622, + -0.03473038598895073, + -0.02283942513167858, + -0.0028016704600304365, + -0.004421991761773825, + -0.005022349301725626, + 0.002007648814469576, + -0.03757078945636749 + ], "DOT") LIMIT 3; +/* end::query-vectors-idx-filtered-whole[] */ \ No newline at end of file diff --git a/modules/vector-index/examples/hyperscale-idx-data.json b/modules/vector-index/examples/hyperscale-idx-data.json new file mode 100644 index 000000000..1f539e697 --- /dev/null +++ b/modules/vector-index/examples/hyperscale-idx-data.json @@ -0,0 +1,395 @@ +// tag::query-rgb-questions-output[] +[{ + "id": "#87CEEB", + "question": "What is the color that is often linked to feelings of peace and + tranquility, and is reminiscent of the clear sky on a calm day?", + "wanted_similar_color_from_search": "sky blue", + "vector": [ + 0.024399276822805405, + -0.006973916664719582, + 0.025191623717546463, + -0.02188388630747795, + "..." + ] +}] +// end::query-rgb-questions-output[] + + +// tag::rgb-document[] +[{ + "id": "#87CEEB", + "color": "sky blue", + "brightness": 188.077, + "description": "Sky blue is a calming and serene color that evokes feelings of + tranquility. It is a light shade of blue that resembles the color + of the sky on a clear day. The color is often associated with + peace, relaxation, and a sense of openness. It can also represent + a sense of freedom and endless possibilities, as the sky seems + to stretch on forever. Sky blue is a refreshing and soothing color + that can bring a sense of calmness to any space.", + "embedding_vector_dot": [ + 0.015966663137078285, + 0.018097303807735443, + -0.005783640779554844, + -0.020661966875195503, + "..." + ] +}] +// end::rgb-document[] + +// tag::query-rgb-color[] +[{ + "color": "deep sky blue", + "description": "Deep sky blue is a calming and refreshing color that evokes + feelings of tranquility and peace. It is a shade of blue + that resembles the clear, open sky on a sunny day. This + color is often associated with serenity and relaxation, + making it a popular choice for interior design and clothing. + Its cool and calming nature makes it a perfect color for + creating a peaceful and serene atmosphere.", + "wanted_similar_color_from_search": "sky blue" + }, + { + "color": "sky blue", + "description": "Sky blue is a calming and serene color that evokes feelings of + tranquility. It is a light shade of blue that resembles the + color of the sky on a clear day. The color is often associated + with peace, relaxation, and a sense of openness. It can also + represent a sense of freedom and endless possibilities, as the + sky seems to stretch on forever. Sky blue is a refreshing and + soothing color that can bring a sense of calmness to any space.", + "wanted_similar_color_from_search": "sky blue" + }, + { + "color": "light sky blue", + "description": "Light sky blue is a soft and delicate color that evokes a sense of + tranquility and peace. It is a shade of blue that is reminiscent + of a clear, sunny day with a few fluffy clouds scattered across the + sky. This color is often associated with feelings of serenity and + relaxation, making it a popular choice for bedrooms and spa-like + environments. The lightness of this shade adds a touch of freshness + and purity, making it a perfect color for creating a calming and + inviting atmosphere.", + "wanted_similar_color_from_search": "sky blue" + } +] +// end::query-rgb-color[] + + +// tag::query-rgb-brightness[] +[{ + "color": "sky blue", + "description": "Sky blue is a calming and serene color that evokes + feelings of tranquility. It is a light shade of blue + that resembles the color of the sky on a clear day. + The color is often associated with peace, relaxation, + and a sense of openness. It can also represent a sense + of freedom and endless possibilities, as the sky seems + to stretch on forever. Sky blue is a refreshing and + soothing color that can bring a sense of calmness to + any space.", + "brightness": 188.077 + }, + { + "color": "light sky blue", + "description": "Light sky blue is a soft and delicate color that evokes + a sense of tranquility and peace. It is a shade of blue + that is reminiscent of a clear, sunny day with a few fluffy + clouds scattered across the sky. This color is often + associated with feelings of serenity and relaxation, making + it a popular choice for bedrooms and spa-like environments. + The lightness of this shade adds a touch of freshness and + purity, making it a perfect color for creating a calming + and inviting atmosphere.", + "brightness": 189.787 + }, + { + "color": "pale turquoise", + "description": "Pale turquoise is a delicate and soothing color that can be + described as a soft blend of blue and green. It has a calming + effect and can evoke feelings of tranquility and serenity. The + color is often associated with the ocean and can bring to mind + images of clear, tropical waters. It has a gentle and subtle + quality, making it a popular choice for creating a peaceful and + serene atmosphere.", + "brightness": 219.163 + } +] +// end::query-rgb-brightness[] + + +// tag::rerank-before[] +[{ + "color": "peach", + "description": "Peach is a soft and warm color that can enliven any space. It has + a delicate and gentle quality, like the softness of a peach's skin. + This color can soften the harshness of other colors and bring a sense + of warmth and comfort. It is a versatile color that can be both calming + and invigorating, making it a popular choice in interior design. Peach + is a color that evokes feelings of happiness and positivity, making it + a perfect addition to any room.", + "id": "#FF8C3C" + }, + { + "color": "apricot", + "description": "Apricot is a warm and inviting color, reminiscent of the soft glow of + a sunset. It has the ability to soften the harshness of other colors and + enliven any space it is used in. It is a delicate and soothing hue, + perfect for creating a cozy and welcoming atmosphere.", + "id": "#FB8737" + }, + { + "color": "light yellow", + "description": "Light yellow is a delicate and gentle color that can soften the overall + tone of a room. It has a bright and cheerful quality that can brighten up + any space. This color also has the ability to illuminate a room, making it + feel more open and airy. Light yellow is a perfect choice for creating + a warm and inviting atmosphere.", + "id": "#FFFFE0" + } +] +// end::rerank-before[] + +// tag::rerank-after[] +[{ + "color": "peach", + "description": "Peach is a soft and warm color that can enliven any space. It has + a delicate and gentle quality, like the softness of a peach's skin. + This color can soften the harshness of other colors and bring a sense + of warmth and comfort. It is a versatile color that can be both calming + and invigorating, making it a popular choice in interior design. Peach + is a color that evokes feelings of happiness and positivity, making it + a perfect addition to any room.", + "id": "#FF8C3C" + }, + { + "color": "light yellow", + "description": "Light yellow is a delicate and gentle color that can soften the overall + tone of a room. It has a bright and cheerful quality that can brighten up + any space. This color also has the ability to illuminate a room, making it + feel more open and airy. Light yellow is a perfect choice for creating a + warm and inviting atmosphere.", + "id": "#FFFFE0" + }, + { + "color": "apricot", + "description": "Apricot is a warm and inviting color, reminiscent of the soft glow of a + sunset. It has the ability to soften the harshness of other colors and + enliven any space it is used in. It is a delicate and soothing hue, perfect + for creating a cozy and welcoming atmosphere.", + "id": "#FB8737" + } +] +// end::rerank-after[] + + +// tag::query-rgb-distance[] +[{ + "color": "deep sky blue", + "description": "Deep sky blue is a calming and refreshing color that + evokes feelings of tranquility and peace. It is a shade + of blue that resembles the clear, open sky on a sunny + day. This color is often associated with serenity and + relaxation, making it a popular choice for interior + design and clothing. Its cool and calming nature makes + it a perfect color for creating a peaceful and serene + atmosphere.", + "wanted_similar_color_from_search": "sky blue", + "approx_distance": 0.5202313646339596 + }, + { + "color": "sky blue", + "description": "Sky blue is a calming and serene color that evokes + feelings of tranquility. It is a light shade of blue + that resembles the color of the sky on a clear day. + The color is often associated with peace, relaxation, + and a sense of openness. It can also represent a sense + of freedom and endless possibilities, as the sky seems + to stretch on forever. Sky blue is a refreshing and + soothing color that can bring a sense of calmness to + any space.", + "wanted_similar_color_from_search": "sky blue", + "approx_distance": 0.5205406483903239 + }, + { + "color": "light sky blue", + "description": "Light sky blue is a soft and delicate color that evokes + a sense of tranquility and peace. It is a shade of blue + that is reminiscent of a clear, sunny day with a few + fluffy clouds scattered across the sky. This color is + often associated with feelings of serenity and + relaxation, making it a popular choice for bedrooms and + spa-like environments. The lightness of this shade adds + a touch of freshness and purity, making it a perfect + color for creating a calming and inviting atmosphere.", + "wanted_similar_color_from_search": "sky blue", + "approx_distance": 0.5315537216573907 + } +] +// end::query-rgb-distance[] + +// tag::untuned-query-results[] +[ + [{ + "color": "pale turquoise" + }, + { + "color": "slate blue" + }, + { + "color": "cadet blue" + }, + { + "color": "teal" + }, + { + "color": "snow" + }, + { + "color": "medium turquoise" + }, + { + "color": "slate gray" + }, + { + "color": "grey" + }, + { + "color": "medium slate blue" + }, + { + "color": "linen" + } + ] +] +// end::untuned-query-results[] + +// tag::exact-query-results[] +[ + [{ + "color": "deep sky blue" + }, + { + "color": "sky blue" + }, + { + "color": "light sky blue" + }, + { + "color": "pale turquoise" + }, + { + "color": "blue" + }, + { + "color": "slate blue" + }, + { + "color": "light cyan" + }, + { + "color": "cadet blue" + }, + { + "color": "light blue" + }, + { + "color": "medium blue" + } + ] +] +// end::exact-query-results[] + +// tag::recall-rate-results[] +[{ + "total_returned_items": 10, + "matching_color_list": [{ + "color": "cadet blue" + }, + { + "color": "pale turquoise" + }, + { + "color": "slate blue" + } + ], + "matching_color_count": 3, + "recall_percentage": 30 +}] +// end::recall-rate-results[] + +// tag::recall-rate-tuned-results[] +[{ + "total_returned_items": 10, + "matching_color_list": [{ + "color": "blue" + }, + { + "color": "cadet blue" + }, + { + "color": "deep sky blue" + }, + { + "color": "light blue" + }, + { + "color": "light cyan" + }, + { + "color": "light sky blue" + }, + { + "color": "medium blue" + }, + { + "color": "pale turquoise" + }, + { + "color": "sky blue" + }, + { + "color": "slate blue" + } + ], + "matching_color_count": 10, + "recall_percentage": 100 +}] +// end::recall-rate-tuned-results[] + + +// tag::tuned-query-results[] +[ + [{ + "color": "deep sky blue" + }, + { + "color": "sky blue" + }, + { + "color": "light sky blue" + }, + { + "color": "pale turquoise" + }, + { + "color": "light cyan" + }, + { + "color": "slate blue" + }, + { + "color": "blue" + }, + { + "color": "cadet blue" + }, + { + "color": "light blue" + }, + { + "color": "medium blue" + } + ] +] +// end::tuned-query-results[] diff --git a/modules/vector-index/examples/hyperscale-idx-examples.sqlpp b/modules/vector-index/examples/hyperscale-idx-examples.sqlpp new file mode 100644 index 000000000..ba9637253 --- /dev/null +++ b/modules/vector-index/examples/hyperscale-idx-examples.sqlpp @@ -0,0 +1,239 @@ +/* tag::create-rgb-idx[] */ +CREATE VECTOR INDEX `color_desc_hyperscale` + ON `vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) + WITH { "dimension":1536, "similarity":"L2", "description":"IVF8,SQ4" } +/* end::create-rgb-idx[] */ + +/* tag::rgb-entry[] */ +SELECT + d.id, + d.color, + d.brightness, + d.description, + ARRAY_CONCAT( + d.embedding_vector_dot[0:4], + ["..."] + ) AS embedding_vector_dot +FROM `vector-sample`.`color`.`rgb` AS d +WHERE d.id = "#87CEEB"; +/* end::rgb-entry[] */ + + +/* tag::query-rgb-questions[] */ +SELECT + d.id, + d.question, + d.wanted_similar_color_from_search, + ARRAY_CONCAT( + d.couchbase_search_query.knn[0].vector[0:4], + ["..."] + ) AS vector +FROM `vector-sample`.`color`.`rgb-questions` AS d +WHERE d.id = "#87CEEB"; +/* end::query-rgb-questions[] */ + +/* tag::query-rgb-with-subquery[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB"), + question_answer AS ( + SELECT wanted_similar_color_from_search + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB") +SELECT b.color, b.description, q.wanted_similar_color_from_search + FROM `vector-sample`.`color`.`rgb` AS b, question_answer as q + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, + question_vec[0], "l2", 4) LIMIT 3; +/* end::query-rgb-with-subquery[] */ + +/* tag::create-idx-brightness[] */ +CREATE VECTOR INDEX `color_desc_hyperscale_brightness` + ON `vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) + INCLUDE (`brightness`) + WITH { "dimension":1536, "similarity":"L2", "description":"IVF8,SQ4" } +/* end::create-idx-brightness[] */ + +/* tag::query-rgb-with-brightness[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB") +SELECT b.color, b.description, b.brightness + FROM `vector-sample`.`color`.`rgb` AS b + WHERE b.brightness > 170.0 + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, + question_vec[0], "l2", 4) LIMIT 3; +/* end::query-rgb-with-brightness[] */ + +/* tag::create-rgb-no-persist[] */ +CREATE VECTOR INDEX `color_desc_hyperscale_no_persist` + ON `vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) + WITH { "dimension":1536, "similarity":"L2", "description":"IVF8,SQ4", + "persist_full_vector": false}; +/* end::create-rgb-no-persist[] */ + +/* tag::rerank-before-example[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#FFFFE0") + SELECT b.color, b.description, b.id + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) + LIMIT 3; +/* end::rerank-before-example[] */ + +/* tag::rerank-after-example[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#FFFFE0") + SELECT b.color, b.description, b.id + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4, TRUE) + LIMIT 3; +/* end::rerank-after-example[] */ + + +/* tag::query-rgb-with-distance[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB"), + question_answer AS ( + SELECT wanted_similar_color_from_search + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB") +SELECT b.color, b.description, q.wanted_similar_color_from_search, approx_distance + FROM `vector-sample`.`color`.`rgb` AS b, question_answer as q, + APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) + as approx_distance + ORDER BY approx_distance LIMIT 3; +/* end::query-rgb-with-distance[] */ + +/* tag::untuned-query[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB" + ), +colors AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") + LIMIT 10 ) +SELECT RAW colors; +/* end::untuned-query[] */ + + +/* tag::exact-query[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB" + ), +colors AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") + LIMIT 10 ) +SELECT RAW colors; +/* end::exact-query[] */ + +/* tag::recall-rate-query[] */ +-- Get the vector for the question +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB" +), +-- Exact Search results +GroundTruthResults AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY VECTOR_DISTANCE(b.embedding_vector_dot, + question_vec[0], "l2") LIMIT 10 +), +-- Approximate Search results +ApproximateResults AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, + question_vec[0], "l2") LIMIT 10 +) +SELECT + -- List the stats based on the merges in the following clauses + COUNT(DISTINCT gr.color) AS total_returned_items, + ARRAY_AGG(intersection_results) AS matching_color_list, + COUNT(DISTINCT intersection_results.color) AS matching_color_count, + (COUNT(DISTINCT intersection_results.color) * 100.0 / COUNT(DISTINCT gr.color)) AS recall_percentage +FROM + GroundTruthResults AS gr +LEFT JOIN + ApproximateResults AS ar ON gr.color = ar.color +LEFT JOIN + -- Use INTERSECT SELECT to find the shared members of the two result sets + (SELECT t1.color FROM GroundTruthResults AS t1 INTERSECT SELECT t2.color FROM ApproximateResults AS t2) AS intersection_results + ON gr.color = intersection_results.color; +/* end::recall-rate-query[] */ + +/* tag::recall-rate-tuned[] */ +-- Get the vector for the question +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB" +), +-- Exact Search results +GroundTruthResults AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY VECTOR_DISTANCE(b.embedding_vector_dot, + question_vec[0], "l2") LIMIT 10 +), +-- Approximate Search results, this timw with nProbes set to 4: +ApproximateResults AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, + question_vec[0], "l2", 4) LIMIT 10 +) +SELECT + -- List the stats based on the merges in the following clauses + COUNT(DISTINCT gr.color) AS total_returned_items, + ARRAY_AGG(intersection_results) AS matching_color_list, + COUNT(DISTINCT intersection_results.color) AS matching_color_count, + (COUNT(DISTINCT intersection_results.color) * 100.0 / COUNT(DISTINCT gr.color)) AS recall_percentage +FROM + GroundTruthResults AS gr +LEFT JOIN + ApproximateResults AS ar ON gr.color = ar.color +LEFT JOIN + -- Use INTERSECT SELECT to find the shared members of the two result sets + (SELECT t1.color FROM GroundTruthResults AS t1 INTERSECT SELECT t2.color FROM ApproximateResults AS t2) AS intersection_results + ON gr.color = intersection_results.color; +/* end::recall-rate-tuned[] */ + + +/* tag::tuned-query[] */ +WITH question_vec AS ( + SELECT RAW couchbase_search_query.knn[0].vector + FROM `vector-sample`.`color`.`rgb-questions` + WHERE meta().id = "#87CEEB" + ), +colors AS ( + SELECT b.color + FROM `vector-sample`.`color`.`rgb` AS b + ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) + LIMIT 10 ) +SELECT RAW colors; +/* end::tuned-query[] */ + +/* tag::train-list[] */ +CREATE VECTOR INDEX `squad-context-index` +ON `demo`.`squad`.`context`(`vector` VECTOR) + WITH { "dimension":384, "similarity":"L2", + "description":"IVF,SQ8", + "train_list":15000}; +/* end::train-list[] */ diff --git a/modules/vector-index/pages/composite-vector-index.adoc b/modules/vector-index/pages/composite-vector-index.adoc new file mode 100644 index 000000000..747974123 --- /dev/null +++ b/modules/vector-index/pages/composite-vector-index.adoc @@ -0,0 +1,468 @@ += Filtered Searches Using Composite Vector Index +:page-topic-type: guide +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: A Composite Vector index is a Global Secondary Index (GSI) with a single vector column that combines scalar queries with semantic search. +:stem: +:page-toclevels: 3 +:index-name: Composite Vector index +:index-name-plural: Composite Vector indexes + +{description} +The added vector column lets your application perform a query using both the index's scalar, array, and object index entries to pre-filter the dataset before performing a vector similarity search. + +== How the Composite Vector Index's Vector Column Works + +The Composite Vector index's single vector column enables semantic and similarity searches within your {sqlpp} queries. +When creating the index, you use a `VECTOR` key attribute to identify the key that contains the embedded vectors. + +When your query contains an embedded vector, the Query Service uses any non-vector predicates in the query to filter index entries. +Then it performs a vector similarity search to locate semantically related vectors. +Handling the non-vector predicates first reduces the number of vector similarity comparisons the Query Service must do to find similar vectors. + +== Prerequisites + +* You must have the Index Service enabled on at least one node in your cluster. +For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. + +* You must have a bucket with scopes and collections in your database. +For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. + +* Your account must have the xref:learn:security:roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. + +* You have documents in a collection that contain one or more vector embeddings. +You can add a single vector to a Composite Vector index. +If your documents contain multiple embedded vectors, you can create multiple indexes---one for each vector attribute. ++ +Embeddings can be an array of floating point numbers or a base64 encoded string. +Couchbase {product-name} does not embed vectors itself. +You must use an external embedding model to embed vectors into your data and add them to your documents. ++ +[TIP] +-- +include::vector-search:partial$download-sample-partial.adoc[] +-- + +* You must know the number of dimensions the vector contains. +The embedding model you use to embed the vectors may determine this value for you. +For example, OpenAI API's `text-embedding-ada-002` embedding model that embedded the sample data demonstrated later in this page creates vectors that have 1536 dimensions. + +* You must decide what distance metric and quantization you want your index to use. +The metrics affect how the index compares vectors. +The quantization determines how much memory your index uses and the amount of processing Couchbase {product-name} must perform to train and search them. +See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity Metrics] and xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization] for more information. + + +[#create-index] +ifeval::['{product-name}' == 'Capella'] +include::vector-index:partial$create-composite-index-capella-ui.adoc[] + +== Create a Composite Vector Index Using SQL++ +endif::[] +ifeval::['{product-name}' == 'Server'] +== Create a Hyperscale Vector Index +endif::[] + +Creating a Composite Vector index is similar to creating a non-vector GSI index. +See xref:guides:create-index.adoc[] for an overview of creating indexes. +In the `CREATE INDEX` statement to create the Composite Vector index, add the `VECTOR` lead key attribute after the vector's key name to declare it as an embedded vector. + +You must also use the xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[`WITH`] clause to specify some additional information for the vector column. +The format for this clause with the most commonly used parameters is: + +[source,sqlpp] +---- +WITH { "dimension": , + "similarity":, + "description": + }; +---- + +NOTE: The `WITH` clause can contain other parameters that affect how the index processes vectors. +For a full list of these parameters, see xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[WITH Clause] in the {sqlpp} for Query Reference. + +* `dimensions` is an integer value that sets the number of dimensions in the vector. +This value is set by the embedded model you used to embed the vectors. +* `similarity-metric` is a string that sets the distance metric to use when comparing vectors during index creation. ++ +include::partial$distance-metric-list.adoc[] + ++ +For the greatest accuracy, use the distance function you plan to use when querying vector data. +* `centroids-and-quantization` is a string containing the settings for the quantization and index algorithms. +See <<#algo_settings>> in the next section for more information. + +For a full list of the parameters that affect a Composite Vector index, see xref:n1ql:n1ql-language-reference/createindex.adoc[]. + +include::partial$index-algorithm-settings.adoc[] + +[#examples] +=== Examples + +The following examples show you how to create two Composite Vector index with a vector column using sample data. +They both use the data from the `color_data_2vectors.zip` file mentioned earlier. + +The following query gets a single document from the `rgb` collection in the `vector-sample` bucket's `color` scope. +It truncates the `embedding_vector_dot` attribute to the first four values to improve readability. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=get-sample-doc] +---- + +The result of running this query is: + +[source,json] +---- +include::vector-index:example$composite-vector-data.json[tag=sample-doc] +---- + +==== Index the RGB Values + +The `rgb.json` file's `colorvect_l2` attribute defines an array containing the RGB values for the entry's color. +While this technically is not an embedded vector, you can still create a vector index column for this array. +The following example creates a Composite Vector index for this attribute as an embedded vector as well as the color's name and brightness. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-rgb-idx] +---- + +In this example: + +* The number of dimensions is 3, because there are three values in the array containing the RGB value. +* The similarity function is `L2`. +This function works well to find related vectors which are close by the search vector. +In this example, finding similar colors depends more on proximity than the magnitude or alignment of the vectors. +See xref:gsi-with-vectors.adoc##vector_similarity[Vector Similarity] for a comparison of similarity functions. +* The `description` lets Couchbase {product-name} decide the number of centroids for the IVF algorithm. +It also chooses to use Scalar Quantization with an 8-bit index, splitting each dimension into 256 bins. +This setting does not actually save any space in the index, as each of the RGB dimensions are already 8-bit values. +However, in this example, memory use is not a concern as the dataset is small. + +The result of running example is: + +[source,json] +---- +[ + { + "id": "f572fa0b1c7358ee", + "name": "color_vectors_idx", + "state": "online" + } +] +---- + +==== Create a Composite Vector Index Using the Embedded Vectors + +The `embedding_vector_dot` attribute contains the embedded vectors for the text in the `description` attribute. +The data sample shown in <<#examples>> truncated this attribute to several values. +The embedded vector contains 1536 dimensions. + +The following example creates a Composite Vector index that indexes the embedded vectors in the `embedding_vector_dot` as well as indexing the scalar `color` that contains the color's name and `brightness.` + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-idx] +---- + +This example uses the Dot Product similarity function. +This function works better with the embedded text content than the Euclidean function used in the previous example. +It also uses the same algorithms as the previous example--Couchbase {product-name} chooses the number of centroids, and uses SQ quantization with 256 bins. + +If successful, Couchbase {product-name} responds with: + +[source, json] +---- +[ + { + "id": "c965205718c3e4c2", + "name": "color_desc_idx", + "state": "online" + } +] +---- + +After Couchbase {product-name} creates the index, it begins training it. +Depending on your system, this training can take several seconds. + +== Query with a Composite Vector Index Column + +You query embedded vector attributes that you have indexed in a Composite Vector index to find similar vectors and therefore similar semantic content. +To find the most similar vectors, use a `GROUP BY` clause in your query to return the most relevant vectors first. +In this clause, call one of two functions that actually performs the vector comparisons: `APPROX_VECTOR_DISTANCE` or `VECTOR_DISTANCE`. +The first of these functions is faster, but less precise. +The second is more precise, but slower. +Which you choose depends on your use case. + +You should also use a `LIMIT` clause to return just the number of vectors you need. +The query pushes the `LIMIT` clause down into the index scan so that the scan ends after finding the required number of matches. + +=== Query RGB Values + +Querying the RGB values in `rgb.colorvect_l2` requires a vector with only three values. +You can just specify the vector by hand. +The following example finds colors that are similar to gray, which has an RGB value of 128, 128, 128: + +[source, sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-rgb-idx] +---- + +The query uses the `APPROX_VECTOR_DISTANCE` function to sort the results. +You pass it the vector column to search, the vector to search for (in this case, the array `128, 128, 128`) and the distance function. + +For the best accuracy, use the same distance function you specified when creating the Composite Vector index (in this case, `L2`). +The query pushes the `LIMIT` clause down into the index scan, so once it finds the 5 entries that satisfy the query, it exits. + +The top result is the entry for gray. +The other results are all shades of gray: + +[source,json] +---- +[{ + "color": "grey", + "colorvect_l2": [ + 128, + 128, + 128 + ], + "brightness": 128 + }, + { + "color": "slate gray", + "colorvect_l2": [ + 112, + 128, + 144 + ], + "brightness": 125.04 + }, + { + "color": "light slate gray", + "colorvect_l2": [ + 119, + 136, + 153 + ], + "brightness": 132.855 + }, + { + "color": "light gray", + "colorvect_l2": [ + 144, + 144, + 144 + ], + "brightness": 144 + }, + { + "color": "dim gray", + "colorvect_l2": [ + 105, + 105, + 105 + ], + "brightness": 105 + } +] +---- + +You can also add other predicates to help reduce the workload of searching for similar vectors by excluding vectors. +The following example searches for colors similar to gray which has an RGB value of 128, 128, 128 and have a brightness greater than 128: + +[source, sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-rgb-idx-w-predicate] +---- + +The result of running this query are: + +[source, json] +---- +[{ + "color": "light slate gray", + "colorvect_l2": [ + 119, + 136, + 153 + ], + "brightness": 132.855 + }, + { + "color": "light gray", + "colorvect_l2": [ + 144, + 144, + 144 + ], + "brightness": 144 + }, + { + "color": "cadet blue", + "colorvect_l2": [ + 95, + 158, + 160 + ], + "brightness": 139.391 + }, + { + "color": "rosy brown", + "colorvect_l2": [ + 188, + 143, + 143 + ], + "brightness": 156.455 + }, + { + "color": "dark sea green", + "colorvect_l2": [ + 143, + 188, + 143 + ], + "brightness": 169.415 + } +] +---- + +=== Query the Embedded Vectors + +To query the `color_desc_idx` Composite Vector index containing the embedded vector for the description attribute, you must supply a vector. +In a production environment, your application calls the same embedding model it called to generate the embedded vectors in your documents to generate a vector for the query value. + +For this example, you can use embedded vectors in the `rgb_questions.json` file that's in the `color_data_2vectors.zip` file. +This file contains a `question` attribute containing a search prompt for a particular color. +The following query gets a single document from the `rgb_questions` collection in the `vector-sample` bucket's `color` scope. +It truncates the `couchbase_search_query.knn.vector` attribute to the first four values to improve readability. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=get-sample-doc-question] +---- + +The result of the query shows the content of one of the documents: + + +[source,json] +---- +include::vector-index:example$composite-vector-data.json[tag=sample-doc-question] +---- + +The `couchbase_search_query.knn.vector` attribute contains the embedded vector for the `question` attribute. + +This example queries the `embedding_vector_dot` column. +It appears here with most of the 1536 vectors omitted: + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-truncated] +---- + +You can expand the following section to see and copy the entire query with all the vectors: + +.Show full example +[%collapsible] +==== +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-whole] +---- +==== + +Another option is to import the `rgb_questions.json` file into another collection in the `vector-sample` bucket's `color` scope named `rgb-questions`. +Then you can use a subquery to get the vectors for the question and use it in your query of the `rgb` collection's `embedding_vector_dot` attribute: + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-subquery] +---- + +In either case, the results of the query are the same: + +[source,json] +---- +[ + { + "color": "cantalope", + "description": "The color cantaloupe is a soft and soothing shade that evokes feelings of calmness + and relaxation. It is a refreshing hue that brings to mind the juicy and sweet fruit it is named + after. This delicate color is a pale orange with hints of pink, giving it a subtle and gentle + appearance. It is a perfect color for creating a peaceful and tranquil atmosphere." + }, + { + "color": "papaya whip", + "description": "Papaya whip is a soft and mellow color that can be described as a light shade of + peach or coral. It has a calming and soothing effect, similar to the tropical fruit it is named + after. This color is perfect for creating a warm and inviting atmosphere, and it pairs well with + other pastel shades or neutral tones. Papaya whip is a versatile color that can be used in both + fashion and interior design, adding a touch of elegance and sophistication to any space." + }, + { + "color": "apricot", + "description": "Apricot is a warm and inviting color, reminiscent of the soft glow of a sunset. It + has the ability to soften the harshness of other colors and enliven any space it is used in. It is a + delicate and soothing hue, perfect for creating a cozy and welcoming atmosphere." + } +] +---- + +The second result, the color papaya whip, matches the `rgb_questions` collection's `wanted_similar_color_from_search` attribute. + +=== Adding a Scalar + +Using additional scalar fields in your search can improve your results and reduce the overhead of performing a vector search. +For example, filtering on an additional scalar field reduces the number of vectors an index scan has to compare. +Searching for scalar values requires less resources than vector searches. + +The example that created the `color_desc_idx` index added fields in addition to the `embedding_vector_dot` vector field. +The following example adds a filter based on the `brightness` field to reduce the number of vectors that get compared and also improve the results. + +The version of the query that performs a subquery of the `rgb-questions` to get the vector value is: + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-subquery-filtered] +---- + +The truncated version of the query is: + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-filtered-truncated] +---- + +You can expand the Show full example section to see and copy the entire query with all the vectors: + +.Show full example +[%collapsible] +==== +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-filtered-whole] +---- +==== + +The results of this query moves the papaya whip entry to the top. + +[source,json] +---- +[{ + "color": "papaya whip", + "description": "Papaya whip is a soft and mellow color that can be described as a light shade of peach or coral. It has a calming and soothing effect, similar to the tropical fruit it is named after. This color is perfect for creating a warm and inviting atmosphere, and it pairs well with other pastel shades or neutral tones. Papaya whip is a versatile color that can be used in both fashion and interior design, adding a touch of elegance and sophistication to any space.", + "brightness": 240.82 + }, + { + "color": "pale turquoise", + "description": "Pale turquoise is a delicate and soothing color that can be described as a soft blend of blue and green. It has a calming effect and can evoke feelings of tranquility and serenity. The color is often associated with the ocean and can bring to mind images of clear, tropical waters. It has a gentle and subtle quality, making it a popular choice for creating a peaceful and serene atmosphere.", + "brightness": 219.163 + }, + { + "color": "light green", + "description": "Light green is a calming and refreshing color that evokes feelings of tranquility and new beginnings. It is a delicate shade that is often associated with nature and growth. The softness of this color can bring a sense of balance and harmony to any space, making it a popular choice for interior design. Light green is also known to have a rejuvenating effect, making it a perfect color for relaxation and self-care. Its gentle hue can bring a sense of peace and serenity to the mind, body, and soul.", + "brightness": 199.178 + } +] +---- diff --git a/modules/vector-index/pages/hyperscale-filter.adoc b/modules/vector-index/pages/hyperscale-filter.adoc new file mode 100644 index 000000000..4cf963392 --- /dev/null +++ b/modules/vector-index/pages/hyperscale-filter.adoc @@ -0,0 +1,57 @@ += Use Scalar Columns to Filter Hyperscale Vector Index Scans +:page-topic-type: guide +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: You can reduce the number of vectors a query that uses a Hyperscale Vector index by adding scalar values. +:stem: +:page-toclevels: 3 +:index-name: Hyperscale Vector index +:index-name-plural: Hyperscale Vector indexes + +[abstract] +{description} +A Hyperscale Vector index has a single column that indexes the vector. +However, you can include scalar values in the index that you can use to filter the vector search. +The index stores these included values along with the vector, but they're not indexed. + +In your queries that use a Hypserscale Vector index, you add the included scalar values as predicates in the `WHERE` clause. +During the index scan, Couchbase {product-name} uses the included scalar values to filter out vectors that do not meet the filter restriction. +If the filter matches the entry, Couchbase {product-name} performs the more expensive vector comparison operation to determine the distance between the vector value and the search vector. + +== Creating a Hyperscale Vector Index with Included Scalar Values + +When you create a Hyperscale Vector index, you can add scalar values to the index using the `INCLUDE` clause in the `CREATE VECTOR INDEX` statement. + +The following example creates a new Hyperscale Vector index for the `embedding-vector-dot` vector column from the xref:vector-index:hyperscale-vector-index.adoc#query-example[Hyperscale Vector Index Query Example]. +It also includes the `brightness` key from the document. + + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-idx-brightness] +---- + +This example is the same as the example from xref:vector-index:hyperscale-vector-index.adoc#examples[Create Hyperscale Vector Index Example], except that it adds the `INCLUDE` clause to add the `brightness` key. + +== Querying a Hyperscale Vector Index with Included Scalar Values + +When you query a Hyperscale Vector index, you can use the included scalar values as predicates in the `WHERE` clause of your query. +Couchbase {product-name} uses the predicates to filter the results before performing the vector comparison. + +The following example performs the same query as the example from xref:vector-index:hyperscale-vector-index.adoc#example[Query with a Hyperscale Vector Index], but adds the `brightness` key as a predicate in the `WHERE` clause: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=query-rgb-with-brightness] +---- + +The result of running the query is: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-brightness] +---- + +Querying with the `brightness` attribute changes makes `sky blue` the top result compared to the results from the example in xref:vector-index:hyperscale-vector-index.adoc#query-example[Query with a Hyperscale Vector Index]. +The restriction can also make the query faster. +On a laptop running a three-node cluster in Docker containers, the query ran in (43{nbsp}ms verses 219{nbsp}ms for the query without the filter. diff --git a/modules/vector-index/pages/hyperscale-reranking.adoc b/modules/vector-index/pages/hyperscale-reranking.adoc new file mode 100644 index 000000000..56c1d77fb --- /dev/null +++ b/modules/vector-index/pages/hyperscale-reranking.adoc @@ -0,0 +1,89 @@ += Hyperscale Vector Index Reranking and Full Vector Persistence +:page-title: Reranking and Full Vector Persistence +:page-topic-type: guide +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: You can enable reranking in queries using a Hyperscale Vector index to potentially improve the query results. +:stem: +:page-toclevels: 3 +:index-name: Hyperscale Vector index +:index-name-plural: Hyperscale Vector indexes + +[abstract] +{description} +It uses non-quantized versions of the search and indexed vectors to return more accurate results. +After the query locates similar vectors in the index, it performs a second round of comparisons using the full vector values stored in the index to reorder the results. +This reranking can make the most relevant vectors to the search vector appear higher in the search results. + +== Enabling Reranking + +To enable reranking, your index must have a copy the full vector value in addition to the quantized value. +The `CREATE VECTOR INDEX` statement adds this copy of the full vector value to the index by default. + +Queries do not perform reranking by default. +To enable it, you must pass `TRUE` as the fifth parameter in the `APPROX_VECTOR_DISTANCE` function call in your query. + +For example, the following query on the sample RGB dataset does not perform reranking: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=rerank-before-example] +---- + +The results of this query are: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=rerank-before] +---- + +The color that's most relevant to the search vector, `#FFFFE0` Light Yellow, is third in the results. + +The following query enables reranking by passing `TRUE` as the fifth parameter in the `APPROX_VECTOR_DISTANCE` function call: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=rerank-after-example] +---- + +The results of this query are: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=rerank-after] +---- + +The result for Light Yellow improved from position 3 to position 2. + +[#prevent-vector-persistence] +== Preventing Vector Persistence + +Reranking can improve the accuracy of recall in some cases. +However, it always decreases queries per second (QPS) when enabled. +In many cases, you can achieve acceptable recall accuracy without reranking. +See xref:vector-index:vector-index-best-practices.adoc#reranking[Reranking] to learn in which cases reranking is useful. + +Storing the full vector significantly increases the size of the index. +If you do not plan to use reranking, you can save space in your index by having it not save the full vector value. + +To prevent an index from persisting the full vector, set the `persist_full_vector` attribute to `False` in the `WITH` clause of the `CREATE VECTOR INDEX` statement you use to create it: + +[source,sqlpp] +---- +WITH { "dimension": , + "similarity":, + "description":, + "persist_full_vector":false + }; +---- + +The following example creates a Hyperscale Vector index from the example RGB dataset that does not persist the full vector value: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-rgb-no-persist] +---- + +The size of the resulting index is much smaller than the index that persists the full vector value (269KiB verses 1.17MiB). + +The actual savings you see in your own indexes depends on the number of dimensions in your vectors. diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc new file mode 100644 index 000000000..62f5f018c --- /dev/null +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -0,0 +1,280 @@ += Vector Searches Using Hyperscale Vector Indexes +:page-topic-type: guide +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: Hyperscale Vector Indexes are optimized to index a single vector column. They offer the highest performance of any index when it comes to vector data. +:stem: +:page-toclevels: 3 +:index-name: Hyperscale Vector index +:index-name-plural: Hyperscale Vector indexes + +[abstract] +{description} +They can scale up to a billion documents containing vectors with a large number of dimensions. + +Because they provide the best performance, consider testing a Hyperscale Vector index for your application before resorting to the other types of indexes. +If you find theirs performance does not meet your needs, then test using a Composite Vector Index or a FTS Vector Index. + + +== How the Hyperscale Vector Index Works + +The Hyperscale Vector Index primarily relies on data stored in an optimized format on disk. +By relying on disk storage, they have lower memory requirements than other index types. + +You add a single vector column to a Hyperscale Vector Index. +The vector value can be an array of floating point values. +You can nest the array in another array as long as you use an xref:n1ql:n1ql-language-reference/unnest.adoc[`UNNEST` clause] to extract the it from the containing array. +You can also store the vector in a BASE64 string. + +== Prerequisites + +Hyperscale Vector Indexes have the following requirements: + +* You must have the Index Service enabled on at least one node in your cluster. +For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. + +* Your account must have the xref:learn:security:roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. + +* You must have a bucket your database. +For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. + +* You have documents in a collection that contain one or more vector embeddings. +You can add a single vector to a Hyperscale Vector Index. +If your documents contain multiple embedded vectors, you can create multiple indexes---one for each vector attribute. ++ +Embeddings can be an array of floating point numbers or a base64 encoded string. +Couchbase {product-name} does not embed vectors itself. +You must use an external embedding model to embed vectors into your data and add them to your documents. ++ +[TIP] +-- +include::vector-search:partial$download-sample-partial.adoc[] +-- + +* The vectors you add to an index must contain the same number of dimensions. +Also the values in the vector must be 32-bit floating point numbers. +If a vector does not meet both of these requirements, the vector index treats it as a NULL value and the document is not added to the index. + +* You must know the number of dimensions the vector contains. +The embedding model you use to embed the vectors may determine this value for you. +For example, OpenAI API's `text-embedding-ada-002` embedding model creates vectors that have 1536 dimensions. + +* You must decide whether you want to use the default distance metric and quantization for your index. +By default, a Hyperscale Vector index uses the xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean distance squared] metric and xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization (SQ)] with 8 bits per vector dimension (`SQ8`). +The metrics affect how the index compares vectors. +The quantization determines how much memory your index uses and the amount of processing Couchbase {product-name} must perform to train and search them. +See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity Metrics] and xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization] for more information. + +[#create-index] +ifeval::['{product-name}' == 'Capella'] +include::vector-index:partial$create-hyperscale-index-capella-ui.adoc[] + +== Create a Hyperscale Vector Index Using SQL++ +endif::[] +ifeval::['{product-name}' == 'Server'] +== Create a Hyperscale Vector Index +endif::[] + +Use the `CREATE VECTOR INDEX` statement to create a Hyperscale Vector Index. +This statement is similar to the `CREATE INDEX` statement that you use to create Global Secondary Indexes (GSI). +See xref:guides:create-index.adoc[] for an overview of creating indexes. +You must also supply a `WITH` clause to set some additional information about the vector column that the Hyperscale index needs. + +The following syntax shows the minimum required parameters to create a Hyperscale Vector index: + +[source,sqlpp] +---- +CREATE VECTOR INDEX `` + ON ``(`` VECTOR) + WITH { "dimension": , + "similarity":, + "description": + }; +---- + +NOTE: This syntax for the `CREATE VECTOR INDEX` shows the minimum required parameters to get you started. +For the full syntax, see xref:n1ql:n1ql-language-reference/createvectorindex.adoc[`CREATE VECTOR INDEX`] in the SQL++ for Query Reference. + +The parameters in this statement are: + +* `index-name` is a string that sets the name of the index. +* `collection` is the path of the collection to index. +* `key-name` is the name of the key containing the vector that you want to index. +The key value must be an array of floating point numbers or a base64 encoded string. +* `dimensions` The number of dimensions in the vector as an integer. +The embedded model you use to embed the vectors determines the number of dimensions in the vector. +* `distance-metric` is a string that sets the distance metric to use when comparing vectors during index creation. ++ +include::partial$distance-metric-list.adoc[] + ++ +For the greatest accuracy, use the distance metric you plan to use to query the data. +* `centroids-and-quantization` is a string containing the settings for the quantization and index algorithms. +See <<#algo_settings>> in the next section for more information. + +include::partial$index-algorithm-settings.adoc[] + + +[#examples] +=== Create Hyperscale Vector Index Example + +The examples in this section use a dataset that contains information about colors including a text description of the color. +There's also a field named `couchbase_search_query.knn.vector` that contains an embedded vector for the color description. + +include::vector-search:partial$download-sample-partial.adoc[] + +The following query returns a sample document from the data in the `vector-sample.color.rgb` collection, truncating the embedded vector to 4 values to make the result readable: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=rgb-entry] +---- + +The result of running the query is: + +[#example-results] +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=rgb-document] +---- + +The following example creates an Hyperscale vector index for the vector column named `embedding-vector-dot`. + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-rgb-idx] +---- + +The key pieces of this example are: + +* The `CREATE VECTOR INDEX` statement creates a Hyperscale Vector index. +This differs from the `CREATE INDEX` statement used to create a Global Secondary Index (GSI). +* The `WITH` clause defines several settings specific to Hyperscale Vector indexes: +** It uses the Euclidean distance (`l2`) similarity function when locating centroids. +This function has high accuracy, which matters in a dataset with only 153 documents. +** Also, because the dataset is so small, the example sets the `description` to `IVF8,SQ4`. +This value has the xref:vector-index:vectors-and-indexes-overview.adoc#IVF[inverted file algorithm] use just 8 centroids. +It also uses 4-bit xref:vector-index:vectors-and-indexes-overview.adoc#sq[scalar quantization]. +These settings limit the fragmentation of the small dataset. + +In most cases, you'll not use these settings in a production environment. + +== Query with a Hyperscale Vector Index + +To use your Hyperscale Vector index, use the `SELECT` statement with a `ORDER BY` clause containing a call to the `APPROX_VECTOR_DISTANCE` function. +This function uses the Hyperscale Vector index when you query the vector key the index covers. + +A typical query looks like this: + +[source,sqlpp] +---- +SELECT + FROM > + ORDER BY APPROX_VECTOR_DISTANCE( + , + , + , + ] + ) LIMIT ; +---- + +NOTE: The previous query example shows just a subset of the most common parameters for the `APPROX_VECTOR_DISTANCE` function. +See xref:n1ql:n1ql-language-reference:vectorfun.adoc#approx_vector_distance[APPROX_VECTOR_DISTANCE] for the full set of parameters available in this function. + +The `APPROX_VECTOR_DISTANCE` parameters shown in the example are: + +* `collection-vector-column` is the name of the key containing the vector in the collection. +* `search-vector-value` is the vector value to search for in the collection column. +It can be an array of floating point numbers or a base64 encoded string. +* `distance-metric` is the distance metric to use when comparing the vectors. +This value should match the distance metric you used when you created the index. +* `centroids-to-probe` is an optional integer value that sets the number of centroids to probe for matching vectors. +By default, the vector search only probes a single centroid. + + +NOTE: You can also call the function xref:n1ql:n1ql-language-reference:vectorfun.adoc#vector_distance[`VECTOR_DISTANCE`] to find similar vectors. +However, this function does not use the Hyperscale Vector index to perform the vector search. +Instead, it performs a brute-force search for similar vectors. +It's useful to measure the recall of your Hyperscale Vector index. +See xref:vector-index:vector-index-best-practices.adoc#recall-accuracy[Determine Recall Rate] for more information about measuring recall. + +Also use a `LIMIT` clause to return just the number of results you need. +The query pushes the `LIMIT` clause down into the index scan so that the scan ends after finding the number of matches you need. + +[#query-example] +=== Hyperscale Vector Index Query Example + +You must supply a vector value in your query that Couchbase {product-name} can compare to the vectors in the index. +In actual use, your application generates a vector for the query value using the same embedding model it used to embed the vectors in your documents. + +To avoid the complication of calling an embedding model, this example uses embedded vectors in the `rgb_questions.json` file that's included in `color_data_2vectors.zip`. +For this example, the contents of this file are loaded into a collection named `vector-sample.color.rgb-questions`. +This collection contains a `question` attribute which is a search prompt for a particular color. +The `couchbase_search_query.knn.vector` attribute contains the embedded vector for the `question` attribute. +The following query lists several attributes from a document in the collection. +It truncates the `couchbase_search_query.knn.vector` attribute to just the first 4 dimensions of the vector for readability: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=query-rgb-questions] +---- + +The output of the query looks like this: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-questions-output] +---- + +To use the embedded vector, you need to include the `couchbase_search_query.knn.vector` attribute in your query's the `SELECT` statement. +You can either directly cut & paste the entire array into your query or use a subquery to retrieve it from the `vector-sample.color.rgb-questions` collection. +The following example uses a subquery to get the vector, and also includes the `wanted_similar_color_from_search` attribute in the output which shows you the color that the query should return. + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=query-rgb-with-subquery] +---- + +In this example, the `APPROX_VECTOR_DISTANCE` function compares the vector in the `couchbase_search_query.knn.vector` attribute to the vectors in the index. +The parameters the example passes to this function are: + +* The `embedding-vector-dot` is the name of the indexed vector key in the collection. +* The `couchbase_search_query.knn[0].vector` is the vector search value to compare to the vectors in the index. +This value is the result of the subquery that gets the vector from the `rgb-questions` collection. +* `l2` is the distance metric to use. +* `4` is the number of centroids to probe for matching vectors. +This value defaults to `1`. +This example sets this value to `4` because the dataset is small. +In a small dataset, it's more likely that relevant vectors are not associated with the same centroid. +This parameter broadens the search beyond a single centroid to find more relevant vectors. +If you re-run the query with the default value of `1`, you'll see that the results are less relevant. + +The result of running the query is: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-color] +---- + +The second result, `sky blue`, matches the `wanted_similar_color_from_search` attribute as the most relevant color to the question posed in the `question` attribute. +All of the results are still relevant to the question. + +=== Getting the Vector Distance + +You can use the `APPROX_VECTOR_DISTANCE` function as a predicate to return the distance between the search vector and the vectors in the index. +You may want to get this value when the distance is meaningful, such as when it represents a real-world measurement. + +The following example returns the distance between the search vector and the vectors in the index by adding an alias for the results of the `APPROX_VECTOR_DISTANCE` function in the `SELECT` statement as well as the `ORDER BY` clause: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=query-rgb-with-distance] +---- + +The result of running the query is: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-distance] +---- + diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc new file mode 100644 index 000000000..4c408a184 --- /dev/null +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -0,0 +1,284 @@ += Use Vector Indexes for AI Applications +:page-topic-type: concept +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: Use Couchbase {page-product-name}'s vector indexes to find documents based on content similarity or semantic meaning. +:page-toclevels: 3 + +{description} + +Couchbase {product-name} supports three types of vector indexes. +You store vectors as attributes in your documents and index them using one of the three types of vector indexes. +You can then find relevant data by executing queries of the vector attributes which use the index to find similar vectors. + +As with other data types in Couchbase {product-name}, indexes make searching for similar vectors much faster. +Using indexes for vector searches is especially important due to the size of vector data. +Vectors contain hundreds to thousands of dimensions. +Using indexes reduces the resources needed to perform vector searches. + +If you're unfamiliar with vectors and vector indexing, see xref:vectors-and-indexes-overview.adoc[] for an overview. + +The three types of Couchbase {product-name} vector indexes are: + +Hyperscale Vector Indexes:: ++ +-- +* Specifically designed for vector searches +* Perform vector similarity and semantic searches faster than the other types of indexes +* Designed to scale to billions of vectors +* Most of the index resides in a highly optimized format on disk +* High accuracy even for vectors with a large number of dimensions +* Supports concurrent searches and inserts for datasets that are constantly changing +-- + ++ +Use this type of index when you want to primarily query vector values with a low memory footprint. +In general, Hyperscale Vector indexes are the best choice for most applications that use vector searches. + ++ +See xref:vector-index:hyperscale-vector-index.adoc[] for more information. + +Composite Vector Indexes:: ++ +-- +* Combines a standard xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc#secondary-index[Global Secondary index (GSI)] with a single vector column +* Designed for searches using a single vector value along with standard scalar values that filter out large portions of the dataset. +The scalar attributes in a query reduce the number of vectors the Couchbase {product-name} has to compare when performing a vector search to find similar vectors. +* Consume a moderate amount of memory and can index billions of documents. +* Work well for cases where your queries are highly selective---returning a small number of results from a large dataset +-- + ++ +Use Composite Vector indexes when you want to perform searches of documents using both scalars and a vector where the scalar values filter out large portions of the dataset. + ++ +To learn how to use Composite Vector indexes, see xref:vector-index:composite-vector-index.adoc[]. + + +FTS Vector Index:: ++ +-- +* Combines a Couchbase {product-name} Search index with a single vector column +* Allows hybrid searches that combine vector searches with Full-Text Search (FTS) and geospatial searches. +* Can index millions of documents +-- + ++ +Use this index type when you need to perform hybrid searches that combine vectors with full-text or geospatial searches. + ++ +To learn how to use FTS Vector indexes, see xref:vector-search:vector-search.adoc[]. + +== Choosing the Right Index Type + +When choosing which type of index to use, you must consider: + +* The size of your dataset. +* Whether you need to perform hybrid searches that combine scalar value or text searches along with the vector search. +* The performance requirements of your application. + +The following table summarizes the differences between the three types of vector indexes: + + +[%autowidth] +|=== +| | Hyperscale Vector Index | Composite Vector Index | FTS Vector Index + +| *First Available in Version* +| 8.0 +| 8.0 +| 7.6 + +| *Dataset Size* +| Tens of millions to billions of documents +| Tens of millions to billion +| Tens of millions + +| *Uses* +a| * Pure vector searches +* Content discovery or recommendations +a| +* Searches combining vector and scalar values where scalar values are less selective (20% or less) +* Searches where scalars should exclude vectors, such as compliance uses +a| +* Hybrid searches combining vector and keywords or geospatial + +| *Strengths* +a| * High performance for pure vector searches +* Higher accuracy at lower quantizations (fewer bits per vector) +* Low memory footprint +* Lowest TCO for huge datasets +* Best option for concurrent updates and searches +* Scalars and vector values compared at the same time +a| +* Scalar values pre-filter data to reduce the scope of vector searches +* Efficient when scalar values have low selectivity (exclude less than 20% of dataset) +* Can restrict searches based on scalars for use cases such as compliance +* Based on familiar Global Secondary Indexes (GSI) +a| +* Combines semantic and Full-Text Search and geospatial search in a single pass +* Uses familiar Search indexes + +| *Limitations* +a| * Indexing can take longer relative to other index types +a| +* Lower accuracy than Hyperscalar when using lower quantizations (fewer bits per vector) +* Scalar values filter data before vector search, potentially missing relevant results (see <>) +a| +* Not as efficient as Composite Vector indexes if the search includes purely numeric or scalar values +* Does not scale to the extent of the other index types +Limited to approximately 100 million documents + +|=== + +[#scalar-handling] +NOTE: A key difference between Hyperscale and Composite Vector indexes is how they handle scalar values in queries. +Hyperscale Vector indexes compare vectors and scalar values at the same time. +Composite Vector indexes always apply scalar filters first, and only perform vector searches on the results. +This behavior means Composite Index searches can exclude relevant vectors from the search result. +However, it's useful for cases where you must exclude some vectors (even the nearest neighbors) based on scalar values. For example, it's useful when meeting compliance requirements. + +When choosing which type of index to use, consider the following: + +* In most cases, test using a Hyperscale Vector index. +If you find that the performance is not what you need, you can try using one of the other index types. +* If your dataset will not grow beyond 100 million documents and you need to perform hybrid searches that combine vector searches with Full-Text Search or geospatial searches, use an FTS Vector index. + +== Applications for Vector Indexes + +Each type of index works best for different types of applications. +The following sections explain several common applications for each type of vector index. +They also describe the workflow your application follows when using each type of index. + +=== Hyperscale Vector Index Applications + +Hyperscale Vector indexes contain a single vector column. +They excel at indexing huge datasets that can scale into the billions of documents. +They're optimized for pure vector searches, such as content discovery or recommendations. + +The Hyperscale Vector index works well for applications such as: + +Reverse image searches:: +Embedded vectors for images often contain up to thousands of dimensions, which Hyperscale Vector indexes handle better than other index types. + +Chatbot context matching:: +Chatbot context for workflows like retreival-augmented generation (RAG) requires a huge dataset for accurate results. +The large dataset gives the chatbot a depth of knowledge that's not necessary in simpler applications. + +Anomaly detection:: +Anomaly detection applications, such as those used in Internet of Things (IoT) sensor networks, require huge datasets to find deviations from expected patterns. +Hyperscale Vector indexes can handle the large datasets and perform these vector searches fast. + +=== Hyperscale Vector Index Application Workflow + + +After you create a Hyperscale Vector index, your application follows the workflow shown in the following diagram: + +.Application Workflow with Hyperscale Vector Indexes +[plantuml,hyperscale-vector-app-workflow,svg] +.... +include::vector-index:partial$hyperscale-vector-app-workflow.puml[] +.... + +The steps shown in the diagram are: + +. When your application loads data with a complex data field it wants to search semantically, it calls an embedding model to generate a vector for it. +. It sends the data, including the vector, to Couchbase {product-name} for storage. +. The Data Service sends the embedded vector to the Indexing Service for inclusion in the Hyperscale Vector index. +. When your application needs to search for documents related to a complex piece of data, it uses the same embedding model to generate a vector for the search value. +. It sends the vector as part of the query to the Couchbase {product-name} Query Service. +. The Query Service sends a request to the Index Service for an index scan. +. The Index Service performs an index scan in the Hyperscale Vector index to find similar vectors to the search vector. +It sends the results of the scan back to the Query Service. +. The Query Service returns query results to your application. + +See xref:vector-index:hyperscale-vector-index.adoc[] for more information about Hyperscale Vector indexes. + +=== Composite Vector Index Applications +Composite Vector indexes contain a single vector column and one or more scalar columns. +They apply scalar filters before performing a vector similarity search. +This is ideal for workflows where you want to exclude large portions of the dataset to reduce the number of vectors that the vector search has to compare. +Composite Vector indexes work well for applications such as: + +Content Recommendations:: +Viewers often want hard constraints on their searches, such as genre, language, or favorites actors or directors. +Composite Vector indexes can filter using these constraints before performing a vector similarity search on fields such as the plot description or reviews. + +Job Searches:: +Job seekers often want to filter jobs based on location, salary, or job title. +Composite Vector indexes can filter using these constraints before performing a vector similarity search on fields such as the job description or required skills. + +Supply chain management:: +Supply chain management applications often need to query based on product type, supplier, or location. +Vector similarity searches can be added to these searches to find similar demand patterns. + +=== Composite Vector Index Application Workflow + +After you create a Composite Vector index, your application follows the workflow shown in the following diagram: + +.Application Workflow with Composite Vector Indexes +[plantuml,composite-vector-app-workflow,svg] +.... +include::vector-index:partial$composite-vector-app-workflow.puml[] +.... + +The steps shown in the diagram are: + +. When your application loads data with a complex data field it wants to search semantically, it calls an embedding model to generate a vector for it. +. It sends the data, including the vector, to Couchbase {product-name} for storage. +. The Data Service sends the embedded vector along with scalar fields to the Indexing Service for inclusion in the Composite Vector index. +. When your application needs to perform a query that includes a vector, it uses the same embedding model to generate a vector for the search value. +. It sends the vector and scalar values as part of a query to the Couchbase {product-name} Query Service. +. The Query Service requests index scans for the scalar values and a vector similarity search from the Indexing Service. +. The Indexing Service performs an index scan in the Composite Vector index to find documents that match the scalar fields. +It then performs the vector similarity search on the results of the scalar index scan. +Finally, it sends the results of the similarity search back to the Query Service. +. The Query Service returns the query results to your application. + +See xref:vector-index:composite-vector-index.adoc[] for more information about Composite Vector indexes. + +[#fts] +=== FTS Vector Index Applications + +FTS Vector indexes contain a single vector column in addition to a Full-Text Search index. +Some of the applications for FTS Vector indexes include: + +E-Commerce product recommendations:: +E-Commerce applications can use scalar, text, and vector searches to find products that match a customer's search. +For example, a customer could search for red sneakers (text) that cost less than $100 (scalar) and are similar to an uploaded image of a sneaker (vector). + +Travel recommendations:: +Users often want to search for hotels using multiple criteria: + ++ +* Limiting searches to a specific area (for example, "walking distance to the Louvre") which relies on geospatial data. +* Specific keywords for features they want, such as "quiet", "romantic", or "gym", which requires Full-Text Search. +* Semantic searches of descriptions and reviews for searches that do not rely on literal text matches, such as "modern beach resort with chic décor," which requires vector searches. + ++ +An FTS vector index can combine geospatial, keyword, and semantic searches into a single index. + +Real estate searches:: +Real estate applications can use FTS Vector indexes to find properties within a search region and have floor plan similar to an uploaded image. + +=== FTS Vector Index Application Workflow + +After you create an FTS Vector index, your application follows the workflow shown in the following diagram: + +.Application Workflow with FTS Vector Indexes +[plantuml,fts-app-workflow,svg] +.... +include::vector-index:partial$fts-vector-app-workflow.puml[] +.... + +The steps shown in the diagram are: + +. When your application loads data it wants to search semantically, it calls an embedding model to generate a vector for it. +. It sends the data and the vector to Couchbase {product-name} for storage. +. The Data Service sends the embedded vector along with scalar fields to the Search Service for inclusion in the FTS Vector index. +. When your application needs to perform a search that includes a vector, it uses the same embedding model to generate a vector for the search value. +. It sends the search vector and text, geospatial, and other search values as part of a search request to the Couchbase {product-name} Search Service. +. The Search Service performs an index scan in the FTS Vector index to find documents that match the text or geospatial portions of the query. +Then it performs a vector similarity search on the results using the search vector. +. The Search Service returns results to your application. + diff --git a/modules/vector-index/pages/vector-index-best-practices.adoc b/modules/vector-index/pages/vector-index-best-practices.adoc new file mode 100644 index 000000000..91261975a --- /dev/null +++ b/modules/vector-index/pages/vector-index-best-practices.adoc @@ -0,0 +1,273 @@ += Hyperscale and Composite Vector Index Best Practices +:page-topic-type: guide +:page-ui-name: {ui-name} +:page-product-name: {product-name} +:description: When creating and querying Hyperscale and Composite Vector indexes, you have several options to set that can affect the speed and accuracy of your results. +:stem: +:page-toclevels: 3 + +[abstract] +{description} +Couchbase has tested vector indexes to determine how index creation and query settings affect the performance of Hyperscale and Composite Vector indexes. +The following sections describe the results of the testing and recommendations based on these results. + +NOTE: Most of the tests were performed using the Hyperscale Vector index. +However, many of the results also apply to Composite Vector indexes where the two index types share the same settings. + +== Tune Index Creation + +When you create a Hyperscale Vector index, you can set the parameters in the following list. +Each has the potential to affect the performance of creating the index and the speed and accuracy of queries that use the index. +For more information about these parameters: + +* For Composite Vector index, see the xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[WITH Clause] in the xref:n1ql:n1ql-language-reference/createindex.adoc[] page of the {sqlpp} for Query Reference. +* For Hyperscale Vector index, see xref:n1ql:n1ql-language-reference/createvectorindex.adoc#index-with[WITH Clause] in the xref:n1ql:n1ql-language-reference/createvectorindex.adoc[] page of the {sqlpp} for Query Reference. + +[#nlist] +=== nList + +The `nList` setting controls the number of clusters (centroids) in the index. +You set the `nList` by supplying a value after the `IVF` in the `description` parameter when you create your index. +This value affects the accuracy of the index and the speed of queries that use it. +The `nList` setting defaults to the number of vectors in the dataset divided by 1000. + + + +For Composite Vector indexes, tests show that increasing `nList` beyond the default does not affect the build time of the index. +However, it does improve the queries per second (QPS) that the index can handle. +It also lowers the latency of queries that use the index. + +Hyperscale Vector indexes tend to perform better with larger centroids (smaller `nList` values). +This performance gain has to be balanced against tyhe possibility of increased disk I/O due to centroids having more vectors associated with them. + +*Recommendation:* The best practice for the `nList` depend on your vector index type: + +* If you find that your Composite Vector index query throughput and latency is not meeting your needs, you can try rebuilding the index with a larger `nList` value. + +* For Hyperscale Vector indexes, decrease the `nList` value if your working dataset fits into the bucket's memory quota. +You can also try decreasing the `nList` value if you have fast storage such as NVME connected to a high-speed PCIe interface. + +=== train_list + +The `train_list` setting controls the number of vectors that Couchbase {product-name} considers when searching for centroids in the dataset. +You set it using the `train_list` argument in the `WITH` clause when you create your index. +The default value depends on the size of the dataset: + +* If there are less than 10,000 vectors, Couchbase {product-name} samples all of the vectors. +* If there are 10,000 or more vectors, Couchbase {product-name} samples the number of vectors divided by 10 or 10 times the number of centroids, whichever is larger. +Couchbase {product-name} limits the trainlist to a maximum of 1 million vectors. + +Tests show that increasing the `trainlist` improves QPS and reduces latency, but slightly increases memory usage for the index. + +*Recommendation:* if you find that increasing the `nList` does not improve your query performance, you can try increasing the `train_list` value. + +The following example demonstrates how to set the `train_list` value when creating a Hyperscale Vector index: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=train-list] +---- + +=== Partitions + +The number of partitions the index controls how the index is split among logical shards. +This setting affects the scalability, memory distribution, and parallelism of the index. +You set this value using the `PARTITION BY` clause in the `CREATE [VECTOR] INDEX` statement. +See xref:n1ql:n1ql-language-reference/index-partitioning.adoc[] for more information about partitioning indexes. + +Tests show that increasing the number of partitions linearly reduces both the time it takes to build and train the index and index's memory use. +These changes do not affect the QPS or latency of queries that use the index. + +*Recommendation:* if the length of time it takes to build the index or the amount of memory the index uses is a concern, you can try increasing the number of partitions. + +=== Replicas +The number of replicas you set affects the fault tolerance, query throughput, and memory footprint of the index. +You set this value using the `num_replicas` key in the `WITH` clause when you create or alter your index. + +Tests show that increasing the number of replicas learly increases the QPS and linerly reduces the latency of queries that use the index. +However, it also linearly increased the memory footprint of the index. +Adding replicas does not affect the time it takes to build the index. + +*Recommendation:* if you find that your query throughput or latency is not meeting your needs, you can try increasing the number of replicas for the index if you can afford the additional memory usage. + +[#quantization] +=== Quantization +Vector indexes always use quantization to compress the vectors they index. +Couchbase {product-name} supports two quantization methods: xref:vector-index:vectors-and-indexes-overview.adoc#sq[scalar quantization (SQ)] and xref:vector-index:vectors-and-indexes-overview.adoc#pq[product quantization (PQ)]. +You set the quantization method using the `description` parameter in the `WITH` clause when you create your index. + +Couchbase tested different quantization settings using datasets that differed in size and number of dimensions. +The results of these tests appear in the following table: + +[%autowidth, options="header"] +|=== +| Dataset | Index Type | Quantization Setting | Build Time | Memory Use | Recall Accuracy | QPS | Latency + +| 100 million 128 dimensions +| Hyperscale +| SQ8 +| Lowest +| Highest +| Best +| Best +| Best + +| 5 million, 1536 dimensions +| Composite +| PQ32x8 +| Slightly higher than SQ8 +| 75% less than SQ8 +| lower than SQ8 +| Lower than SQ8 +| Lower than SQ8 + +|=== + + +NOTE: Couchbase also tested Hyperscale Vector indexes containing 1 billion vectors with 128 dimensions using SQ4 quantization. +The results showed acceptable recall accuracy and similar performance to SQ8 on smaller datasets. + + +*Recommendations:* + +* SQ8 provides the best balance between memory use and recall for lower dimensional datasets. +* If you have a low-dimensional dataset that's in the range of a billion vectors, consider using SQ4 quantization. +* Use PQ for higher-dimensional datasets if you want to reduce memory use and are willing to accept less accurate recall, decreased QPS, and increased latency. + + +// Similarity Function:: +// Sets the function the index uses when determining the similarity of vectors when identifying centroids. +// Couchbase {product-name} supports two similarity +// +// Holding off on simlarity because the best practice doc is mute on it, also lacks testing for dot? + + +== Tune Queries + +When querying a Hyperscale Vector index, you can set several parameters in the `APPROX_VECTOR_DISTANCE` function that affect the performance of the query. +The following list describes the parameters you can set in the function: + +[#nprobes] +=== nProbes + +`nProbes` sets the number of centroids in the Hyperscale Vector index to search for similar vectors. +You optionally set this value as the fourth parameter in the `APPROX_VECTOR_DISTANCE` function call in your query. +The default value for this value is 1, which only searches for similar vectors in the centroid that's closest to the search vector. + +Tests show that increasing `nProbes` beyond the default improves the accuracy of results non-linearly (larger values show diminishing improvements). +However, it caused a linear decrease in QPS and increase in latency. + +*Recommendation:* if you find that your query recall is not meeting your needs, you can try increasing the `nProbes` value. +However, increasing this value reduces QPS and increases latency. + +[#reranking] +=== Reranking + +A query can perform a reranking phase after a vector search. +This reranking phase reorders the results by comparing the full vector values of the results to the search vector. +See xref:vector-index:hyperscale-reranking.adoc[] for more information about how reranking works. +This setting is off by default. +You can enable it by passing `TRUE` as the fifth parameter in the `APPROX_VECTOR_DISTANCE` function call in your query. + +Testing shows that enabling reranking improves the accuracy of recall in limited cases and decreases QPS. + +*Recommendation:* if you find recall accuracy is not meeting your needs and you're using SQ4 or PQ128x8 or below quantization, try enabling reranking. +You must have your index set to persist the full vector value, which increases memory use. + +If you do not enable reranking, consider preventing the persistence of the full vector value in the index to reduce memory and disk use. +See xref:vector-index:hyperscale-reranking.adoc#prevent-vector-persistence[Preventing Vector Persistence] to learn how to turn off full vector persistence. + +[#recall-accuracy] +== Determine Recall Rate + +To understand how well your index and queries are performing, you can determine the recall of your queries. +To do this, compare the results of running a query using the `APPROX_VECTOR_DISTANCE` function to the results of running the same query using the `VECTOR_DISTANCE` function. +The `VECTOR_DISTANCE` function performs a brute-force full vector comparison, so it returns the most accurate results. +Based on the results of this comparison, you can decide whether you need to adjust your index or query settings to improve recall accuracy. + +IMPORTANT: The `VECTOR_DISTANCE` function is expensive to run because it compares all vectors in the dataset. +You should only use it on a testing system with a smaller dataset. + +For example, suppose you run the following query against a Hyperscale Vector index: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=untuned-query] +---- + +The results of running this query against the RGB sample dataset are: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=untuned-query-results] +---- + +You can then run the same query using the `VECTOR_DISTANCE` function to get the most accurate results. +The following example uses the `VECTOR_DISTANCE` function instead of the `APPROX_VECTOR_DISTANCE` function: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=exact-query] +---- + +Running the query returns the following results: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=exact-query-results] +---- + +You can see the results of the two queries share few common results. +You can perform a more complex query that determines the common results between the two queries and calculates the recall rate. +The following example executes both of the previous queries as subqueries, then finds the intersection of the results. +It calculates the recall rate based on the 10 results the queries return (called the recall@10 due to the sample size): + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=recall-rate-query] +---- + +The result of running the recall rate query is: + +---- +include::vector-index:example$hyperscale-idx-data.json[tag=recall-rate-results] +---- + +The recall rate shown in the example is 30%, which indicates poor results. + +A low recall rate means you need to perform some tuning to improve the recall accuracy of the query or the index. +One way to improve the recall accuracy is to increase the `nProbes` value in the `APPROX_VECTOR_DISTANCE` function call. +It increases the number of centroids the query searches for similar vectors. +See <> for more information about this setting. +The following example shows how to increase this value to `4` in the approximate vector query: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=tuned-query] +---- + +The results of running the tuned query are: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=tuned-query-results] +---- + +The results look more similar to the results of the exact query. +To verify, you can re-run the recall rate query using the new `nProbes` value. +The following example shows the recall rate query with the `APPROX_VECTOR_DISTANCE` function call updated with the new `nProbes` value: + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=recall-rate-tuned] +---- + +The result of this update are: + +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=recall-rate-tuned-results] +---- + +The new recall rate is 100%, which means the result of the change makes the `APPROX_VECTOR_DISTANCE` function as accurate as the `VECTOR_DISTANCE` function. +This means the query calling `APPROX_VECTOR_DISTANCE` is now returning the most accurate results possible. diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc new file mode 100644 index 000000000..96cdc6ab4 --- /dev/null +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -0,0 +1,411 @@ += Vectors and Vector Indexes +:page-topic-type: concept +:page-ui-name: {ui-name} +:stem: latexmath +:page-product-name: {product-name} +:description: This page is a high-level overview of vectors and how they work in indexes. +:page-toclevels: 3 + +[abstract] +{description} +Couchbase {product-name} supports several types of vector indexes. +These indexes let you add similarity searches to your applications without relying on external services. +This page provides an overview of vectors. +If you're already familiar with vectors, you can skip to the next page, xref:vector-index:use-vector-indexes.adoc[] for information about how to use vector indexes in your application. + +== About Vectors + +Vectors are a numerical representation of complex unstructured data such as text, images, or audio. +They distill this complex data into an array of floating-point values called dimensions. +The dimensions in vectors capture features of the data in a way that makes them easy to compare mathematically. +Similar data, such as text about the same topic or images of a similar subject, have similar vectors. +Similar vectors are close together the multi-dimensional space formed by all of the vectors in the dataset. +Vectors for dissimilar data (articles discussing two different topics for example) have vectors that are further apart in this multi-dimensional space. + +=== Finding Semantically Similar Text Data + +By comparing two vectors, you can find the similarity between the two pieces of data they represent. +This similarity goes beyond just finding parts of the data that's identical (for example, finding similar words in two pieces of text). +The vectors represent features such as the meaning of text rather than just superficial similarities. +When two pieces of data have similar vectors, they have semantically related (having similar meanings or subjects). + +For example, suppose you have three text articles. +The first is about feral cats, the second about domestic cats, and the third is about the UNIX/Linux `cat` command. +A text search for the term "cat" could return all three articles at the top of its search results due to their frequent use of the search term. +However, that does not mean that the articles are all semantically related. +By generating vectors for the articles and comparing them, you can determine any semantic relationship between them. + +Vectors can be similar in a variety of ways. +They may: + +* Point in similar directions. +* Be close to each other in the vector space made up of all the dimensions in the vectors. +* Have a similar magnitude (length). + +image::vector-space-example.svg["Three-dimensional plot showing two vectors that are close by and parallel and a third vector that's away and points in another direction"] + +Because the first two articles are about cats, their vectors point in a similar direction and are in a similar location in space. +The third article, despite using the word "cat" as frequently as the two other articles, has a vector that has significant differences from the other two. + +NOTE: Some diagrams in this document (and in other discussions available on the web) show vectors in three dimensions. +These diagrams are a simplification. +The vectors used in AI applications have hundreds to thousands of dimensions. +They're easy for computers to handle but are rather difficult for humans to visualize. +In addition, the vector dimension values in the diagrams show only 4 decimal places to conserve space. +The floating point dimensional values of actual vectors often use 6 or 7 decimal places. +When viewing these diagrams, remember that they only scratch the surface of the data encoded in a vector. + +=== Using Vectors to Find Similar Complex Data + +Vectors let you search for similarity in data that's hard to search using traditional techniques. +Image data, for example, is just a string of raw binary values. +Matching portions of this data within two image files does not mean they're of the same subject, or even have any resemblance. +Also, comparing megabytes of raw image data is computationally expensive. +Generating vectors of the images distills features of the image into a smaller, more manageable amount of data. +It also emphasizes features of the images that viewers find important, such as shapes and textures. +Comparing the vectors is more manageable and actually results in finding similar images. + +== Embedding Vectors + +Embedding is the process of generating vectors that represent a piece of complex unstructured data. +You use an embedding model that's specific to the data's type to generate a vector to represent it. + +For example, to generate vectors from text, you can use a use models such as https://en.wikipedia.org/wiki/Word2vec[Word2Vec^], https://en.wikipedia.org/wiki/GloVe[Global Vectors for Word Representation (GloVe)^], or https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2[all-MiniLM-L6-v2^]. +These models take into account the context around each potion of the text when generating a vector. +This context is what captures the semantic meaning of the text and embeds it in the vector's dimensions. + +To generate vectors from images, you use different embedding models such as a https://en.wikipedia.org/wiki/Residual_neural_network[Residual Neural Network (ResNet)^]. +You can embed audio using a model such as OpenL3. + +image::embedding-vectors.svg["Diagram showing text, image, and audio data being transformed by embedding models into a string of floating point numbers that represent vectors."] + +=== How Embedding Models Work + +Behind the scenes, embedding models use neural networks that mimic how the brain recognizes patterns. +The neural nets distill the complex data into an array of floating point values. +Beyond choosing an embedding model that's appropriate for your data, you generally do not worry about how the model transforms data into a vector. + +=== Embedding Model Compatibility + +You can only compare the similarity of vectors generated by the same embedding model. +For example, you cannot find the similarity of a vector generated by Word2Vec and one generated by GloVe. +You also cannot compare a vector for a piece of text generated by Word2Vec with the vector for an image generated by ResNet. + +=== Using Embedding Models with Couchbase {product-name} + +ifeval::['{product-name}' == 'Server'] +Couchbase {product-name} does not implement any embedding models. +You must use external embedding models to generate them and then store the resulting vectors in your documents. +A common method of embedding vectors in your database is to call an https://openai.com/index/introducing-text-and-code-embeddings/[OpenAI Embedding API^] to generate vectors for your data. +You then store the vector as an attribute in your document. + +Another option is to use Couchbase Capella along with Capella's AI Services which integrates several embedding models. +See https://www.couchbase.com/products/ai-services/[Capella AI Services] for more information. +endif::[] + +ifeval::['{product-name}' != 'Server'] +You can use external embedding models or https://www.couchbase.com/products/ai-services/[Capella AI Services] to generate vector embeddings. + +endif::[] + +[#vector_similarity] +== Vector Similarity Metrics + +Once you have embedded vectors in your database, you find documents with a similar meaning by finding similar vectors. +You use metrics to (also referred to as distance functions) to find similar vectors. +When you create an index or perform a vector search, you must specify which metric to use to compare vectors. +Each metric works best for certain applications and types of data. + +Couchbase {product-name} supports four metrics: + +[#euclidean] +=== Euclidean Distance + +Euclidean Distance (also known as L2) calculates the geometric distance between two vectors by finding the distance between the individual dimensions in the vectors. +This method is most sensitive to the distance between the vectors in space, rather than their alignment. +It's also sensitive to the scale of the vectors, where the length of one vector verses the other affects the relationship between the vectors. +Use this method when the actual distance of the vectors and their magnitudes are important. +This method is useful if the distance between vectors represents a real-world value. + +image::euclidean-distance-example.svg["Three-dimensional plot showing two vectors with points along each vector joined by dotted lines, indicating the summing of corresponding points."] + +Euclidean Distance is useful for tasks such as: + +* 3D motion capture where you're detecting similar positions or trajectories of joints, objects, where finding real-world values for thresholds is important. +* Geographic or spatial searches where you care about exact (and often real-world) distances. +* Other cases where you use the results as filters in calculations that require the actual distance between the vectors. + +NOTE: Only Hyperscale Vector and Composite Vector indexes support this metric. +FTS Vector indexes do not support it. + +[#euclidean-squared] +=== Euclidean Squared Distance + + +Euclidean Squared Distance (also known as L2 Squared or L2^2^) is similar to Euclidean Distance, but it does not take the square root of the sum distances between the vectors: + + +Euclidean Distance Formula:: + latexmath:[L2(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}] + + +Euclidean Squared Distance Formula:: +latexmath:[L2^2(x, y) = \sum_{i=1}^n (x_i - y_i)^2] + + +Because it does not take the square root of the sums, Euclidean Squared Distance is faster to calculate than Euclidean Distance. +However, it does not represent the actual distance between the vectors. +The results of a vector search using L2 Squared as a metric always returns the same rankings that an L2 search returns. +In cases where the dimensions of the vectors represent real-world values, L2 is more intuitive to use because it returns the actual distance between the vectors. + +Use this method when you need higher performance than Euclidean Distance. +It's better in cases when comparing literal distances is less important than performance and where having the ranking of search results is sufficient. + +For example: + +* Image recognition tasks where real-world distances between vectors are not a factor, including: +** Searching for products that are visually similar to an image uploaded by a shopper. +** Facial recognition. +* Audio recognition tasks such as identifying who's speaking in a recording. +* Locating similar genomic and biological sequences in a dataset, such as related gene profiles. + +NOTE: Only Hyperscale Vector and Composite Vector indexes support this metric. +FTS Vector indexes do not support it. + +[#dot] +=== Dot Product + +This metric finds related vectors by comparing the magnitude (length) and alignment of the vectors. +Here, the proximity of the vectors in space is less important than whether they point in a similar direction and have the a similar magnitude. +Vectors that point in similar directions (have a low angle between them) and have similar magnitude are strongly associated with each other. +This method uses the similarity of the vectors' magnitudes to rank their relation. + +image::dot-product-example.svg["Three-dimensional plot showing two vectors labeled with their magnitudes and the angle between them labeled with the theta symbol."] + +Use this method for tasks where ranking confidence is key. +The magnitude of the vectors is important when determining the strength of the relationship. +For example: + +* Recommending related products based on a shopper's previous purchases. +* Personalizing a music service's user home page based on the user's likes and dislikes of artists and songs. +* Targeting ads based on a user's interests and previous interactions with the service. + +[#cosine] +=== Cosine Similarity + +This metric is similar to the dot product. +However, it normalizes the vectors (making them the same length) during comparison. +Normalization means their magnitudes are not taken into account, just their alignment. +This normalization makes this method better for comparing textual data because it's less sensitive to the length of the data. +The magnitude of a vector generated by some text embedding models depend on the length of the source text. +Normalizing vector magnitudes emphasizes the semantic meaning when performing comparisons. +Therefore, Cosine Similarity can find the semantic relationship between a short question and a long article that's relevant to answering it. + +image::cosine-similarity-example.svg["Three-dimensional plot showing two vectors that are of equal length, with the angle between them labeled as theta."] + +Use this method when you're performing searches that rely on semantic meaning, such as: + +* Find relevant articles to answer a question posed by a user. +* Locate code snippets based on a user's question about how to perform a task. +* Organize scanned documents in a document management system based on their semantic meaning. + + +[#index-algorithms] +== Index Formats + +Couchbase {product-name} supports two formats that the Vector indexes use when storing their data. +These formats control how the index stores the vectors. +Couchbase {product-name} automatically chooses which algorithm to use, based on the type of the index and the size of the dataset. +However, you can set parameters when you create the index that affect how the algorithm organizes data. + +=== Flat Index +This algorithm just stores the full vector value in the index without performing any sort of optimization. +Searches using this index use a brute-force method to find similar vectors. +Adding new vectors to a flat index is fast and the index does not need training. +It also offers high precision because search compares the full vector values. +However, searching a flat index is inefficient. +The search must compare every vector in the index to find matches. +You should only use it for small data sets or for testing. + +NOTE: FTS Vector indexes use a flat index when indexing datasets with 1000 or fewer vectors. +Hyperscale Vector and Composite Vector indexes only support the next algorithm, IVF. + +[#IVF] +=== Inverted File (IVF) +This algorithm partitions the vector space to limit the number of vectors that a search must compare. +An IVF index trains itself during creation using a set of parameters you pass to it: + +. It samples vectors in the dataset to locate clusters of similar vectors. +. For each cluster it finds, it chooses a representative vector (called a centroid). +. It creates a data structure called an inverted list that associates all vectors with their closest centroid. + +image::ivf-diagram-with-vectors.svg["A plot showing clusters of points in a 3D graph labelled and assigned to centroid vectors. The centroids then point to multiple vectors in an inverted list."] + +When you search using an IVF index, it first locates the centroids that are most relevant to the vector value you're searching for. +It then searches just the vectors associated with those centroids in the inverted list. +By limiting the number of vector comparisons to just the vectors close to the relevant centroids, IVF makes vector search faster. + +A drawback of this method is the possibility that the search could miss some relevant vectors. +A search can miss vectors if they're associated with a centroid that's not relevant to the search vector. +This risk increases as you add and delete data after you train the index. +The centroids chosen during the initial training may no longer accurately represent clusters in current dataset. +See <<#index-training>> for more information about index accuracy. + +Hyperscale Vector and Composite Vector indexes always use IVF as the basis of their indexes. +In addition, they use a Hierarchical Navigable Small World (HNSW) graph to index the IVF's centroids. +This graph connects related centroids together so that a similarity search can quickly traverse the graph to find the centroids that are closest to the search vector. +Hyperscale also adds other proprietary optimizations that allow it to scale to billions of vectors. + + +FTS Vector indexes automatically uses IVF when the indexing datasets larger than 1000 vectors. + +[#quantization] +== Quantization + +Quantization simplifies vector data so it consumes less space in memory and on disk. +Reducing the amount of data in a vector also makes vector comparison faster. +However, quantization does reduce the accuracy of a vector. +It's similar to using a lossy image compression format, such as JPEG, on an picture to reduce its data size. +It trades off some detail and accuracy for a smaller, more manageable data size. + +Unlike the indexing algorithms, you choose the quantization method you want Couchbase {product-name} to use when you create a Hyperscale Vector or Composite Vector index. + +Couchbase {product-name} supports two types of quantization: + +[#pq] +=== Product Quantization (PQ) +Product Quantization simplifies vectors by breaking their dimensions into chunks called subspaces. +It then replaces each set of dimensions within the with a single value that represents the nearest centroid in the subspace. +This method reduces the size of the vector by replacing the original floating point values with smaller integers that represent the centroid. + +PQ processes vectors by following these steps: + +. It groups the vector's dimensions into chunks called subspaces. +For example, suppose the vectors contain 1024 dimensions. +Then PQ may break the vectors into 128 subspaces, each containing 8 dimensions. +. It finds groups of centroids in each subspace and adds them to a data structure called a codebook. +The codebook assigns each centroid an index number. +. PQ then reduces the size of the vectors by replacing each subspace's dimensions with the index of the closest centroid in the codebook. + + +image::pq-diagram.svg["Three-dimensional plot showing two vectors that are of equal length, with the angle between them labeled as theta."] + +PQ could quantize the vector in the previous example from 1024 64-bit floating point values to 128 8 bit or 16 bit integer values. +This data size reduction improves performance because integer operations are less computationally expensive than floating point operations. +It also reduces memory use because each vector requires less data to store (for example, from 64KB to 128 bytes). + +A search of the PQ index performs the same steps on the vector you're searching for: + +. It breaks the search vector into subspaces and quantizes it using the codebook. +. It then locates closest centroids to the quantized query vector. +. It searches the vectors related to the matching centroids for vectors that relate to the search vector. + +PQ sacrifices some accuracy because it compares quantized vectors instead of their original raw values. +The process of quantization adds additional processing requirements to training. +This overhead makes training a PQ index more computationally expensive than the other methods. +However, PQ reduces the amount of memory and processing time necessary when searching for related vectors in a large dataset. + + +Use PQ quantization when: + +* Your vectors contain a large number of dimensions. +* You're willing to trade higher processing requirements during training for smaller memory use and less CPU time during searches. +* Your dataset is large (millions to billions of vectors). + + +Hyoerscale Vector and Composite Vector indexes support PQ quantization. +FTS Vector indexes do not support it. + +[#sq] +=== Scalar Quantization (SQ) +Scalar Quantization is a simpler form of quantization than PQ. +Instead of breaking the vector into subspaces, it quantizes each dimension of the vector independently. +Its quantized vectors are larger, but are a more precise represenation than than those quantized using PQ. + + +SQ follows these steps to process vectors: + +. SQ determines the maximum and minimum values for each dimension in the dataset. +. It then partitions each dimension in the vector into equal segments (called bins) over the range of the dimension's values. +For example, in the diagram, the first dimension's values range from 0 to 1, while the second dimension's range from 0.1 to 0.9. +This means the second dimension's bins will only cover the range from 0.1 to 0.9. +. SQ assigns each bin an index value that's from 4 to 8 bits in length. +. It find a centroid within the range associated with the bin. +It saves the centroid as a 16 or 32 bit floating point number. +. SQ then quantizes the vectors by replacing their dimensional values with the index value of the bin the dimensional value falls into. + +image::sq-diagram.svg["Diagram showing each floating point dimension of a vector being converted to an 8-bit integer by looking up which bucket it falls into."] + +This quantization reduces the dimensions from 32 or 64 bit floating point values to 8 or less bit integers, reducing the memory needed for search. +It also makes search faster because integer operations are computationally less expensive than floating point operations. + +A search on an SQ index reassembles vectors before comparing them. +For each of the vector's dimensions, SQ replaces the integer bin number with the floating point centroid associated with the bin. +This recreation is an approximation of the original vector, because each dimension in the vector is the bin's centroid value instead of the original dimensional value. + +Because this method quantizes the vectors, it loses precision. +It's less precise than the PQ method (which also quantizes vectors) because it assumes that each dimension can be evenly divided. +Its accuracy suffers if your data has clusters. +It's best suited for data that's more evenly distributed and does not have high correlations. +For example, SQ may be a good fit for an IoT sensor dataset where the measured values (such as temperature) are evenly distributed over the range of measurements. + +SQ has a lower training overhead compared to PQ because it does not search for clusters of vectors. +Its training just determines the range of values for each dimension. + +Use SQ if you do not want the processing overhead of training a PQ index. +You can also use it if you have a smaller dataset (hundreds of thousands to millions of vectors). + +All three types of vector indexes support SQ quantization. + + +=== Choosing a Quantization Method + +You do not choose a quantization method for FTS vector indexes. +Instead, they automatically choose whether to use quantization: + +* FTS Vector indexes do not use quantization for datasets smaller than 10000 vectors. +* FTS Vector indexes automatically use 8-bit SQ quantization for datasets with 10000 vectors or larger. + +When creating a Hyperscale Vector or Composite Index, you choose which quantization method to use when creating the index. +When deciding, consider the following: + +* Use SQ when you want higher accuracy than PQ, at the cost of lower compression and therefore more memory use. +* Use PQ when you're willing to trade some accuracy for higher compression and less memory use. +PQ is a good choice for larger datasets (millions to billions of vectors) where you want to reduce memory use and improve search performance. + +You should also consider the potential need to retrain the index if your dataset changes over time. +See the following section for more information about index training. + +No matter which quantization you choose, you should perform tests to verify it meets your needs. +See xref:vector-index:vector-index-best-practices.adoc[] for more information about choosing quantization for your Hyperscale Vector and Composite Vector indexes. + +[#index-training] +== The Importance of Index Training + +The IVF indexing algorithm and the PQ ans SQ quantizations rely on training the index on existing data. +Both PQ and IVF locate centroids that represent clusters of vectors in vector space. +The SQ quantization samples vectors to determine the range of values in each dimension. +These training techniques reflect the content of dataset at the time you create the index. +For this training to give you accurate search results, the data in your dataset must represent the full range of data you expect to search. + +If the dataset is not representative, the centroids that the PQ quantization or IVF indexing method selects may not accurately represent clusters of data in the dataset. +Having accurate centroids are key to these indexing methods returning accurate results. +For indexes using SQ quantization, the range of values in the dimensions may not accurately represent the data in the dataset. +If one or more dimensional values fall outside the range that SQ assign bins to, they get assigned closest bin which may not properly represent the value. +As your dataset changes, these inaccuracies can build, skewing results. + +Over time, may find your vector search's recall (percentage of the nearest neighbors of the search vector returned by a query) decreases. +Searches for similar vectors may miss relevant results or may rank less-related vectors higher than more relevant results. +These inaccuracies can occur because the data in the dataset changes over time as you add and remove documents. +The centroids identified by PQ and IVF may no longer adequately reflect the data in your database. +New clusters of vectors may have developed, and old ones may have dissipated. +For indexes using SQ quantization, the range of values in the dimensions may have changed. + +To resolve these accuracy issues, you can retrain your indexes when you notice poor recall. +You can also choose to retrain indexes periodically or after you make significant changes to your dataset. +To retrain an index, you create a new index with the same (or tweaked) settings as the existing index, but with a different name. +After Couchbase {product-name} builds and trains the new index, you can drop the old index. + +You should consider the need to retrain your indexes when choosing which quantization to use. +For example, the PQ quantization requires more resources to train than SQ. +If your dataset evolves rapidly, you may choose to not use PQ because you'll need to perform more frequent retraining. diff --git a/modules/vector-index/partials/ai-app-workflow.puml b/modules/vector-index/partials/ai-app-workflow.puml new file mode 100644 index 000000000..3d8d54dae --- /dev/null +++ b/modules/vector-index/partials/ai-app-workflow.puml @@ -0,0 +1,96 @@ +@startuml ai-app-workflow + +!pragma layout smetana +!include +!include +!include +!include +!include +!include +!include +!include +!include +sprite Couchbase + + + +'title: Application Workflow with Vector Indexes + +skinparam defaultTextAlignment center + +skinparam linetype ortho + +top to bottom direction + + + frame "Your Application" as APP { + card DL [ + Data + Loading + ] + card EM [ + Embedding + Models + ] + card SE [ + Search & Query Logic + ] + + DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData + EM --> DL : Vectors + SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData + EM --> SE : Vectors + + } + + frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { + database DS [ + <$Couchbase{scale=0.15,color=red}> + .. + Data + .. + Service + .. + ] + rectangle " <$Couchbase{scale=0.15}> Index Service" as IS { + card GSI [ + GSI with + Vector + Column + ] + card VI [ + Vector + Index + ] + } + rectangle " <$Couchbase{scale=0.15}> Search Service" as SSERV { + card SI [ + Search + Index + w/ Vector + ] + } + + rectangle "<$Couchbase{scale=0.15}> Query Service" as QS { + + } + + } + + +DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors +DS --> GSI : Data &\nVectors +DS --> VI : Data &\nVectors +DS --> SI : <$ma_numeric_3_box{scale=0.4}>Data &\nVectors + +QS <--> IS :Index\nScans + + +SE ----> QS : <$ma_numeric_5_box{scale=0.4}>Queries +SE --------> SSERV : <$ma_numeric_5_box{scale=0.4}>Searches + +QS ----> SE :<$ma_numeric_6_box{scale=0.4}> Results +SSERV ---------> SE :<$ma_numeric_6_box{scale=0.4}> Results + +@enduml diff --git a/modules/vector-index/partials/composite-vector-app-workflow.puml b/modules/vector-index/partials/composite-vector-app-workflow.puml new file mode 100644 index 000000000..e64ef1ce6 --- /dev/null +++ b/modules/vector-index/partials/composite-vector-app-workflow.puml @@ -0,0 +1,83 @@ +@startuml ai-app-workflow + +!pragma layout smetana +!include +!include +!include +!include +!include +!include +!include +!include +!include +sprite Couchbase + + + +'title: Application Workflow with Composite Vector Indexes + +skinparam defaultTextAlignment center + +skinparam linetype ortho + +top to bottom direction + + + frame "Your Application" as APP { + card DL [ + Data + Loading + ] + card EM [ + Embedding + Models + ] + card SE [ + Search & Query Logic + ] + + DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData + EM --> DL : Vectors + SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData + EM --> SE : Vectors + + } + + frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { + database DS [ + <$Couchbase{scale=0.15,color=red}> + .. + Data + .. + Service + .. + ] + rectangle " <$Couchbase{scale=0.15}> Index Service" as IS { + card COMPOSITE [ + Composite + Vector + Index + ] + } + + rectangle "<$Couchbase{scale=0.15}> Query Service" as QS { + + } + + } + + +DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors +DS --> COMPOSITE : <$ma_numeric_3_box{scale=0.4}> Scalars &\nVectors + +QS --> COMPOSITE : <$ma_numeric_6_box{scale=0.4}> Scan\nRequest + +QS <-- COMPOSITE : <$ma_numeric_7_box{scale=0.4}> Index Scan\nResults + +SE ----> QS : <$ma_numeric_5_box{scale=0.4}> Queries + +QS ----> SE :<$ma_numeric_8_box{scale=0.4}> Query Results + + +@enduml diff --git a/modules/vector-index/partials/distance-metric-list.adoc b/modules/vector-index/partials/distance-metric-list.adoc new file mode 100644 index 000000000..55283c226 --- /dev/null +++ b/modules/vector-index/partials/distance-metric-list.adoc @@ -0,0 +1,8 @@ +Couchbase {product-name} uses the following strings to represent the distance metrics: ++ +-- +** `COSINE`: xref:vector-index:vectors-and-indexes-overview.adoc#cosine[Cosine Similarity] +** `DOT`: xref:vector-index:vectors-and-indexes-overview.adoc#dot[Dot Product] +** `L2` or `EUCLIDEAN`: xref:vector-index:vectors-and-indexes-overview.adoc#euclidean[Euclidean Distance] +** `L2_SQUARED` or `EUCLIDEAN_SQUARED`: xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean Squared Distance] +-- diff --git a/modules/vector-index/partials/fts-vector-app-workflow.puml b/modules/vector-index/partials/fts-vector-app-workflow.puml new file mode 100644 index 000000000..2e5a3074d --- /dev/null +++ b/modules/vector-index/partials/fts-vector-app-workflow.puml @@ -0,0 +1,74 @@ +@startuml ai-app-workflow + +!pragma layout smetana +!include +!include +!include +!include +!include +!include +!include +!include +!include +sprite Couchbase + + + +'title: Application Workflow with FTS Vector Indexes + +skinparam defaultTextAlignment center + +skinparam linetype ortho + +top to bottom direction + + + frame "Your Application" as APP { + card DL [ + Data + Loading + ] + card EM [ + Embedding + Models + ] + card SE [ + Search & Query Logic + ] + + DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData + EM -d-> DL : Vectors + SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData + EM --> SE : Vectors + + } + + frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { + database DS [ + <$Couchbase{scale=0.15,color=red}> + .. + Data + .. + Service + .. + ] + + rectangle " <$Couchbase{scale=0.15}> Search Service" as SSERV { + card SI [ + FTS Vector + Index + ] + } + + } + + +DS ----> SI : Text &\nVectors +DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors + +SE ----> SSERV : <$ma_numeric_5_box{scale=0.4}>Searches + +SSERV ----> SE :<$ma_numeric_6_box{scale=0.4}> Results + +@enduml diff --git a/modules/vector-index/partials/hyperscale-vector-app-workflow.puml b/modules/vector-index/partials/hyperscale-vector-app-workflow.puml new file mode 100644 index 000000000..59bf46d23 --- /dev/null +++ b/modules/vector-index/partials/hyperscale-vector-app-workflow.puml @@ -0,0 +1,82 @@ +@startuml ai-app-workflow + +!pragma layout smetana +!include +!include +!include +!include +!include +!include +!include +!include +!include +sprite Couchbase + + + +'title: Application Workflow with Hyperscale Vector Indexes + +skinparam defaultTextAlignment center + +skinparam linetype ortho + +top to bottom direction + + + frame "Your Application" as APP { + card DL [ + Data + Loading + ] + card EM [ + Embedding + Models + ] + card SE [ + Search & Query Logic + ] + + DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData + EM --> DL : Vectors + SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData + EM --> SE : Vectors + + } + + frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { + database DS [ + <$Couchbase{scale=0.15,color=red}> + .. + Data + .. + Service + .. + ] + rectangle " <$Couchbase{scale=0.15}> Index Service" as IS { + card HVI [ + Hyperscale + Vector + Index + ] + } + + rectangle "<$Couchbase{scale=0.15}> Query Service" as QS { + + } + + } + + +DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors +DS --> HVI : <$ma_numeric_3_box{scale=0.4}> Vectors + +QS --> HVI : <$ma_numeric_6_box{scale=0.4}> Scan\nRequest +QS <-- HVI : <$ma_numeric_7_box{scale=0.4}> Index\nScan\nResult + +SE ----> QS : <$ma_numeric_5_box{scale=0.4}>Queries + +QS ----> SE :<$ma_numeric_8_box{scale=0.4}> Query\nResults + + +@enduml diff --git a/modules/vector-index/partials/index-algorithm-settings.adoc b/modules/vector-index/partials/index-algorithm-settings.adoc new file mode 100644 index 000000000..3198ae3ea --- /dev/null +++ b/modules/vector-index/partials/index-algorithm-settings.adoc @@ -0,0 +1,156 @@ +[#algo_settings] +=== Quantization and Centroid settings + +When creating an index that includes a vector field, you choose settings that affect how the index processes vectors. +The parameter named `description` is the primary setting that controls the quantization and the number of centroids Couchbase {product-name} to create the index. +Using it, you control how the index subdivides the dataset to improve performance and how it quantizes vectors to reduce memory and processing requirements. + +The `description` parameter is a string in the following format: + +[source,sqlpp] +---- +'IVF[],{PQ|SQ}' +---- + +The following sections describe the settings for centroids and quantization. + +==== Number of Centroids + +{index-name} uses several algorithms to organize its data to improve its performance. +One of these algorithms, xref:vector-index:use-vector-indexes.adoc#IVF[Inverted File (IVF)], has a setting you can adjust to control how it subdivides the dataset. +The other algorithms that {index-name} uses do not have settings you can adjust. + +The key setting for IVF is the number of centroids it allocates for the index. +This setting controls how large the centroids are. +Larger centroids have more vectors associated with them. + +You can have Couchbase {product-name} choose a number of centroids for you by not providing a value after the `IVF` in your `description` parameter. +It sets the number of centroids to the number of vectors in the dataset divided by 1000. + +You can manually set the number of centroids for the index by adding an integer value after the `IVF` in the `description` parameter. +The number of centroids you set manually must be less than the number of vectors in the dataset. + +ifeval::['{index-name}' == 'Composite Vector index'] +The number of centroids affects the performance of your {index-name} index in two ways: + +* If the index has fewer centroids, each centroid is larger (has more vectors associated with it). +In this case, a vector search has to perform more comparisons, making the search slower. +However, having fewer centroids decreases the processing required to train the index. + +* A greater number of centroids results in a greater processing cost for training. +This increase is due to the training process having to search for more data cluster to identify more centroids. +However, it reduces the number of vectors associated with each centroid. +This reduction makes search faster by limiting the number of vector comparisons during a search. +endif::[] + +ifeval::['{index-name}' == 'Hyperscale Vector index'] +{index-name-plural} perform better with larger centroids (fewer centroids in the index). +They use algorithms to skip vectors that are far away from the search vector, making searches faster even with more vectors per centroid. +Having fewer centroids can also speed up the index training process because Couchbase {product-name} has to identify fewer data clusters. +However, having more vectors per centroid can result in more disk I/O during searches because each centroid has more data associated with it. + +When choosing the number of centroids for your index, consider the following guidelines: + +* If the majority of your working data set fits into the bucket's memory quota, choose a smaller number of centroids for the index. +Having more of the working data set in memory reduces disk I/O during searches, making searches faster. +Another option is to have the fastest possible storage such as a fast NVME connected to a high-speed PCIe interface. + +* If your working data set is much larger than the bucket's memory quota, choose a larger number of centroids for the index. +This setting reduces the number of vectors associated with each centroid, which can reduce disk I/O during searches. + +endif::[] + +You may need to experiment with different numbers of centroids to find the best setting for your dataset and queries. + +See xref:vector-index:vector-index-best-practices.adoc#nlist[nList] for more guidance on choosing the number of centroids for the index. + +==== Quantization Setting + +{index-name} always uses quantization to reduce the size of vectors stored in the index. +By default, it uses +You must choose whether the index uses xref:vector-index:use-vector-indexes.adoc#sq[Scalar Quantization (SQ)] or xref:vector-index:use-vector-indexes.adoc#pq[Product Quantization (PQ)]. +See xref:vector-index:vector-index-best-practices.adoc#quantization[Quantization] for guidance on choosing the quantization method for the index. + +You select the quantization by adding a comma followed by either `PQ` or `SQ` to the `description` parameter after the IVF setting in the `description` value. + +Each quantization method has additional settings explained in the following sections. + +===== SQ Settings + +For SQ, you set the number of bits the SQ algorithm uses for the bin index value or the number of bits it uses to store the centroid for each bin. +The values for SQ that Couchbase {product-name} supports are: + +[%autowidth] +|=== +| Setting | Effect + +| `SQ4` +| SQ uses a 4-bit index value splitting each vector dimension into 16 subspaces. + +| `SQ6` +| SQ uses a 6-bit index value splitting each vector dimension into 64 subspaces. + +| `SQ8` +| SQ uses an 8-bit index value splitting each vector dimension into 256 subspaces. + +// | `SQfp16` +// | SQ uses an 8-bit index value splitting each vector dimension into 256 subspaces. +// However, it stores the centroid value as a 16-bit floating point number instead of a 32-bit floating point number. +// This cuts the memory used to store the centroids in half. + +|=== + +See xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization] for more information about how SQ works. + + +===== PQ Settings + +If you choose to use PQ in your index, you must set two values: + +* The number of subquantizers (number of subspaces PQ splits the vector's dimensions into) to use. +This value must be a divisor of the number of dimensions in the vector. +For example, if your vector has 99 dimensions, you can only use the values 3, 9, 11, 33, and 99 for the subquantizers. +Using any other value returns an error. + +* The number of bits in the centroid's index value. +This value sets the number centroids to find in each subspace. +For example, setting this value to 8 has PQ store the index for the centroids in a byte. +This results in SQ using 256 centroids per subspace. ++ +The number of centroids you set using this value must be less than the number of vectors in the dataset. +For example, if you choose 32 for the centroid index size, your dataset must have at least 4,294,967,296 vectors in it. + +The larger you set either of these values, the more accurate the index's search results are. +The trade-off is that your index is larger, as it has to store data for more centroids. +A smaller value results in a smaller index that returns less accurate results. + +The format for the PQ settings is: + +[source,sqlpp] +---- +PQx +---- + +For example, `PQ32x8` has PQ break the vector's dimensions into 32 subspaces, each of which has 256 centroids. +See xref:vector-index:vectors-and-indexes-overview.adoc#pq[Product Quantization] for more information about how PQ works. + +==== Algorithm Settings Examples + +The following table shows several `description` values along with an explanation. + +[%autowidth] +|=== +| Setting | Effect + +| `IVF,SQ8` +| Couchbase {product-name} chooses the number of centroids the IVF algorithm uses. +The index uses Scalar Quantization with an 8-bit index, meaning it breaks each of the vector's dimensions into 256 bins. + +| `IVF1024,PQ8x8` +| IVF uses 1024 centroids to divide the dataset. +The index uses Product Quantization. +PQ breaks the vector space into 8 subspaces, each of which uses 8-bits to represent centroids in the subspace. +This settings means each subspace has 256 centroids. + +|=== + diff --git a/modules/vector-index/partials/nav.adoc b/modules/vector-index/partials/nav.adoc new file mode 100644 index 000000000..eab2f8610 --- /dev/null +++ b/modules/vector-index/partials/nav.adoc @@ -0,0 +1,15 @@ +* xref:server:vector-index:vectors-and-indexes-overview.adoc[] ++ +-- +** xref:server:vector-index:use-vector-indexes.adoc[] +** xref:server:vector-index:hyperscale-vector-index.adoc[] +*** xref:server:vector-index:hyperscale-filter.adoc[] +*** xref:server:vector-index:hyperscale-reranking.adoc[] +** xref:server:vector-index:composite-vector-index.adoc[] +** xref:server:vector-index:vector-index-best-practices.adoc[] +-- ++ +-- +include::vector-search:partial$nav.adoc[] +-- + From c4e5b1f950e7c261d302be3fa6fb724b1ae85d6c Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 12 Sep 2025 11:05:20 +0100 Subject: [PATCH 59/80] DOC-12434: DDL for GSI Indexes with a Vector field (#275) * Add vector index syntax to EBNF * Update script to use Railroad Diagram Generator 2.1 * Update syntax diagrams * Update primary index functionality * Update nav * Update indexing overview * Update index types * Add ALTER VECTOR INDEX * Add CREATE VECTOR INDEX * Add DROP VECTOR INDEX * Update ALTER INDEX * Update BUILD INDEX * Update CREATE INDEX * Update CREATE PRIMARY INDEX * Update DROP INDEX * UPDATE DROP PRIMARY INDEX * Update toc depth * Adjusting related links * Add composite vector index example * Add examples to ALTER VECTOR INDEX * Add clarification about base64 decoding * Update CREATE INDEX examples * DOC-12940: GSI Vector Index not supported on Windows (#406) --- diagrams.sh | 4 +- modules/indexes/pages/index-replication.adoc | 10 +- .../pages/indexing-and-query-perf.adoc | 25 +- modules/indexes/pages/indexing-overview.adoc | 5 +- .../alter-vector-index.png | Bin 0 -> 15215 bytes .../n1ql-language-reference/create-index.png | Bin 24505 -> 26884 bytes .../create-primary-index.png | Bin 15254 -> 20813 bytes .../create-statement.png | Bin 19570 -> 22228 bytes .../create-vector-index.png | Bin 0 -> 28385 bytes .../n1ql-language-reference/drop-index.png | Bin 19178 -> 9971 bytes .../drop-primary-index.png | Bin 12499 -> 18297 bytes .../drop-statement.png | Bin 17691 -> 20059 bytes .../drop-vector-index.png | Bin 0 -> 11099 bytes .../n1ql-language-reference/index-include.png | Bin 0 -> 5708 bytes .../index-key-and-attrib.png | Bin 0 -> 2552 bytes .../index-keys-and-attribs.png | Bin 0 -> 8088 bytes .../index-name-on-keyspace.png | Bin 0 -> 12146 bytes .../index-path-and-name.png | Bin 0 -> 11434 bytes .../n1ql-language-reference/index-vector.png | Bin 0 -> 2536 bytes .../n1ql-language-reference/key-attribs.png | Bin 1973 -> 4098 bytes .../lead-key-attribs.png | Bin 8487 -> 10419 bytes .../other-statement.png | Bin 13056 -> 15404 bytes .../{rr-2.0.png => rr-2.1.png} | Bin .../n1ql-language-reference/alterindex.adoc | 77 +++-- .../altervectorindex.adoc | 202 ++++++++++++ .../n1ql-language-reference/build-index.adoc | 25 +- .../n1ql-language-reference/createindex.adoc | 304 +++++++++++++++--- .../createprimaryindex.adoc | 34 +- .../createvectorindex.adoc | 231 +++++++++++++ .../n1ql-language-reference/dropindex.adoc | 142 +++++--- .../dropprimaryindex.adoc | 32 +- .../dropvectorindex.adoc | 89 +++++ modules/n1ql/partials/grammar/ddl.ebnf | 72 ++++- .../vector-index-no-windows.adoc | 5 + modules/n1ql/partials/nav.adoc | 3 + 35 files changed, 1121 insertions(+), 139 deletions(-) create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/alter-vector-index.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/create-vector-index.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/drop-vector-index.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/index-include.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/index-key-and-attrib.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/index-keys-and-attribs.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/index-name-on-keyspace.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/index-path-and-name.png create mode 100644 modules/n1ql/assets/images/n1ql-language-reference/index-vector.png rename modules/n1ql/assets/images/n1ql-language-reference/{rr-2.0.png => rr-2.1.png} (100%) create mode 100644 modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc create mode 100644 modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc create mode 100644 modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc create mode 100644 modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc diff --git a/diagrams.sh b/diagrams.sh index dfb8c285c..848766898 100755 --- a/diagrams.sh +++ b/diagrams.sh @@ -3,10 +3,10 @@ [[ -d ./build ]] || mkdir ./build # install-rr -[[ -f ./build/rr-2.0-java11.zip ]] || curl -L -o ./build/rr-2.0-java11.zip https://github.com/GuntherRademacher/rr/releases/download/v2.0/rr-2.0-java11.zip +[[ -f ./build/rr-2.1-java11.zip ]] || curl -L -o ./build/rr-2.1-java11.zip https://github.com/GuntherRademacher/rr/releases/download/v2.1/rr-2.1-java11.zip # extract-rr -[[ -f ./build/rr/rr.war ]] || unzip ./build/rr-2.0-java11.zip -d ./build/rr +[[ -f ./build/rr/rr.war ]] || unzip ./build/rr-2.1-java11.zip -d ./build/rr for file in n1ql dcl ddl dml dql tcl hints utility do diff --git a/modules/indexes/pages/index-replication.adoc b/modules/indexes/pages/index-replication.adoc index 3529ce58c..0661efe80 100644 --- a/modules/indexes/pages/index-replication.adoc +++ b/modules/indexes/pages/index-replication.adoc @@ -40,7 +40,7 @@ This ensures: * _Availability_: If one Index-Service node is lost, the other continues to provide access to replicated indexes. * _High Performance_: If original and replica copies are available, incoming queries are load-balanced across them. -Index-replicas can be created with the {sqlpp} `CREATE INDEX` statement. +Index-replicas can be created with the {sqlpp} `CREATE INDEX` or `CREATE VECTOR INDEX` statement. Note that whenever a given number of index-replicas is specified for creation, the number must be less than the number of cluster-nodes currently running the {index-service}[Index Service]. If it is not, the index creation fails. Note also that if, following creation of the maximum number of copies, the number of nodes running the Index Service decreases, Couchbase Capella progressively assigns replacement index-replicas to any and all Index-Service nodes subsequently be added to the cluster, until the required number of index-replicas again exists for each replicated index. @@ -70,10 +70,10 @@ include::example$replication-num.n1ql[] Note that if `nodes` and `num_replica` are both specified in the `WITH` clause, the specified number of nodes must be _one greater_ than `num_replica`. ifdef::flag-devex-rest-api[] -* Specifying a number of index-replicas to be created by the Index Service whenever `CREATE INDEX` is invoked. +* Specifying a number of index-replicas to be created by the Index Service whenever `CREATE INDEX` or `CREATE VECTOR INDEX` is invoked. The default is `0`. If the default is changed to, say, `2`, creation of a single index is henceforth accompanied by the creation of two replicas, which are automatically distributed across the nodes of the cluster running the Index Service. -No explicit specification within the `CREATE INDEX` statement is required. +No explicit specification within the `CREATE INDEX` or `CREATE VECTOR INDEX` statement is required. + With credentials that provide appropriate authorization, this default can be changed by means of the `curl` command, as follows: + @@ -84,10 +84,10 @@ curl -X POST -u 'Administrator:password' \ -d 'numReplica=2' ---- + -Here, `numReplica` is an integer that establishes the default number of replicas that must be created whenever `CREATE INDEX` is invoked. +Here, `numReplica` is an integer that establishes the default number of replicas that must be created whenever `CREATE INDEX` or `CREATE VECTOR INDEX` is invoked. Note that this call only succeeds if the cluster contains enough Index Service nodes to host each new index and its replicas: for example, if `2` is specified as the default number of replicas, the Index Service must have been established on at least 3 nodes. + -Note also that whenever explicit specification of replica-numbers is made within the `CREATE INDEX` statement, this explicit specification takes precedence over any established default. +Note also that whenever explicit specification of replica-numbers is made within the `CREATE INDEX` or `CREATE VECTOR INDEX` statement, this explicit specification takes precedence over any established default. You can change index replication settings via the {index-storage-mode}[UI] or the {index-settings-via-rest}[REST API]. For further information on using {sqlpp}, refer to {query}[Query Fundamentals]. diff --git a/modules/indexes/pages/indexing-and-query-perf.adoc b/modules/indexes/pages/indexing-and-query-perf.adoc index 42d3e513d..6a4a187ca 100644 --- a/modules/indexes/pages/indexing-and-query-perf.adoc +++ b/modules/indexes/pages/indexing-and-query-perf.adoc @@ -12,6 +12,8 @@ :bucket-analyzer: xref:clusters:query-service/query-workbench.adoc#insights-sidebar :storage-modes: xref:indexes:storage-modes.adoc :additional-storage-use: xref:server:learn:data/transactions.adoc#additional-storage-use +:hyperscale-vector-index: xref:vector-index:hyperscale-vector-index.adoc +:composite-vector-index: xref:vector-index:composite-vector-index.adoc Creating the right index -- with the right keys, in the right order, and using the right expressions -- is critical to query performance in any database system. This is true for Couchbase as well. @@ -79,7 +81,7 @@ Use the primary index for full keyspace scans (primary scans) when the query doe NOTE: A primary index does not index any {additional-storage-use}[transaction records] that may be stored in a keyspace. This means that if you are counting the number of documents in a keyspace, you may see slightly different results, depending on whether you are using a primary index or not. -Refer to {aggregatefun}[Aggregate Functions] and {bucket-analyzer}[Viewing the Data Insights]. +See {aggregatefun}[] and {bucket-analyzer}[Viewing the Data Insights]. .Metadata for Primary Index ==== @@ -479,7 +481,7 @@ CREATE INDEX travel_sched ON route ---- ==== -For further details and examples, refer to {indexing-arrays}[Array Indexing]. +For further details and examples, see {indexing-arrays}[]. [#partial-index] == Partial Index @@ -581,4 +583,21 @@ After the index selection is made, the query engine analyzes the query to see if If it does, the query engine skips retrieving the whole document from the data nodes. This is a performance optimization to keep in mind when designing your indexes. -For further details and examples, refer to {covering-indexes}[Covering Indexes]. +For further details and examples, see {covering-indexes}[]. + +[#hyperscale-vector-index] +== Hyperscale Vector Index + +Hyperscale vector indexes are a type of <> which contain a single vector field. +They excel at indexing huge datasets that can scale into the billions of documents. +They're optimized for pure vector searches, offering the highest performance of any index for your AI applications. + +For further details and examples, see {hyperscale-vector-index}[]. + +[#composite-vector-index] +== Composite Vector Index + +Composite vector indexes are a type of <> which contain a single vector field and one or more scalar fields. +Your AI applications can use the index's scalar fields to filter the dataset before performing a vector similarity search. + +For further details and examples, see {composite-vector-index}[]. diff --git a/modules/indexes/pages/indexing-overview.adoc b/modules/indexes/pages/indexing-overview.adoc index 4071a942f..099bb6cc2 100644 --- a/modules/indexes/pages/indexing-overview.adoc +++ b/modules/indexes/pages/indexing-overview.adoc @@ -35,10 +35,13 @@ endif::[] * xref:n1ql:n1ql-language-reference/advise.adoc[ADVISE] * xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] * xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +* xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] * xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] * xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +* xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] * xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] * xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +* xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] == Storage and Availability @@ -51,5 +54,5 @@ endif::[] //// * xref:learn:services-and-indexes/indexes/indexes.adoc[All Couchbase Capella Indexes] //// -* xref:clusters:index-service/index-service.adoc[Index Service] * xref:clusters:index-service/manage-indexes.adoc[Manage and Monitor Indexes] +* xref:vector-index:vectors-and-indexes-overview.adoc[] diff --git a/modules/n1ql/assets/images/n1ql-language-reference/alter-vector-index.png b/modules/n1ql/assets/images/n1ql-language-reference/alter-vector-index.png new file mode 100644 index 0000000000000000000000000000000000000000..129de15f8a5db5bd204183995d5ed8ebd29ffb33 GIT binary patch literal 15215 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%0ALZD1JN2Cj^`k4YijJ*C%4P~L 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 literal 24505 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%0Dg&G@P3? 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 ML|V8&P|NfG1L%%lwg3PC diff --git a/modules/n1ql/assets/images/n1ql-language-reference/create-vector-index.png b/modules/n1ql/assets/images/n1ql-language-reference/create-vector-index.png new file mode 100644 index 0000000000000000000000000000000000000000..242e49a8732f922b54a0cf15fc890109593fc074 GIT binary patch literal 28385 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

tnfu1RB*P*r`>1L`hlX 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/drop-index.png b/modules/n1ql/assets/images/n1ql-language-reference/drop-index.png index 2558a10c06c8349089c9735010194fb316d55d47..e56246bb37e8f815a48a2d779aa31cf3bbd22548 100644 GIT binary patch literal 9971 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 MlTwzf5jP3_U+}YVJpcdz literal 19178 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

50r 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 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/drop-primary-index.png b/modules/n1ql/assets/images/n1ql-language-reference/drop-primary-index.png index 4f0d73357ae22f9fa8e4ef5aa47dcc8801daa2aa..0728aca43883a53a079135a2e893c11ca3e0ab78 100644 GIT binary patch literal 18297 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 literal 12499 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 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/drop-statement.png b/modules/n1ql/assets/images/n1ql-language-reference/drop-statement.png index 898f61cc22544be5acf2ee1ed212ce82b397a03b..c5f57b90a83c644e2eef056cd91e1cf78cf32eb8 100644 GIT binary patch literal 20059 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 Dwow+8 literal 17691 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 AIRF3v diff --git a/modules/n1ql/assets/images/n1ql-language-reference/drop-vector-index.png b/modules/n1ql/assets/images/n1ql-language-reference/drop-vector-index.png new file mode 100644 index 0000000000000000000000000000000000000000..563e2eddaa0212ba3ac9d965439f0e6f175e4c86 GIT binary patch literal 11099 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

#GFno)8>q&c5O^Y-&@LT}Rk$!L@+cERZl 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/index-include.png b/modules/n1ql/assets/images/n1ql-language-reference/index-include.png new file mode 100644 index 0000000000000000000000000000000000000000..76b1724d5778cda2b8fa9bf9f34c478f22fdc199 GIT binary patch literal 5708 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 R?H?{cQ&mp|sq{STe*nkxC0+mk literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/index-key-and-attrib.png b/modules/n1ql/assets/images/n1ql-language-reference/index-key-and-attrib.png new file mode 100644 index 0000000000000000000000000000000000000000..2ab3429ccf0615dedf1278a4e5a909516369b0f0 GIT binary patch literal 2552 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 O4tOV{1S)xJ67WCZF%wPz literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/index-name-on-keyspace.png b/modules/n1ql/assets/images/n1ql-language-reference/index-name-on-keyspace.png new file mode 100644 index 0000000000000000000000000000000000000000..75a2bd0e878be46ac62da3efe340ca30d5d71fe9 GIT binary patch literal 12146 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

+5#PBU6dWvaq`ybD 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 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/index-path-and-name.png b/modules/n1ql/assets/images/n1ql-language-reference/index-path-and-name.png new file mode 100644 index 0000000000000000000000000000000000000000..1f54e77c6dab0a07d86f0d81e85779cfef847f6e GIT binary patch literal 11434 zcmch7by!@#n=eq@9g4dT4#g=_Tna^t4zy@-_u_6v2Q9^lyZhko*5Wp}Ly-b^==W#4 zd-tyVai4h@IGmH5B=4K#BME=2B8!1af(iozgCQ>`tqubNhXeiF0T~hcZGCkHg#My3 zl~Y%Sf$?O3f%zN+19J!c*XLar7#B_$n0;dy7@<@c7$WB5>mD_F5Nt+%J7RcvcnS(#mH?R1PN@I-meDk)ZR zqw&?vs5@!%O4y^o!|Eas#rYVS?f8w66L(?+zuXxcxwvxLW_KEIgEWncjysKcj5WbX zV8csbOJl?lOEQS)=j6#28A#I9maq=3%`5q#wVs;YTt)50bLk#U)kKWGn?|E-EXZy1 zD5}f1EJz5v-6IW0C{ab+361lOU%`RTAyq=Br|mL-*tN7m8Hbo#@jc{i~wJ#Bqygr#^d=})85hQu{Msg=dUUy zRN$#4hpac#N?)=hvF5eR9WCDW7F32$_ce48ow$X9iY}`l_Wc1ID|_J}{`=SORy!?E zT^*1-rhBu0aXEB2wxqE`Fi*e>8HD3B2w(?C5XRVxr{t)D5htItBjrjchF4r6*?_59=t>xo&+(KH-2Aq5ZS>Xt)36D=n zQh^5=OZS=8?QJf~v07s79gIBbROhSC$LuOiF(3y}F$Qo_O--Qz()jDA6n@y+9F%C$ z$;Gp9`se*A9mLd_{v{mz&17=bT*Vf4irZ1z%WrS77q{PY=e_*T{P-V&Rls56DGq4A z0Kzz;%V!Jq+xsyGcnRj^y&dx#*3QQ>i|xp*!~mgC;E6w)=Jo9fO6R$%YuNQmrY!}z zk3T@d-$e}aaWM~7o&MA^`t$1i0)g?Hbc`NF`NGwA=@Q{`RVA`%v}n>Fq){|^E5l$f z$_F{S9v?Xk08X@A2ecEs=JQ^SCK;imw#h>{{SC@PsQSlBN?(Q-CA1HD;(T= zwuTZ(wPP7AA5l7Rr}YD=g7ug{A6yHN4LBd+}7X>vjy>Y z%nGpDI6AUpbMzqm0`507G&Bi1o|&9pcT~w)@PiFgr^{G=o3>UAAJmyeTIzc*nO{&P z$S+=v=cbA(uVVOpw*up3X&2r?;*Ad%pRh{HMyi}Ab!siwGpcEY4=2?E)b_8$qq zBo-|dmaL#(!^<`Rb2aHx^C~m0w1&Q%HhjG)a}}SU_gw|jnG<=_G49*7yDq8&JOmIw zRp?5LMEg1sF^(8E!paX?GJQN=X{Ap$HZ?sPfHP#;YM|`@O`pDQY!?X(Yyl>$0)Ka+ zny8q$QtU740+-}C&?)!Bv)wYmeSqR|X z3c7|nZFS)*B((D!z8tPfu`*R&>naFtZ{f`u7%2-1xY0>B{N+u()_XvHRVH;E_NCvy z!y9oUU6p;*o2-&@>gr16@*^)8xx>A_vf=cuM4BsqGO%|S0OEwFKHkmm4w7Z`UdU4O zA7c`BG$i2%Qb{YgxVE)!OJE)%xKSN<=cP#_VC6S&-Ys!=S-)KR9tqq zHoVHI@lvd{S%&8+#897~Di3BXo<1{^$udg0*e-s#|07?6rI({46NqT`^{x9w@Vr36 z!c?T_tfICiW!d3sKY8~3aaW#0TgjI7#OJXa&nq@yCedyiVn^hZI)aiCQ}Ue7)j^47 z%|uBdOWQ(YOQSPAB1iN|V8K|7yWgO64m}OSasAhKeiTJ_!7hFs`I055kaK9J`a4g_{TJRxU4rzSwizn5H^A#9t6XRM_0skAYOklfrlb1}O^m zaMu!MIvAo6^g2AuW1nF0e*# z78K~encA98w&(>N2Rpi3O9-B@Q^evVh;>aSXxr~huv|T!hNUkwon&~XlZKy5wsV*1 z@%3f4yaWqj&FEEL3hTU2&GFGQ-%-k|^73hIWL<3_XZ?LEI!xer-DwSxPW01MGn%-1 zh>-7~QsL{&^o#dxzF5dR9p z9D*;h;fAZD3o`xL_eS#KxEmQm^|g#v`P+MO*L|ZX;tlGiOUQ|Izm_P#AqBP(}#KV0YI zdUs#WW$qnSl=cWxzoTmXh>z>~!qFzr&96yovAm`u9iX(XtrGw$z2nqlmYC~q<_<#b zdkC)-Z_$M-|0K^H-*u%9pRD25>Zpy_(G{r{*5*u(bX!%5Tl)c$nXG7^Q$mWkKPq+g zDKwILGE7wor=G(o`i+9F(W}r`co*OXZ+$;Chj45;Mgf?YO{v3Hu41f4y&-iK>zPmY zuv`vq#cgIPAhkgbrhwIJQ(`WSkHiWJ3P4~^aqk(4L8mwl0iS}F@b>&pS4zl0ExiP> z@Gp_awycjj!6BHJ2Wt34+Pg%tRRRwDwSATzSo;y9zOpkHiKh!#6yrHI==n?3QCQ{K z`l?Osj&0j_!&j*XPRe9qg~}&tt`EOEkT?B4a@W3NsY-uf4}B2Wa{%Co;2itIr&UW+ z;BLNMJ_~i+M2uL-R&8;?ZWeRp!5UPgv_cd?1kPPb?20=I9+m0yt_2{CDRq8v=^T-!ik<@2K7nPeXQ|n7tD9>Pj4?Z8|&O~ni&s|Y>LUoM_KXV z&eC{mL&Nt1X^Bqq&81l4!Rzf8y#A02p4o%6eG23iaRqCR0?6)*v<@TD`HKBD07cQS z>flMSG~~}S(w=Ek!Zu05@Hzg~+jiFw^yyL61EIFGA1-2^fx>u)!5PElru4PasRI-H z4&fSZzvZg{oj=GFTf4-goNr0W_q(Nb_#XOq2ItOm{NwrZy)pgo*L_C4J@8d9T`y(! zsa?v9VgpD$#iVsg_g?BXNfC>Ik>Ch+doG=7*{4d13@V_zLPLI%tCpL3nIJ)|q*nG# zuvpY3)$mFd6Z$L<;tjm4_rA4FT)MX8ko4Oosjv>Rt-FCs^$At-JZ-%eLto!zRg$kg zC}v_=v;@UNr_>Y{YZhc>C|5@#3e(jQwO?GFz4@8(B(^bgkXQyU9OQ=O*aYN<;U&S9l3*eRE0YR+1{=8HK z+=gUFqpC>o*5(1zxv&jG+P4dXEp#>kL*$ZqyiC)IRRxSHj2qc>IURigm;LTd@j8`v z<9PDFA46P*;of%o5<`E9B9I~P@omWTJt3ejpX zH3N0wl73HhuM~AJ#Xli4_>-?gxFa|qmVLnbK+Yb?M0;Bc0|hQs(Kmhv9*WSPVewly zscpY)!o)F;hlh)yEAcmLmZo&>=sk*Ps+ulTi3?qil*Nhb9dtk_^gS|>q@i*i%(wq^ z;jAgwa1y<^)geCCQxb{Sdf)Wbhg7)MzFa8S%@@c_V_JjbOi$1cXUoM%(_m$?{?~HYopY^8>aDnr z7@_hV$Od20eMc`FI??PxjK)(bUM9@4iO;!Dhx>@8r)V7l2eScM5O6Gf*Uc zLcYZ%HHqgD#1Z=TdsF0>A7$o5E+LB9jp))Of@A5&^l`<+#?dS*(Ru-LR5^a3XmO~O&d_*`Hj zw>O!RL}F0+d&p_hC{CQ>Pm z42+UN0Nfzocl^Zx9F$*taZEx<-*;qA;&te+kY{F9&Hr#|gv}N!$7pUA)M2~X1;eVo zY9%DY6!#fVS@>=(cp%Ix1jQ)dLQV^OwM;X2Yes6u&;cD|A+c>A7#OAi2Fsk&Z=s#q zmmGsqKzIpaW|4){wX<}wX`QmVatuJn%HQdo);kI_rd!-x+8lsj0v?pY<(Rutl4RVa z#cDOi$C-+Hd|=J|uye&cep=v$7mOWK-(8PQ+;5B%KeRw9>`0 zqMg%nsC_bTDa9%jD8-5gpX=uZK)6Mf=oz8OEUEeyPK_Hy$cm+{_EIvkAiB&sjj^Hr zN|O~gFA*b>Kg>HELwOi&IhiWg* zFD;@Th#dwvQCptgik1w5 zS6RjFUy)s0-FBC$VsB&0T57jU9{Zx-?yRWb>}aSwwR>t{h`Gq|QJd0Pro?P+V1&J^ zkDN=uR}A5$F1^L!2lj#E{P*B?U@$r zaUS8fJPp`TPqY26y|qy^UGa^SjG=|rC~@Dd29jL>(`$Y_ao!DU{tvl`LZ&-C$vVF_ zF)}a}dcmB;OaF%hZD)zq!9sgJ8Z_&USa1%H+gtr_ zorgqvKsidy)19*;pY;Qx=-E|6S#7fgEbmplg{S^Wy@1xnT%6hy1RcHN5du410XJq0 zS|nbH{a!V2dw$7NZ>$$ykk{HT^|1hg6a*xb&)P2z-=Ao%qJo>Jm+&R^{&vj=4Rj*{Dq@+)YVelo25p78iQ4BU=`UTl3j6w-m4m!*fC5` z+IeWYpdof-%ri9LMmZ-S5}tbe(jB>_f;Y0&bg^lyuj`I@wOp(`{X^knR^#;92KY7l z;ViZ&NXgUH0ei|FcZfXp^BV6ug{RoT=XOz2z}bE3j6~gpEtKNQs7mdZnEwlG3Tc3CE;~hUwbn{ z@^RSr(;gS7$8Lajt<4APfw$yAwvqd5Wk?U8E^&g?h_5AkV6f$n0o-)4Bg6{!+2PQB zQ8FPPq=t8BXZNcOLBZ2MyK(fiJVaa?CKI?(;(8lo(VFmWKT0INOMDHb6^0>Ouc6`- zcF<(KT%~wmFh?H?S5_H^`oIMH905S&?Jvsrn+~|X)*`b%qcg0`mYlDe?lcvb*Owbi zY{MBaSiy*rU~X)8dV{v37Cr?FP0k_)_ji3UCo5~g2~T+&Cr)k%j5NI5ieX(kwdbe- z*IMEeAxP$k)vHJM!Y|D^R;1Qu(U)2?IRto(Y+C%sSB}3E2=*77oTieBfrGgx$ritB zUrDr$hPpd$wk^FvuL}2Yua^=n^)AWfq}jmO(YUdV?)z$p5qyO4(=2M8hB)NPIx3lcZeR?c)(~-e zPdo739Be3AyS>?HiMU0N$!KFmx8$W`q~T@{1rYr74r7dcv(V0=Mr=^^*v&5at2eUS zAgCN+1-COZ98dU;i*W;SiaR3s!ghrn`$KPwOyg#ktaV0f919znA{vO(`BEN^N6;Hy zPSTOW^&u&51+p{&$4b})oZ=)>SNXHt^pk6Cr;^ zh0|pJCn%}lzDWvp&Ome04M_*a%9>a8I!JkaaFpcb35VPfW|zs9>(qD zl&z}6CuykxXfu-k-V7C}s+|gw4}8Gt+uOQ3DMKk*cpKpNu>YNUOYxJ1;@<#*;9$}1 zG*oUT2$3mZ*VMpge5!?;|Bm*c=nXh-fppC2F{#)blz@L=PXJEjB*xC1&U|4NeyZh;Up*wRsAI+PWM-~;09=p<0yT56g z@=DTkPZ1Q9yYF`(zNc7l>{<~A?@W+*Y^8MM#kO5hxi7hlOmfS&OHW*r%u4By1HRLz zfU8EQHK~`|UzsI5JqqAeu&bONLjtaC4ky5i1u~ZBmT9#A1ht#VdRIs+-PZxq0WZ6N zVUsD)G2|N1&8Gf?EMCCN8e2ES41MsZ^8U5=wS~K0$7)-$)y^;grhca^aU&_tTHq5l z6r;MZnfnBrJfjOu=I2I)Ti5jEy?3QS`wXAb8RMIZP@(-A`q^~Roe&JW3=U%+MTJ(%l z4~Y$Q!Cop1hBj2~Z^4H9sP^0YHtzflG0RNmAD;uNv_I$Nvnu~=d;I&$zq0m^{{QE( zKS?Zsedph$!k_=20`%;!PPMN%>gst%ogF#FeQ2wUuLe7RWB*B~;0#fysq*c0OOW(y znvh=smywq-RE*!=$2_ia*_}Q4{tAy6uBW(_YL;K=MY6M*)BdV>f{oiiUqf$IRGURx zZkcS#wd{#{BQxj0U_{KPg|xMq|8*{6a%FvSW=GFBWY78JFepW){tHW@JxcU|ds$Ax z)>Ik(Hb&W8b!{pXdZGzB`FPvx5VK&^_PG6g#Qspa_p6=Z1YwV8FEi&`i8qOcQct;y zm+Re8RMyS*`Ee=~caJF5C5UFRt3IVC84_xleR+{(n`-$?R-hX?xN*hp*&1M!#IT!M z`WI`3aeixl@w6&sq({0rza$xz$^bgUW`Z+NHhos1)CfF~iAhl>~ffv02;od-I-C*z^>7RB@VX~~WZWQwxVs_(iKNj|jH{hsFoT0(;(2k)}h zm2(+T>0Lb=bE9+qn!-W8Ic3iyH(^Tm(RJ1$BMc1D|5`&hzL$5Xv2 z?u3^b{IepWJV>TL4|quN=3@hV9{K#rGg zo^h1O{JI)@Ns+_T_{lm!ue)yuzTKCF(d9}wbL~f;mdc%_R&7VmIT%q~# zN$=FRe^-d@MrnTDe|w{HS1U{`4C==%E7GQSf%PN!(rGC@?Cjd7FkfU@ ze-0yEyxD;e>zj?|e3ynz=}Ru%F%NBer-x=K8b4oxASjOUY*SS?Fm5cy0J86vifVk$ z*8PkmJH*J}yt}p!UEdunAr>D}Y#aAeg<&^{?rLavdZTM7HtKaYQ^zvJAvtdBIzuBH zUNlnfNg9pk02P2d8)OFKflwfW(&w8UIN%7M>#uZ?b+N~ZXD*HvP_^rvI zF(h~;P0!kX2I&48B>kjBSbe-64V z`SM@ceZ4I7j*Tt+{TbRw-QcCDB(D4gyeV@&7#Osx=d%Enx2jQ>$79Z?$lTl)r~5NR z6XnWy-cOrq`Yl;u5)Z;W24zf6-T%S*%d=e$?K*_WU7MrS6bh9f?0z~lo^X+7rc3Qf zyko@DX0!WA_-*0~*hKI*)`|uP)F`-8D8eM`z@XfrOXS#I##1KI>4Yqs2VZeC$WV(2 zk(S#WRc@)Jn&ADDrpp^=-r>w7wm% z6OXx7t^WazVRpM$rw2lnW?D(H^v(hi_PGPp9lp<>tUkwlL#zUNxuGn znTraa{{NVZn_`V^TdoN|Rc&RPL}zE)b}tW0#}%bDi$yDGg4$4zgyp#h6-$kww>*lhhpux zVK)Pc0~;tVPZnVc;ocz>7B5v<{kNE9yv|x(-YZDad*CM1S-_En=t26uF9-;Gaz6b`VbF}t> zdXf!A^@CH9RG!3+ZtU`qWtw zdR}Sd6OpL;VJ?=ml-=zCJ=U&`EDmXjR$i<}aOCI_ToX>h zvetmFZL?Ul>s=uKL$~`!mA=KuU)b(^FJ9R}&@e}}f7-6qGzjk}Wy~sjOrhplLCw`K zxJj#|F0?O?Z2>a~-X9bH*XHUS^Z-be@t#{{EvM9d{n!Xd&h(d+?kG=1B8S$^g;z4` zR%z$=OuU=}$eTM&r-v_c^hw9PxFB5*u&1Ot%MRd?5FxnN{-caIk8sLf#76urbPdOD z)?}#%P;+QLh_UPtjv>hyU)0kQeAJ;u+S(?X9SWa#)z*@&Gy5qKMd{Pz2+Lz`T&JEk z7xp(Nnwc_O7JvQOx`5Q`G{Oq=svyt$V61ch! zNIX};^}bn$R=7cWnFV|@KC!#Lh?(tOg?1LsY_Zr%&Hk^Jty}KNfh0!B_eS`_u@DsH z(Y=58w!uXp6f?lWXUwCtZ^|Y8!_0*v-?xbHyX@|{qKJ#R(dp^)D=Xj5Zn#IYuVsft zkkFT8o?Bn6DXy^DSSab?21Om>9xmUIWt|*L-)W*fc;ff==1Y3N2<_L&5FmZO>HRkY zm-DL~qZV~Ffr&UKIR*|K4~ip=vx>L6So=-6iC7@5`3b5N3C3V}Sky33v6r86W6%_* z{zMU9M!WQ>GIGM_Y{Q-?$J)OE-rjtpC&qUqywSfFef9(2D?1|O>J0YU5U?pOqJ34<5nHU@$wIEi@qk{U0ldXk6LF5vrWol&C9!ac3DxVMbU93K)u(e{X zd2nr$#~bCFgpcpeu919qr|tm)m2d*I!dRxVmpyB+2Aoev%EYgR6nANNMnGc3PJ}*z zfi216{0a}bnjOZsg~D-3NsPpi|JLj+!DR(?*%!??eq^1wLyWn7D|g@WG+L-0e|b=} zmdk6Hwap4|=Xk@Elg156q8`anmObe@DLQFM&_i>ik&cq!Jv-e2uRY{C`%-4*Vp-JQ zDzV+Ngu4Ax@wsDj{HMxOX0hcxr^?E`$s?Xznf88D<~sJ1=vpqLdxxD(0O38l52aXk zJ8Hu0N_Xis;c9mgZKIE2=oLD!sNXYX5OMhd~R^i3Z0h@d~V3Mrg-@dq)D zaVAs%pq(hs2p$-uBJCqwGgVtkler@0>|HOh1J!w?#zH#(VZQ#w;K0b4$a>b(BU{3^ zLT#a6OMXGk($+f1zf-n9EEF7;i7e}NF%8@0=HiJZ`@%M6l8z^q@E9Lx5q>jZ*>ykMB>5Fo{Z?OuEm``Ij_HxKy3nK?}uH$E8qhJir53s1%w zD&LxIA zxSK3)AN z4`t&~m_bkxi}>VTUwxJmCPWa0v)vnFPD9{Y zbP;bu;c9tKSWkqLs6IbjnenA)vm0~+1E0l`>I}YHW{-_Civv=`x@Yn(cM?WI%QF+T ztkR1C>09VEGmJtHx)n34nZ~ zfR5ixQHC8ccARF2{!C1Dr2a#+ooFZ6^kjQkrF>2gWq Gfd2zvgE`p% literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/index-vector.png b/modules/n1ql/assets/images/n1ql-language-reference/index-vector.png new file mode 100644 index 0000000000000000000000000000000000000000..cdc92659ebd429046d21c7413a7fbb77069d6770 GIT binary patch literal 2536 zcmVP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00004XF*Lt006O$eEU(800001 zb5ch_0Itp)=>Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01m_e01m_fl`9S#000R; zNklZRdGP6|L!z%&GiTiNI{*-j3bxNu1EQB}h?T(YZM_C3H$Um7@Wjmj(0uX%xVR3j3!7DJrVv(aA}H z4(Xf0@<*9jbtOk~LOkZ#Jt<`E3YXBJX%5Moi_BuYbxDIZo*K{CJt^9|`Z7RuUBCx0wt)?EbR6kazRT}U{k(2n{yXClgqZ3OP2jG{RWAyh= z6}IAUpWKG8w-ATkOu`>B%286@Y4rZelpx}?MX~G7t^pkQtQsf(-GZ(jB|P2vSezij z_GcsU>G66Lmv)%UA>{mZF}rSP?nTB&Rk&CzgQ8!JK#?=nJRX8=&qhGN*RHQ)ry6ni zi@G6gga*1|82p^w4Ui&VHg~Pb~|@>+h67D(gdG@g1Zr@Ml6fUnFJq>wX$GUI-bnj25fwCy8iijv0gZFD4DgD{z?%FE=h6nLd%#*F_wJN zSmmT61DT32Xoi^&eNstVHrc49`uhzZPXU%a5`esd7NVA$7%B1!n%Qp!F*DpTKi+%D z^Os86@%D$6`tma?LJ>9H4SDCAwef#?BqM~*Ec|Tk^ihqYt7ky3NnYF-%?LpeKhqPb zDS`Nsj4huC+>jJ{Gr;4ZQERV*16(IW!&;J)DKd;m3R8`awbT2Fbt}UeDNYbFyhYS6 zB?ra&VOl~<3K=_eNSN)7=|s&-+xu8KW{?nLg;dthRy;Flp+lpl8Nu3e%N@m#`_$Y# zwc|U~H}w)<2zF{ z!LsB4_<9M^F7HP+vC9{U8KJ8$ZKW|OsE_gDrYL>cpO_13=jqD6r%*xG(QnllJly{` zO&!F97^0(FTlR1h7`@lmr)Gqpc<1%G#7AU!mdAF!`V+BWo=o5;v1I#&0+Yw8p?^BKX4J?kYWH^ z$k%VvaFBy)3`?ZYHKNfrQY3If92GX{Y^S;U@m7QDR)sNAP}^?GbWmjHOHg#R-6$k| zb$cudugFMvE5~CSFJS4C0Oq{roo~U*&qZ4#1;w71W?{>2F+M(4kB-g(W{Rle*eX*X z*xvkS~Y>%OB@|5wIYqT_p6}Mt4u$$U)WnShPj>-6{L_4_BH=9cclN$lj=itMkLPq*l+)lnljPtA z)lM&Il(m2B!;~beC=9XtjG%&>c~E=Ojw{8-@eMsF8G|R??%B zP&Li7**z)f7CE7iC#D-<95BYO_ZjRU)Zi{v9Cl9%3c5v(?ufcx(cxf$0p9vYDQ?$w z>j+Uzjzl#NITJYsn{5VaZbL_~A6Ihf+s1Ud0fz2(a1f#tS%%t^!`B>e=lgPGObJpj zZPBK=CGt@>FrZ-3A060a_b=VA$IJ!gu*MWhGyeaLW<=?LL2A;n#l1?3JD~| zVJpYu4hZ->{-THckeU*P2ckVOBgEYdp#9cu>(`MySSb&5tAC1tqkh`}6~boeju%L@Urq+tmF0000 literal 0 HcmV?d00001 diff --git a/modules/n1ql/assets/images/n1ql-language-reference/key-attribs.png b/modules/n1ql/assets/images/n1ql-language-reference/key-attribs.png index 91d65dbcc7a19813f883a723e1b3c00ac2d1d600..aecfc15a8c7a91524058d5c368eeb97e10d8f990 100644 GIT binary patch delta 4024 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 KYt?EvMEwsSUh3=s delta 1882 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 Jmhx+P{~r;d54!*W literal 13056 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 below. -NOTE: The ALTER INDEX move operation is asynchronous. +NOTE: The {doctitle} move operation is asynchronous. As soon as the move alter index command is executed, the command returns. If there is no error in the input, the move operation can be tracked through the console UI and any error can be found in the Console logs and Indexer logs. -If a node goes down while an ALTER INDEX operation is in progress, then the index would rollback to its original node (not affecting queries) and a notification would appear. +If a node goes down while an {doctitle} operation is in progress, then the index would rollback to its original node (not affecting queries) and a notification would appear. IMPORTANT: It is not possible to move an index or index replica and change the number of index replicas at the same time. +//end::purpose[] + +//tag::prerequisites[] == Prerequisites -Only users with the RBAC role of `Administrator` are allowed to run the `ALTER INDEX` directive. +Only users with the RBAC role of `Administrator` are allowed to run the `{doctitle}` directive. == Syntax @@ -51,25 +61,29 @@ include::partial$grammar/ddl.ebnf[tag=alter-index] image::n1ql-language-reference/alter-index.png["Syntax diagram: refer to source code listing", align=left] -The ALTER INDEX statement provides two possible syntaxes for specifying the index and the keyspace where the index is located. +//tag::syntax-arguments[] +The {doctitle} statement provides two possible syntaxes for specifying the index and the keyspace where the index is located. // TODO: Automatic links in EBNF. +// FIXME: Maybe try to make consistent with DROP INDEX [horizontal] index-name:: (Required) A unique name that identifies the index. index-path:: (Optional) One possible syntax for specifying the keyspace. -Refer to <> below. +See <>. keyspace-ref:: (Optional) The other possible syntax for specifying the keyspace. -Refer to <> below. +See <>. index-using:: (Optional) Specifies the index type. -Refer to <> below. +See <>. index-with:: (Required) Specifies options for the index. -Refer to <> below. +See <>. +//end::syntax-arguments[] +//tag::index-path[] [[index-path]] === Index Path @@ -85,7 +99,7 @@ This syntax provides compatibility with legacy versions of Couchbase Server. The index path may be a <>, a <>, or a <>. NOTE: If there is a hyphen (-) inside the index name or any part of the index path, you must wrap the index name or that part of the index path in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. +See the examples on this page. [[keyspace-full-index,full keyspace path]] ==== Index Path: Full Keyspace @@ -164,7 +178,9 @@ collection:: ==== For example, `airline.{backtick}idx-name{backtick}` indicates the `idx-name` index on the `airline` collection, assuming that the query context is set. ==== +//end::index-path[] +//tag::keyspace-ref[] [[keyspace-ref]] === Index Name ON Keyspace Reference @@ -179,7 +195,7 @@ You can use the index name with the `ON` keyword and a keyspace reference to spe The keyspace reference may be a <> or a <>. NOTE: If there is a hyphen (-) inside the index name or any part of the keyspace reference, you must wrap the index name or that part of the keyspace reference in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. +See the examples on this page. [[keyspace-path,keyspace path]] ==== Keyspace Reference: Keyspace Path @@ -237,7 +253,9 @@ collection:: ==== For example, `{backtick}idx-name{backtick} ON airline` indicates the `idx-name` index on the `airline` collection, assuming the query context is set. ==== +//end::keyspace-ref[] +//tag::index-using[] [[index-using]] === USING Clause @@ -250,7 +268,9 @@ image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source The index type for a secondary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. +//end::index-using[] +//tag::index-with[] [[index-with]] === WITH Clause @@ -322,12 +342,14 @@ __optional__ An integer, specifying a replica ID. | Integer |=== +//end::index-with[] +//tag::usage[] == Usage If you attempt to alter an index which is still scheduled for background creation, the request fails. -`ALTER INDEX` will not work while the cluster is undergoing a rebalance. +The statement will not work while the cluster is undergoing a rebalance. === Moving an Index or Index Replicas @@ -364,16 +386,26 @@ To find the ID of an index replica and see which node it is placed on, you can u When dropping a replica, it is possible to leave a server group with no replica. For a partitioned index, run a rebalance to move a replica into the vacant server group. +ifdef::flag-devex-rest-api[] +=== Index Redistribution + +Using this statement to move one index at a time may be cumbersome if there are a lot of indexes to be moved. +The _index redistribution_ setting enables you to specify how Couchbase Server redistributes indexes automatically on rebalance. +Refer to {rebalancing-the-index-service}[Rebalance] for more information. +endif::flag-devex-rest-api[] +//end::usage[] + +//tag::return-value[] == Return Value -If the `ALTER INDEX` succeeds, then: +If the statement succeeds, then: * The query returns an empty array. * The index progress is visible in the Query tab. * After the movement is complete, the new indexes begin to service query scans. * The command line displays the new index nodes. -If the `ALTER INDEX` fails, then: +If the statement fails, then: * The original indexes continue to service query scans. * The UI Log and Query tab have the appropriate error message. @@ -409,6 +441,7 @@ a| a| * Mistyped the `"action"` |=== +//end::return-value[] [[examples]] == Examples @@ -539,6 +572,14 @@ WITH {"action": "drop_replica", "replicaId": 2}; == Related Links -Using the ALTER INDEX command to move one index at a time may be cumbersome if there are a lot of indexes to be moved. -The _index redistribution_ setting enables you to specify how Couchbase Capella redistributes indexes automatically on rebalance. -Refer to {rebalancing-the-index-service}[Rebalance] for more information. +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc new file mode 100644 index 000000000..ae793da71 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc @@ -0,0 +1,202 @@ += ALTER VECTOR INDEX +:description: The ALTER VECTOR INDEX statement moves the placement of an existing index or replica among different GSI nodes. +:page-edition: Enterprise Edition +:page-status: Couchbase Server 8.0 +:page-toclevels: 2 +:imagesdir: ../../assets/images + +:rebalancing-the-index-service: xref:learn:clusters-and-availability/rebalance.adoc#rebalancing-the-index-service +:console-indexes: xref:manage:manage-ui/manage-ui.adoc#console-indexes +:query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context +:identifiers: xref:n1ql-language-reference/identifiers.adoc +:logical-hierarchy: xref:n1ql:n1ql-intro/queriesandresults.adoc#logical-hierarchy +:querying-indexes: xref:n1ql-intro/sysinfo.adoc#querying-indexes +:alter-index: xref:n1ql-language-reference/alterindex.adoc +:prerequisites: xref:vector-index:hyperscale-vector-index.adoc#prerequisites + +// TEMP +include::partial$n1ql-language-reference/horizontal-style.adoc[] + +[abstract] +{description} + +The {alter-index}[ALTER INDEX] statement is a synonym for the ALTER VECTOR INDEX statement. +The two statements have the same functionality. + +include::alterindex.adoc[tags=purpose] + +include::alterindex.adoc[tags=prerequisites] + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=alter-vector-index] +---- + +image::n1ql-language-reference/alter-vector-index.png["Syntax diagram: refer to source code listing", align=left] + +include::alterindex.adoc[tags=syntax-arguments] + +include::alterindex.adoc[tags=index-path] + +include::alterindex.adoc[tags=keyspace-ref] + +include::alterindex.adoc[tags=index-using] + +include::alterindex.adoc[tags=index-with] + +include::alterindex.adoc[tags=usage] + +include::alterindex.adoc[tags=return-value] + +[[examples]] +== Examples + +To try the examples in this section, you must do the following: + +. Create a cluster of 3 nodes. +The examples in this section assume that the 3 nodes have the IP addresses 172.19.0.2, 172.19.0.3, and 172.19.0.4. +The nodes in your cluster may have different names or IP addresses. + +. Install the vector sample data as described in {prerequisites}[Prerequisites]. + +. Set the query context to the `color` scope in the vector sample dataset. +For more information, see xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context[Query Context]. + +.Create and move an index from one node to another +==== +Create a hyperscale vector index on node 172.19.0.2. + +[source,sqlpp] +---- +CREATE VECTOR INDEX hyperscale_idx_move + ON rgb(embedding_vector_dot VECTOR) + WITH {"dimension": 1536, + "similarity": "L2", + "description": "IVF8,SQ4", + "nodes": "172.19.0.2:8091"} +---- + +Then move the index from its original node (172.19.0.*2* in this example) to a new node (172.19.0.*3* in this example). + +[source,sqlpp] +---- +ALTER VECTOR INDEX hyperscale_idx_move ON rgb +WITH {"action": "move", "nodes": ["172.19.0.3:8091"]}; +---- + +To check the node where the index is located, see xref:manage:manage-indexes/manage-indexes.adoc[]. +==== + +.Create and move an index replica from one node to another +==== +Create a hyperscale vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then move its replica from node 172.19.0.*3* to 172.19.0.*4*. + +[source,sqlpp] +---- +CREATE VECTOR INDEX hyperscale_rep_move + ON rgb(embedding_vector_dot VECTOR) + WITH {"dimension": 1536, + "similarity": "L2", + "description": "IVF8,SQ4", + "nodes": ["172.19.0.2:8091", "172.19.0.3:8091"]}; + +ALTER VECTOR INDEX hyperscale_rep_move ON rgb +WITH {"action": "move", "nodes": ["172.19.0.2:8091", "172.19.0.4:8091"]}; +---- +==== + +.Increase the number of replicas +==== +Create a hyperscale vector index on node 172.19.0.2 with a replica on nodes 172.19.0.*3*, then increase the number of replicas to 2 and specify that new replicas may be placed on any available index nodes in the cluster. + +[source,sqlpp] +---- +CREATE VECTOR INDEX hyperscale_rep_multi + ON rgb(embedding_vector_dot VECTOR) + WITH {"dimension": 1536, + "similarity": "L2", + "description": "IVF8,SQ4", + "nodes": ["172.19.0.2:8091", "172.19.0.3:8091"]}; + +ALTER VECTOR INDEX hyperscale_rep_multi ON rgb +WITH {"action": "replica_count", "num_replica": 2}; +---- +==== + +.Increase the number of replicas and specify the nodes +==== +Create a hyperscale vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then increase the number of replicas to 2, and specify that replicas may be placed on nodes 172.19.0.*3* and 172.19.0.*4*. + +[source,sqlpp] +---- +CREATE VECTOR INDEX hyperscale_rep_increase + ON rgb(embedding_vector_dot VECTOR) + WITH {"dimension": 1536, + "similarity": "L2", + "description": "IVF8,SQ4", + "nodes": ["172.19.0.2:8091", "172.19.0.3:8091"]}; + +ALTER VECTOR INDEX hyperscale_rep_increase ON rgb +WITH {"action": "replica_count", + "num_replica": 2, + "nodes": ["172.19.0.2:8091", + "172.19.0.3:8091", + "172.19.0.4:8091"]}; +---- +==== + +.Decrease the number of replicas +==== +Create a hyperscale vector index on node 172.19.0.2 with replicas on nodes 172.19.0.*3* and 172.19.0.*4*, then decrease the number of replicas to 1. + +[source,sqlpp] +---- +CREATE VECTOR INDEX hyperscale_rep_decrease + ON rgb(embedding_vector_dot VECTOR) + WITH {"dimension": 1536, + "similarity": "L2", + "description": "IVF8,SQ4", + "nodes": ["172.19.0.2:8091", "172.19.0.3:8091", "172.19.0.4:8091"]}; + +ALTER VECTOR INDEX hyperscale_rep_decrease ON rgb +WITH {"action": "replica_count", "num_replica": 1}; +---- +==== + +.Drop a specific replica +==== +Create a hyperscale vector index with two replicas, and specify that nodes 172.19.0.2, 172.19.0.3, and 172.19.0.4 should be available for index and replica placement. +Then delete replica 2. + +[source,sqlpp] +---- +CREATE VECTOR INDEX hyperscale_rep_drop + ON rgb(embedding_vector_dot VECTOR) + WITH {"dimension": 1536, + "similarity": "L2", + "description": "IVF8,SQ4", + "num_replica": 2, + "nodes": ["172.19.0.2:8091", + "172.19.0.3:8091", + "172.19.0.4:8091"]}; + +ALTER VECTOR INDEX hyperscale_rep_drop ON rgb +WITH {"action": "drop_replica", "replicaId": 2}; +---- +==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/build-index.adoc b/modules/n1ql/pages/n1ql-language-reference/build-index.adoc index 8c2a81078..d54a5a3b6 100644 --- a/modules/n1ql/pages/n1ql-language-reference/build-index.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/build-index.adoc @@ -1,6 +1,7 @@ = BUILD INDEX :description: The BUILD INDEX statement enables you to build one or more GSI indexes that are marked for deferred building all at once. :page-topic-type: reference +:page-toclevels: 2 :imagesdir: ../../assets/images :authorization-overview: xref:server:learn:security/authorization-overview.adoc @@ -18,8 +19,8 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] [abstract] {description} -By default, CREATE INDEX starts building the created index after the creation stage is complete. -However for more efficient building of multiple indexes, CREATE INDEX can mark indexes for deferred building using the `defer_build:true` option. +By default, CREATE INDEX or CREATE VECTOR INDEX starts building the created index after the creation stage is complete. +However for more efficient building of multiple indexes, CREATE INDEX or CREATE VECTOR INDEX can mark indexes for deferred building using the `defer_build:true` option. BUILD INDEX is capable of building multiple indexes at once, and can utilize a single scan of documents in the keyspace to feed many index build operations. BUILD INDEX is an asynchronous operation. @@ -51,6 +52,12 @@ If any of the indexes specified by BUILD INDEX have already been built, BUILD IN When building an index which has automatic index replicas, all of the replicas are also built as part of the BUILD INDEX statement, without having to manually specify them. +Hyperscale vector indexes and composite vector indexes require a codebook for the vector field. +The codebook is the result of sampling the dataset and is saved as part of the index metadata. + +The codebook is created as part of the BUILD INDEX process, and is not incrementally updated. +If the data set changes dramatically, you must drop and rebuild the index to update the codebook. + == Prerequisites [discrete] @@ -296,3 +303,17 @@ include::example$n1ql-language-reference/check-idx-online.jsonc[] <1> Note that the index has now been created. ==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index c7f657419..b8ced7582 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -1,9 +1,10 @@ = CREATE INDEX :page-topic-type: reference +:page-partial: +:page-toclevels: 2 :imagesdir: ../../assets/images :keywords: secondary, index, placement -:description: The CREATE INDEX statement allows you to create a secondary index. \ -Secondary indexes contain a filtered or a full set of keys in a given keyspace. +:description: The CREATE INDEX statement allows you to create secondary indexes and composite vector indexes. :authorization-overview: xref:server:learn:security/authorization-overview.adoc :index-replication: xref:indexes:index-replication.adoc#index-replication @@ -13,45 +14,68 @@ Secondary indexes contain a filtered or a full set of keys in a given keyspace. :identifiers: xref:n1ql-language-reference/identifiers.adoc :expression: xref:n1ql-language-reference/index.adoc :aggregatefun: xref:n1ql:n1ql-language-reference/aggregatefun.adoc +:flatten-keys: xref:n1ql:n1ql-language-reference/metafun.adoc#flatten_keys +:base64-decode: xref:n1ql:n1ql-language-reference/metafun.adoc#base64-decode :indexing-arrays: xref:n1ql-language-reference/indexing-arrays.adoc :index-partitioning: xref:n1ql-language-reference/index-partitioning.adoc :indexing-meta-info: xref:n1ql-language-reference/indexing-meta-info.adoc :operator-pushdowns: xref:indexes:index_pushdowns.adoc#operator-pushdowns :logical-hierarchy: xref:n1ql:n1ql-intro/queriesandresults.adoc#logical-hierarchy :querying-indexes: xref:n1ql-intro/sysinfo.adoc#querying-indexes +:create-vector-index: xref:n1ql-language-reference/createvectorindex.adoc +:index-training: xref:vector-index:vectors-and-indexes-overview.adoc#index-training +:composite-vector-index: xref:vector-index:composite-vector-index.adoc +:algo-settings: {composite-vector-index}#algo_settings +:prerequisites: {composite-vector-index}#prerequisites // TEMP include::partial$n1ql-language-reference/horizontal-style.adoc[] -The `CREATE INDEX` statement allows you to create a secondary index. +The `CREATE INDEX` statement allows you to create secondary indexes. Secondary indexes contain a filtered or a full set of keys in a given keyspace. Secondary indexes are optional but increase query efficiency on a keyspace. +In clusters running Couchbase Server 8.0 and later, the `CREATE INDEX` statement also allows you to create composite vector indexes. +To create hyperscale vector indexes, use the {create-vector-index}[CREATE VECTOR INDEX] statement. + +//tag::purpose[] == Purpose -`CREATE INDEX` allows you to make multiple concurrent index creation requests. +`{doctitle}` allows you to make multiple concurrent index creation requests. The command starts a task to create the index definition in the background. If there is an index creation task already running, the Index Service queues the incoming index creation request. -`CREATE INDEX` returns as soon as the index creation phase is complete. +`{doctitle}` returns as soon as the index creation phase is complete. By default, when the index creation phase is complete, the Index Service triggers the index build phase. If you lose connectivity, the index build operation continues in the background. You can defer the index build phase using the `defer_build` clause. -In deferred build mode, `CREATE INDEX` creates the index definition, but does not trigger the index build phase. +In deferred build mode, `{doctitle}` creates the index definition, but does not trigger the index build phase. You can then build the index using the {build-index}[BUILD INDEX] command. You can create multiple identical secondary indexes on a keyspace and place them on separate nodes for better index availability. The recommended way to do this is using the `num_replica` option. +See <> for more details. + +Hyperscale vector indexes and composite vector indexes require a codebook for the vector field. +The codebook is the result of sampling the dataset and is saved as part of the index metadata. +The codebook is created as part of the {build-index}[BUILD INDEX] process, and is not incrementally updated. +If the data set changes dramatically, you must drop and rebuild the index to update the codebook. +//end::purpose[] + +//tag::prerequisites[] == Prerequisites [discrete] ===== RBAC Privileges -User executing the CREATE INDEX statement must have the _Query Manage Index_ privilege granted on the keyspace. +To execute the {doctitle} statement, you must have the _Query Manage Index_ privilege granted on the keyspace. For more details about user roles, see {authorization-overview}[Authorization]. +include::partial$n1ql-language-reference/vector-index-no-windows.adoc[] +//end::prerequisites[] + == Syntax [source,ebnf] @@ -71,29 +95,24 @@ The minimum length of an index name is 1 character and there is no maximum lengt When querying, if the index name contains a `#` or `_` character, you must enclose the index name within backticks. keyspace-ref:: (Required) Specifies the keyspace where the index is created. -Refer to <> below. - -index-key:: (Required) Specifies an index key. -Refer to <> below. - -lead-key-attribs:: (Optional) Specifies attributes for the leading index key. -Refer to <> below. +See <>. -key-attribs:: (Optional) Specifies attributes for a non-leading index key. -Refer to <> below. +index-keys-and-attribs:: (Required) Specifies the index keys and index key attributes. +See <>. index-partition:: (Optional) Specifies index partitions. -Refer to <> below. +See <>. where-clause:: (Optional) Specifies filters for a partial index. -Refer to <> below. +See <>. index-using:: (Optional) Specifies the index type. -Refer to <> below. +See <>. index-with:: (Optional) Specifies options for the index. -Refer to <> below. +See <>. +//tag::if-not-exists[] [[if-not-exists]] === IF NOT EXISTS Clause @@ -103,7 +122,9 @@ If an index with the same name already exists within the specified keyspace, the * If this clause is not present, an error is generated. * If this clause is present, the statement does nothing and completes without error. +//end::if-not-exists[] +//tag::keyspace-ref[] [[keyspace-ref]] === Keyspace Reference @@ -118,7 +139,7 @@ Specifies the keyspace for which the index needs to be created. The keyspace reference may be a <> or a <>. NOTE: If there is a hyphen (-) inside any part of the keyspace reference, you must wrap that part of the keyspace reference in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. +See the examples on this page. [[keyspace-path,keyspace path]] ==== Keyspace Path @@ -176,9 +197,33 @@ collection:: ==== For example, `airline` indicates the `airline` collection, assuming the query context is set. ==== +//end::keyspace-ref[] + +[[index-keys-and-attribs]] +=== Index Keys and Attributes + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=index-keys-and-attribs] +---- + +image::n1ql-language-reference/index-keys-and-attribs.png["Syntax diagram: refer to source code listing", align=left] + +Secondary indexes and composite vector indexes can have many keys. +Each key may have index attributes, which define the behavior of the index key. + +[horizontal] +index-key:: (Required) Specifies an index key. +See <>. + +lead-key-attribs:: (Optional) Specifies attributes for the leading index key. +See <>. + +key-attribs:: (Optional) Specifies attributes for a non-leading index key. +See <>. [[index-key]] -=== Index Key +==== Index Key [source,ebnf] ---- @@ -187,21 +232,30 @@ include::partial$grammar/ddl.ebnf[tag=index-key] image::n1ql-language-reference/index-key.png["Syntax diagram: refer to source code listing", align=left] -Refers to an attribute name or a scalar function or an ARRAY expression on the attribute. -This constitutes an index-key for the index. +The index key is a {sqlpp} {expression}[expression] referring to a field in the document, or an ARRAY expression on the field. + +For a composite vector index, one index key must refer to a vector field in the document. +The index key that refers to a vector field may be the only index key. +If there are multiple index keys, the index key referring to the vector field may be any of the index keys, including the leading index key. [horizontal#index-key-args] expr:: -A {sqlpp} {expression}[expression] over any fields in the document. +A field name or a scalar function over any field in the document. This cannot use constant expressions, aggregate functions, or sub-queries. ++ +For a vector field, the expression may be the field name, or a {base64-decode}[BASE64_DECODE()] function on the vector field -- +this is necessary if the embedded vectors are stored as a base64-encoded string. array-expr:: An array expression. Array indexing enables you to create global indexes on array elements and optimize the execution of queries involving array elements. -For details, refer to {indexing-arrays}[Array Indexing]. ++ +For a vector field, only ALL ARRAY is supported. +The {flatten-keys}[FLATTEN_KEYS()] function is supported, but more than one key in {flatten-keys}[FLATTEN_KEYS()] is not permitted. +For details, see {indexing-arrays}[]. [[index-key-attrib]] -=== Index Key Attributes +==== Index Key Attributes [source,ebnf] ---- @@ -220,14 +274,17 @@ image::n1ql-language-reference/key-attribs.png["Syntax diagram: refer to source Specifies attributes for the index key. [horizontal] -index-order:: (Optional) All index keys may include an index order clause. -Refer to <> below. +index-order:: (Optional) Any index key on a non-vector field may include an index order clause. +See <>. + +include-missing:: (Optional) If the leading index key is a non-vector field, it may also include the `INCLUDE MISSING` clause. +See <>. -include-missing:: (Optional) The leading index key may also include `INCLUDE MISSING` clause. -Refer to <> below. +include-vector:: (Optional) In a composite vector index, one index key must include the `VECTOR` keyword. +See <>. [[index-order]] -==== Index Order +===== Index Order [source,ebnf] ---- @@ -237,6 +294,7 @@ include::partial$grammar/ddl.ebnf[tag=index-order] image::n1ql-language-reference/index-order.png["Syntax diagram: refer to source code listing", align=left] Specifies the sort order of the index key. +For non-vector fields only. [horizontal] `ASC`:: @@ -248,7 +306,7 @@ The index key is sorted in descending order. This clause is optional; if omitted, the default is `ASC`. [[include-missing]] -==== INCLUDE MISSING Clause +===== INCLUDE MISSING Clause [source,ebnf] ---- @@ -260,16 +318,35 @@ image::n1ql-language-reference/include-missing.png["Syntax diagram: refer to sou The optional `INCLUDE MISSING` clause ensures that documents which do not include the index key field are indexed regardless. If this clause is not present, then documents without the index key field are not indexed. -The `INCLUDE MISSING` clause can only be applied to the leading index key. +The `INCLUDE MISSING` clause can only be applied to the leading index key for non-vector fields. The `INCLUDE MISSING` clause may be included before or after the `ASC` or `DESC` keyword. +[[include-vector]] +===== VECTOR Keyword + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=index-vector] +---- + +image::n1ql-language-reference/index-vector.png["Syntax diagram: refer to source code listing", align=left] + +Indicates that the index key is a vector field. + +//tag::index-partition[] [[index-partition]] === PARTITION BY HASH Clause Used to partition the index. Index partitioning helps increase the query performance by dividing and spreading a large index of documents across multiple nodes, horizontally scaling out an index as needed. -For details, refer to {index-partitioning}[Index Partitioning]. +For details, see {index-partitioning}[Index Partitioning]. +With hyperscale vector indexes and composite vector indexes, training is done for each index node independently, and the codebook is provided to all partitions on that node. +If there are multiple partitions for an index on a node, training is only done once for all partitions. +See {index-training}[The Importance of Index Training]. +//end::index-partition[] + +//tag::where-clause[] [[where-clause]] === WHERE Clause @@ -283,7 +360,9 @@ image::n1ql-language-reference/where-clause.png["Syntax diagram: refer to source [horizontal#where-clause-args] cond:: Specifies WHERE clause predicates to qualify the subset of documents to include in the index. +//end::where-clause[] +//tag::index-using[] [[index-using]] === USING Clause @@ -296,7 +375,9 @@ image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source The index type for a secondary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. +//end::index-using[] +//tag::index-with[] [[index-with]] === WITH Clause @@ -324,7 +405,7 @@ __optional__ include::partial$n1ql-language-reference/file-based-index-rebalance-note.adoc[] You can specify multiple nodes to distribute replicas of an index across nodes running the indexing service: for example, `WITH {"nodes": ["node1:8091", "node2:8091", "node3:8091"]}`. -For details and examples, refer to {index-replication}[Index Replication]. +For details and examples, see {index-replication}[Index Replication]. If specifying both [.var]`nodes` and [.var]`num_replica`, the number of nodes in the array must be one greater than the specified number of replicas otherwise the index creation will fail. @@ -362,12 +443,101 @@ If the value of this property is not less than the number of index nodes in the **Default:** `1` |Integer +//end::index-with[] +|=== + +Composite vector indexes support the following additional options. + +[options="header", cols="1a,4a,1a"] +|=== +|Name|Description|Schema +//tag::index-with[] + +|**dimension** + +__required__ +| The number of dimensions in the vector. +The embedded model you use to embed the vectors determines the number of dimensions in the vector. +|Integer + +|**similarity** + +__required__ +| Sets the distance metric to use when comparing vectors during index creation. + +Couchbase {product-name} uses the following strings to represent the distance metrics: + +[horizontal.compact] +COSINE:: xref:vector-index:vectors-and-indexes-overview.adoc#cosine[Cosine Similarity] +DOT:: xref:vector-index:vectors-and-indexes-overview.adoc#dot[Dot Product] +L2:: +EUCLIDEAN:: xref:vector-index:vectors-and-indexes-overview.adoc#euclidean[Euclidean Distance] +L2_SQUARED:: +EUCLIDEAN_SQUARED:: xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean Squared Distance] + +For the greatest accuracy, use the distance metric you plan to use to query the data. +|String + +|**description** + +__required__ +| The settings for the quantization and index algorithms. +The string is made up of the following settings: + +[horizontal.compact] +IVF:: The number of centroids allocated for the index. +SQ:: For scalar quantization -- the number of bits used to store the centroid for each bin. +PQ:: For product quantization -- the number of subquantizers, and the number of bits in the centroid's index value. + +For more information, see {algo-settings}[Quantization and Centroid Settings]. + +**Pattern:** `^IVF[0-9]*,(SQ[468]|PQ[0-9]+x[0-9]+)$` +|String + +|**scan_nprobes** + +__optional__ +| The number of cells to search for each scan. + +**Default:** `1` +|Integer + +|**train_list** + +__optional__ +| The size of the sample set of vectors to be used for index training. + +If the index count is <{nbsp}10000, the default is to sample everything. + +Otherwise, the default value is 10% of the index count, or 10{nbsp}× the number of centroids, whichever is higher. + +**Maximum:** `1000000` +|Integer + +ifeval::["{docname}" == "createvectorindex"] +|**persist_full_vector** + +__optional__ +| If `true` (the default), the index stores the full vector value in addition to the quantized value. +This significantly increases the size of the index. + +Set to `false` if you do not plan to use reranking. +For more information, see {hyperscale-reranking}[]. + +**Default:** `true` +|Boolean +endif::[] |=== +Partitioned indexes support further options. +See {index-partitioning}[]. +//end::index-with[] + +//tag::usage[] == Usage -NOTE: It is not recommended to create (or drop) secondary indexes when any node with a secondary index role is down, as this may result in duplicate index names. +[IMPORTANT] +.Attention +==== +Do not create (or drop) secondary indexes, composite vector indexes, or hyperscale vector indexes when any Index service node is down, as this may result in duplicate index names. +==== +//end::usage[] +//tag::monitoring-indexes[] === Monitoring Indexes Index metadata provides a state field. @@ -388,19 +558,21 @@ include::example$n1ql-language-reference/build-idx-error.jsonc[] If the Index Service still cannot create the index after the maximum number of retries, the index state is marked as `offline`. You must drop the failed index using the `DROP INDEX` command. ==== +//end::monitoring-indexes[] [[indexing-metadata]] -=== Using the `meta().id` Function +=== Indexing Metadata -You can create indexes on metadata information. -For details, refer to {indexing-meta-info}[Indexing Meta Info]. +You can create indexes on metadata using the `META()` function. +For details, see {indexing-meta-info}[]. [[index-aggregates]] === Using Indexes for Aggregates If you have an index on a simple expression, such as `geo.alt`, you can use that index to satisfy a query on an {aggregatefun}[aggregate] of that expression, such as `MIN(geo.alt)` or `MAX(geo.alt)`. -For details and examples, refer to {operator-pushdowns}[Operator Pushdowns]. +For details and examples, see {operator-pushdowns}[Operator Pushdowns]. +//tag::index-replicas[] [[index-replicas]] === Index Replicas @@ -419,6 +591,11 @@ The system automatically load-balances an index scan across the index and all it Adding index replicas enables you to scale scan throughput, in addition to providing high availability. ==== +With hyperscale vector indexes and composite vector indexes, training is done by each replica index independently, and the codebook is stored as part of index metadata. +See {index-training}[The Importance of Index Training]. +//end::index-replicas[] + +//tag::defer-index-builds-by-default[] ifdef::flag-devex-rest-api[] === Defer Index Builds by Default @@ -432,6 +609,7 @@ If you change the default setting for `defer_build` to `true`, index creation op To change the default setting for deferred builds, use the Index Settings REST API to set the `indexer.settings.defer_build` property. For an example, see xref:index-rest-settings:index.adoc#ex-defer-build[Defer Index Builds by Default]. endif::flag-devex-rest-api[] +//end::defer-index-builds-by-default[] == Examples @@ -537,6 +715,48 @@ The following statement will index all airports, even if the `district` field is ---- include::example$n1ql-language-reference/create-idx-include.n1ql[] ---- -==== For more examples of indexes where the leading key may be missing, see xref:n1ql:n1ql-language-reference/selectintro.adoc#index-selection[Index Selection]. +==== + +[[eex-create-rgb-idx]] +.Create a composite vector index +==== +For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +The path to the required keyspace is specified by the query, so you do not need to set the query context. + +Create a composite vector index that indexes the vector field named `colorvect_l2`, as well as the scalar `color` and `brightness` fields. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-idx] +---- +==== + +[[ex-create-vectors-idx]] +.Create a composite vector index using embedded vectors +==== +For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +The path to the required keyspace is specified by the query, so you do not need to set the query context. + +Create a composite vector index that indexes the vector field named `embedding-vector-dot`, as well as the scalar `color` and `brightness` fields. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-idx] +---- +==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc index f9c248fe9..30d1835c3 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc @@ -1,5 +1,6 @@ = CREATE PRIMARY INDEX :page-topic-type: reference +:page-toclevels: 2 :imagesdir: ../../assets/images :keywords: primary, index, placement :description: The CREATE PRIMARY INDEX statement allows you to create a primary index. \ @@ -19,7 +20,7 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] The `CREATE PRIMARY INDEX` statement allows you to create a primary index. Primary indexes contain a full set of keys in a given keyspace. -Primary indexes are optional and are only required for running ad hoc queries on a keyspace that is not supported by a secondary index. +Primary indexes are optional -- they enable you to run ad hoc queries on a keyspace that is not supported by a secondary index. == Purpose @@ -36,14 +37,14 @@ You can then build the index using the {build-index}[BUILD INDEX] command. You can create multiple identical primary indexes on a keyspace and place them on separate nodes for better index availability. The recommended way to do this is using the `num_replicas` option. -Refer to <> below for more details. +See <> for more details. == Prerequisites [discrete] ===== RBAC Privileges -Users executing the `CREATE PRIMARY INDEX` statement must have the _Query Manage Index_ privilege granted on the keyspace. +To execute the `CREATE PRIMARY INDEX` statement, you must have the _Query Manage Index_ privilege granted on the keyspace. For more details about user roles, see {authorization-overview}[Authorization]. @@ -61,23 +62,20 @@ image::n1ql-language-reference/create-primary-index.png["Syntax diagram: refer t [horizontal] index-name:: (Optional) A unique name that identifies the index. -If a name is not specified, the default name of `#primary` is applied. [small]##[<>]## +If a name is not specified, the default name of `#primary` is applied. + Valid GSI index names can contain any of the following characters: `A-Z` `a-z` `0-9` `#` `_`, and must start with a letter, [`A-Z` `a-z`]. The minimum length of an index name is 1 character and there is no maximum length set for an index name. When querying, if the index name contains a `#` or `_` character, you must enclose the index name within backticks. keyspace-ref:: [Required] Specifies the keyspace where the index is created. -Refer to <> below. +See <>. index-using:: (Optional) Specifies the index type. -Refer to <> below. +See <>. index-with:: (Optional) Specifies options for the index. -Refer to <> below. - -[[note-index-name,note]] -NOTE: You can drop unnamed primary indexes using the `DROP PRIMARY INDEX` statement, and named primary indexes using the `DROP INDEX` statement. +See <>. [[if-not-exists]] === IF NOT EXISTS Clause @@ -103,7 +101,7 @@ Specifies the keyspace for which the index needs to be created. The keyspace reference may be a <> or a <>. NOTE: If there is a hyphen (-) inside any part of the keyspace reference, you must wrap that part of the keyspace reference in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. +See the examples on this page. [[keyspace-path,keyspace path]] ==== Keyspace Path @@ -350,3 +348,17 @@ include::example$n1ql-language-reference/check-pri-online.n1ql[] The output from `system:indexes` shows that the index has now been created. ==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc new file mode 100644 index 000000000..6174e2db0 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc @@ -0,0 +1,231 @@ += CREATE VECTOR INDEX +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:page-toclevels: 2 +:imagesdir: ../../assets/images +:keywords: secondary, index, placement +:description: The CREATE VECTOR INDEX statement allows you to create hyperscale vector indexes. + +:authorization-overview: xref:learn:security/authorization-overview.adoc +:index-replication: xref:indexes:index-replication.adoc#index-replication +:console-indexes: xref:manage:manage-ui/manage-ui.adoc#console-indexes +:query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context +:build-index: xref:n1ql-language-reference/build-index.adoc +:identifiers: xref:n1ql-language-reference/identifiers.adoc +:expression: xref:n1ql-language-reference/index.adoc +:aggregatefun: xref:n1ql:n1ql-language-reference/aggregatefun.adoc +:flatten-keys: xref:n1ql:n1ql-language-reference/metafun.adoc#flatten_keys +:base64-decode: xref:n1ql:n1ql-language-reference/metafun.adoc#base64-decode +:indexing-arrays: xref:n1ql-language-reference/indexing-arrays.adoc +:index-partitioning: xref:n1ql-language-reference/index-partitioning.adoc +:indexing-meta-info: xref:n1ql-language-reference/indexing-meta-info.adoc +:operator-pushdowns: xref:indexes:index_pushdowns.adoc#operator-pushdowns +:logical-hierarchy: xref:n1ql:n1ql-intro/queriesandresults.adoc#logical-hierarchy +:querying-indexes: xref:n1ql-intro/sysinfo.adoc#querying-indexes +:create-index: xref:n1ql-language-reference/createindex.adoc +:index-training: xref:vector-index:vectors-and-indexes-overview.adoc#index-training +:hyperscale-vector-index: xref:vector-index:hyperscale-vector-index.adoc +:hyperscale-filter: xref:vector-index:hyperscale-filter.adoc +:hyperscale-reranking: xref:vector-index:hyperscale-reranking.adoc +:algo-settings: {hyperscale-vector-index}#algo_settings +:prerequisites: {hyperscale-vector-index}#prerequisites + +// TEMP +include::partial$n1ql-language-reference/horizontal-style.adoc[] + +The `CREATE VECTOR INDEX` statement allows you to create hyperscale vector indexes. + +To create secondary indexes or composite vector indexes, use the {create-index}[CREATE INDEX] statement. + +include::createindex.adoc[tags=purpose] + +include::createindex.adoc[tags=prerequisites] + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=create-vector-index] +---- + +image::n1ql-language-reference/create-vector-index.png["Syntax diagram: refer to source code listing", align=left] + +// TODO: Automatic links in EBNF. + +[horizontal#index-name, reftext="index-name"] +index-name:: (Required) A unique name that identifies the index. ++ +Valid GSI index names can contain any of the following characters: `A-Z` `a-z` `0-9` `#` `_`, and must start with a letter, [`A-Z` `a-z`]. +The minimum length of an index name is 1 character and there is no maximum length set for an index name. +When querying, if the index name contains a `#` or `_` character, you must enclose the index name within backticks. + +keyspace-ref:: (Required) Specifies the keyspace where the index is created. +See <>. + +index-key-and-attrib:: (Required) Specifies the index key and index key attribute. +See <>. + +index-include:: (Optional) Specifies non-key fields to include in the index. +See <>. + +index-partition:: (Optional) Specifies index partitions. +See <>. + +where-clause:: (Optional) Specifies filters for a partial index. +See <>. + +index-using:: (Optional) Specifies the index type. +See <>. + +index-with:: (Optional) Specifies options for the index. +See <>. + +include::createindex.adoc[tags=if-not-exists] + +include::createindex.adoc[tags=keyspace-ref] + +[[index-key-and-attrib]] +=== Index Key and Attribute + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tags=index-key-and-attrib] +---- + +image::n1ql-language-reference/index-key-and-attrib.png["Syntax diagram: refer to source code listing", align=left] + +Hyperscale vector indexes only have one key, which must be a vector field. +The index key takes one attribute, the VECTOR keyword. + +[horizontal] +index-key:: (Required) Specifies an index key. +See <>. + +index-vector:: (Required) Specifies an attribute for the index key. +See <>. + +[[index-key]] +==== Index Key + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=index-key] +---- + +image::n1ql-language-reference/index-key.png["Syntax diagram: refer to source code listing", align=left] + +The index key is a {sqlpp} {expression}[expression] referring to a vector field, or an ARRAY expression on the vector field. + +[horizontal#index-key-args] +expr:: +The name of a vector field in the document, or a {base64-decode}[BASE64_DECODE()] function on the vector field -- +this is necessary if the embedded vectors are stored as a base64-encoded string. + +array-expr:: +An array expression on a vector field in the document. +Only ALL ARRAY is supported. +The {flatten-keys}[FLATTEN_KEYS()] function is supported, but more than one key in {flatten-keys}[FLATTEN_KEYS()] is not permitted. +For details, see {indexing-arrays}[]. + +[[include-vector]] +==== VECTOR Keyword + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=index-vector] +---- + +image::n1ql-language-reference/index-vector.png["Syntax diagram: refer to source code listing", align=left] + +Indicates that the index key is a vector field. + +[[index-include]] +=== INCLUDE Clause + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=index-include] +---- + +image::n1ql-language-reference/index-include.png["Syntax diagram: refer to source code listing", align=left] + +Used to include scalar fields in the index, which you can use to filter the vector search. +The INCLUDE clause cannot include a vector field. +For details, see {hyperscale-filter}[]. + +[horizontal#index-include-args] +expr:: +A {sqlpp} {expression}[expression] referring to any scalar field in the document. + +include::createindex.adoc[tags=index-partition] + +include::createindex.adoc[tags=where-clause] + +include::createindex.adoc[tags=index-using] + +include::createindex.adoc[tags=index-with] + +include::createindex.adoc[tags=usage] + +include::createindex.adoc[tags=monitoring-indexes] + +include::createindex.adoc[tags=index-replicas] + +include::createindex.adoc[tags=defer-index-builds-by-default] + +== Examples + +To try the examples in this section, you must install the vector sample data as described in {prerequisites}[Prerequisites]. + +[[ex-create-rgb-idx]] +.Create a hyperscale vector index +==== +For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. + +Create a hyperscale vector index for the vector column named `embedding-vector-dot`. + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-rgb-idx] +---- +==== + +[[ex-create-idx-brightness]] +.Create a hyperscale vector index with included scalar values +==== +For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. + +Create a hyperscale vector index for the vector column named `embedding-vector-dot`, including the scalar `brightness` field. + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-idx-brightness] +---- +==== + +[[ex-create-rgb-no-persist]] +.Create a hyperscale vector index with no reranking +==== +For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. + +Create a hyperscale vector index from the example RGB dataset that does not persist the full vector value. + +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-rgb-no-persist] +---- +==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc index aee6c4260..5ec777f48 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc @@ -1,6 +1,8 @@ = DROP INDEX -:description: The DROP INDEX statement allows you to drop a named primary index or a secondary index. +:description: The DROP INDEX statement allows you to drop a secondary index, a composite vector index, or a hyperscale vector index. :page-topic-type: reference +:page-partial: +:page-toclevels: 2 :imagesdir: ../../assets/images :authorization-overview: xref:server:learn:security/authorization-overview.adoc @@ -8,22 +10,31 @@ :logical-hierarchy: xref:n1ql-intro/queriesandresults.adoc#logical-hierarchy :identifiers: xref:n1ql-language-reference/identifiers.adoc :drop-primary-index: xref:n1ql-language-reference/dropprimaryindex.adoc +:drop-vector-index: xref:n1ql-language-reference/dropvectorindex.adoc // TEMP include::partial$n1ql-language-reference/horizontal-style.adoc[] {description} -Dropping an index that has replicas will also drop all of the replica indexes too. -You can drop unnamed primary indexes using the {drop-primary-index}[DROP PRIMARY INDEX] statement. +Dropping an index that has replicas will drop all of the replica indexes too. +The {drop-vector-index}[DROP VECTOR INDEX] statement is a synonym for the DROP INDEX statement. +The two statements have the same functionality. + +[NOTE] +To drop a primary index, use the {drop-primary-index}[DROP PRIMARY INDEX] statement. +For compatibility with legacy versions of Couchbase Server, you can also use DROP INDEX or DROP VECTOR INDEX to drop a named primary index. + +// tag::prerequisites[] == Prerequisites [discrete] ===== RBAC Privileges -User executing the DROP INDEX statement must have the _Query Manage Index_ privilege granted on the keyspace/bucket. +To use the {doctitle} statement, you must have the _Query Manage Index_ privilege on the keyspace or bucket. For more details about user roles, see {authorization-overview}[Authorization]. +// end::prerequisites == Syntax @@ -34,34 +45,46 @@ include::partial$grammar/ddl.ebnf[tag=drop-index] image::n1ql-language-reference/drop-index.png["Syntax diagram: refer to source code listing", align=left] -The DROP INDEX statement provides two possible syntaxes for specifying the index and the keyspace where the index is located. +//tag::syntax-arguments[] +The {doctitle} statement provides two possible syntaxes for specifying the index and the keyspace where the index is located. // TODO: Automatic links in EBNF. [horizontal] -index-name:: (Required) A unique name that identifies the index. +index-path-and-name:: (Optional) One possible syntax for specifying the index and keyspace. +See <>. -index-path:: (Optional) One possible syntax for specifying the the keyspace. -Refer to <> below. +index-name-on-keyspace:: (Optional) The other possible syntax for specifying the index and keyspace. +See <>. -keyspace-ref:: (Optional) The other possible syntax for specifying the keyspace. -Refer to <> below. +index-using:: (Optional) Specifies the index type. +See <>. +//end::syntax-arguments[] -index-using:: Specifies the index type. -(Optional) Refer to <> below. +//tag::index-path-and-name[] +[[index-path-and-name]] +=== Index Path and Name -[[if-exists]] -=== IF EXISTS Clause +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=index-path-and-name] +---- -The optional `IF EXISTS` clause enables the statement to complete successfully when the specified index doesn't exist. -If the index does not exist within the specified keyspace, then: +image::n1ql-language-reference/index-path-and-name.png["Syntax diagram: refer to source code listing", align=left] -* If this clause is not present, an error is generated. +You can use a dotted notation to specify the index and the keyspace on which the index is built. +This syntax provides compatibility with legacy versions of Couchbase Server. -* If this clause is present, the statement does nothing and completes without error. +[horizontal] +index-name:: (Required) A unique name that identifies the index. + +index-path:: (Required) See <>. + +NOTE: If there is a hyphen (-) inside the index name or any part of the index path, you must wrap the index name or that part of the index path in backticks ({backtick}{nbsp}{backtick}). +See the examples on this page. [[index-path]] -=== Index Path +==== Index Path [source,ebnf] ---- @@ -70,15 +93,10 @@ include::partial$grammar/ddl.ebnf[tag=index-path] image::n1ql-language-reference/index-path.png["Syntax diagram: refer to source code listing", align=left] -You can use a dotted notation to specify the index and the keyspace on which the index is built. -This syntax provides compatibility with legacy versions of Couchbase Server. The index path may be a <>, a <>, or a <>. -NOTE: If there is a hyphen (-) inside the index name or any part of the index path, you must wrap the index name or that part of the index path in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. - [[keyspace-full-index,full keyspace path]] -==== Index Path: Full Keyspace +===== Index Path: Full Keyspace [source,ebnf] ---- @@ -109,7 +127,7 @@ For example, `default:{backtick}travel-sample{backtick}.inventory.airline.{backt ==== [[keyspace-prefix-index,keyspace prefix]] -==== Index Path: Keyspace Prefix +===== Index Path: Keyspace Prefix [source,ebnf] ---- @@ -135,7 +153,7 @@ For example, `default:{backtick}travel-sample{backtick}.def_type` indicates the ==== [[keyspace-partial-index,keyspace partial]] -==== Index Path: Keyspace Partial +===== Index Path: Keyspace Partial [source,ebnf] ---- @@ -155,9 +173,29 @@ collection:: For example, `airline.{backtick}idx-name{backtick}` indicates the `idx-name` index on the `airline` collection, assuming that the query context is set. ==== -[[keyspace-ref]] +[[index-name-on-keyspace]] === Index Name ON Keyspace Reference +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tags=index-name-on-keyspace] +---- + +image::n1ql-language-reference/index-name-on-keyspace.png["Syntax diagram: refer to source code listing", align=left] + +You can use the index name with the `ON` keyword and a keyspace reference to specify the index and the keyspace on which the index is built. + +[horizontal] +index-name:: (Required) A unique name that identifies the index. + +keyspace-ref:: (Required) See <>. + +NOTE: If there is a hyphen (-) inside the index name or any part of the keyspace reference, you must wrap the index name or that part of the keyspace reference in backticks ({backtick}{nbsp}{backtick}). +See the examples on this page. + +[[keyspace-ref]] +==== Keyspace Reference + [source,ebnf] ---- include::partial$grammar/dql.ebnf[tag=keyspace-ref] @@ -165,14 +203,10 @@ include::partial$grammar/dql.ebnf[tag=keyspace-ref] image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] -You can use the index name with the `ON` keyword and a keyspace reference to specify the keyspace on which the index is built. The keyspace reference may be a <> or a <>. -NOTE: If there is a hyphen (-) inside the index name or any part of the keyspace reference, you must wrap the index name or that part of the keyspace reference in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. - [[keyspace-path,keyspace path]] -==== Keyspace Reference: Keyspace Path +===== Keyspace Reference: Keyspace Path [source,ebnf] ---- @@ -208,7 +242,7 @@ Similarly, `{backtick}idx-name{backtick} ON default:{backtick}travel-sample{back ==== [[keyspace-partial,keyspace partial]] -==== Keyspace Reference: Keyspace Partial +===== Keyspace Reference: Keyspace Partial [source,ebnf] ---- @@ -227,7 +261,21 @@ collection:: ==== For example, `{backtick}idx-name{backtick} ON airline` indicates the `idx-name` index on the `airline` collection, assuming the query context is set. ==== +//end::index-path-and-name[] +//tag::if-exists[] +[[if-exists]] +=== IF EXISTS Clause + +The optional `IF EXISTS` clause enables the statement to complete successfully when the specified index doesn't exist. +If the index does not exist within the specified keyspace, then: + +* If this clause is not present, an error is generated. + +* If this clause is present, the statement does nothing and completes without error. +//end::if-exists[] + +//tag::index-using[] [[index-using]] === USING Clause @@ -240,10 +288,12 @@ image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source The index type for a secondary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. +//end::index-using[] +//tag::usage[] == Usage -When using memory-optimized indexes, DROP INDEX is an expensive operation and may take a few minutes to complete. +When using memory-optimized indexes, {doctitle} is an expensive operation and may take a few minutes to complete. If you drop an index with replicas while one of the index nodes is failed over, then only the replicas in the active index nodes are dropped. If the failed-over index node is recovered, then the orphan replica will be dropped when this failed-over indexer is added back to cluster. @@ -252,8 +302,12 @@ If you drop an index with replicas when one of the index nodes is unavailable bu If you drop an index which is scheduled for background creation, a warning message is generated, but the drop index operation succeeds. -[caption=Attention] -IMPORTANT: We recommend that you do not drop (or create) secondary indexes when any node with a secondary index role is down as this may result in duplicate index names. +[IMPORTANT] +.Attention +==== +Do not drop (or create) secondary indexes, composite vector indexes, or hyperscale vector indexes when any Index service node is down, as this may result in duplicate index names. +==== +//end::usage[] == Examples @@ -335,3 +389,17 @@ The following command would drop the index in exactly the same way, but uses alt include::example$n1ql-language-reference/drop-idx-alt.n1ql[] ---- ==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc index dbb226962..4ef21a6ba 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc @@ -1,6 +1,7 @@ = DROP PRIMARY INDEX -:description: The DROP PRIMARY INDEX statement allows you to drop an unnamed primary index. +:description: The DROP PRIMARY INDEX statement allows you to drop a primary index. :page-topic-type: reference +:page-toclevels: 2 :imagesdir: ../../assets/images :roles: xref:server:learn:security/roles.adoc @@ -13,14 +14,14 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] {description} -IMPORTANT: Named primary indexes that are created using CREATE PRIMARY INDEX can only be dropped using the DROP INDEX command. +NOTE: For compatibility with legacy versions of Couchbase Server, you can also use the DROP INDEX or DROP VECTOR INDEX statement to drop a named primary index. == Prerequisites [discrete] ===== RBAC Privileges -User executing the DROP PRIMARY INDEX statement must have the _Query Manage Index_ privilege granted on the keyspace. +To execute the DROP PRIMARY INDEX statement, you must have the _Query Manage Index_ privilege granted on the keyspace. For more details about user roles, see {roles}[Roles]. == Syntax @@ -35,11 +36,14 @@ image::n1ql-language-reference/drop-primary-index.png["Syntax diagram: refer to // TODO: Automatic links in EBNF. [horizontal] +index-name:: (Optional) A unique name that identifies the index. +If you don't specify a name, the index with the default name of `#primary` is deleted. + keyspace-ref:: (Required) Specifies the keyspace where the index is located. -Refer to <> below. +See <>. index-using:: (Optional) Specifies the index type. -Refer to <> below. +See <>. [[if-exists]] === IF EXISTS Clause @@ -65,7 +69,7 @@ Specifies the keyspace for the primary index to drop. The keyspace reference may be a <> or a <>. NOTE: If there is a hyphen (-) inside any part of the keyspace reference, you must wrap that part of the keyspace reference in backticks ({backtick}{nbsp}{backtick}). -Refer to the examples below. +See the examples on this page. [[keyspace-path,keyspace path]] ==== Keyspace Path @@ -157,4 +161,18 @@ Subsequently, drop the unnamed primary index with the following statement so tha ---- include::example$n1ql-language-reference/drop-pri-nameless.n1ql[tags=**] ---- -==== \ No newline at end of file +==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] +| xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[DROP VECTOR INDEX] diff --git a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc new file mode 100644 index 000000000..ba3442aca --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc @@ -0,0 +1,89 @@ += DROP VECTOR INDEX +:description: The DROP VECTOR INDEX statement allows you to drop a hyperscale vector index, a composite vector index, or a secondary index. +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:page-toclevels: 2 +:imagesdir: ../../assets/images + +:authorization-overview: xref:learn:security/authorization-overview.adoc +:query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context +:logical-hierarchy: xref:n1ql-intro/queriesandresults.adoc#logical-hierarchy +:identifiers: xref:n1ql-language-reference/identifiers.adoc +:drop-primary-index: xref:n1ql-language-reference/dropprimaryindex.adoc +:drop-index: xref:n1ql-language-reference/dropindex.adoc +:prerequisites: xref:vector-index:hyperscale-vector-index.adoc#prerequisites + +// TEMP +include::partial$n1ql-language-reference/horizontal-style.adoc[] + +{description} +Dropping an index that has replicas will drop all of the replica indexes too. + +The {drop-index}[DROP INDEX] statement is a synonym for the DROP VECTOR INDEX statement. +The two statements have the same functionality. + +[NOTE] +To drop a primary index, use the {drop-primary-index}[DROP PRIMARY INDEX] statement. +For compatibility with legacy versions of Couchbase Server, you can also use DROP INDEX or DROP VECTOR INDEX to drop a named primary index. + +include::dropindex.adoc[tags=prerequisites] + +== Syntax + +[source,ebnf] +---- +include::partial$grammar/ddl.ebnf[tag=drop-vector-index] +---- + +image::n1ql-language-reference/drop-vector-index.png["Syntax diagram: refer to source code listing", align=left] + +include::dropindex.adoc[tags=syntax-arguments] + +include::dropindex.adoc[tags=index-path-and-name] + +include::dropindex.adoc[tags=if-exists] + +include::dropindex.adoc[tags=index-using] + +include::dropindex.adoc[tags=usage] + +== Examples + +To try the examples in this section, you must install the vector sample data as described in {prerequisites}[Prerequisites]. + +[[ex-1]] +.Drop a hyperscale vector index +==== +For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. + +Drop the hyperscale vector index called `color_desc_hyperscale`, if it exists. + +[source,sqlpp] +---- +DROP VECTOR INDEX `color_desc_hyperscale` + IF EXISTS + ON `vector-sample`.color.rgb +---- + +The following command would drop the index in exactly the same way, but uses alternative syntax. + +[source,sqlpp] +---- +DROP VECTOR INDEX IF EXISTS + default:`vector-sample`.color.rgb.`color_desc_hyperscale` +---- +==== + +== Related Links + +* xref:indexes:indexing-overview.adoc[] +* xref:vector-index:composite-vector-index.adoc[] +* xref:vector-index:hyperscale-vector-index.adoc[] +* xref:n1ql:n1ql-language-reference/createprimaryindex.adoc[CREATE PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/createindex.adoc[CREATE INDEX] +| xref:n1ql:n1ql-language-reference/createvectorindex.adoc[CREATE VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/build-index.adoc[BUILD INDEX] +* xref:n1ql:n1ql-language-reference/alterindex.adoc[ALTER INDEX] +| xref:n1ql:n1ql-language-reference/altervectorindex.adoc[ALTER VECTOR INDEX] +* xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[DROP PRIMARY INDEX] +| xref:n1ql:n1ql-language-reference/dropindex.adoc[DROP INDEX] diff --git a/modules/n1ql/partials/grammar/ddl.ebnf b/modules/n1ql/partials/grammar/ddl.ebnf index 909e23585..07a6795c8 100644 --- a/modules/n1ql/partials/grammar/ddl.ebnf +++ b/modules/n1ql/partials/grammar/ddl.ebnf @@ -8,6 +8,7 @@ create-statement ::= create-scope | create-collection | create-primary-index | create-index + | create-vector-index | create-function | create-sequence | create-user @@ -18,6 +19,7 @@ drop-statement ::= drop-scope | drop-collection | drop-primary-index | drop-index + | drop-vector-index | drop-function | drop-sequence | drop-user @@ -27,6 +29,7 @@ drop-statement ::= drop-scope other-statement ::= alter-bucket | alter-group | alter-index + | alter-vector-index | alter-sequence | alter-user | build-index @@ -74,7 +77,8 @@ drop-collection ::= 'DROP' 'COLLECTION' ( ( namespace ':' )? bucket '.' scope '. ***********/ /* tag::create-primary-index[] */ -create-primary-index ::= 'CREATE' 'PRIMARY' 'INDEX' index-name? ( 'IF' 'NOT' 'EXISTS' )? +create-primary-index ::= 'CREATE' 'PRIMARY' 'INDEX' ( index-name? ( 'IF' 'NOT' 'EXISTS' )? | + 'IF' 'NOT' 'EXISTS' index-name ) 'ON' keyspace-ref index-using? index-with? /* end::create-primary-index[] */ @@ -87,21 +91,39 @@ index-with ::= 'WITH' expr /* end::index-with[] */ /* tag::create-index[] */ -create-index ::= 'CREATE' 'INDEX' index-name ( 'IF' 'NOT' 'EXISTS' )? 'ON' keyspace-ref - '(' index-key lead-key-attribs? ( ( ',' index-key key-attribs? )+ )? ')' +create-index ::= 'CREATE' 'INDEX' ( index-name ( 'IF' 'NOT' 'EXISTS' )? | + 'IF' 'NOT' 'EXISTS' index-name ) 'ON' keyspace-ref + '(' index-keys-and-attribs ')' index-partition? where-clause? index-using? index-with? /* end::create-index[] */ +/* tag::create-vector-index[] */ +create-vector-index ::= 'CREATE' 'VECTOR' 'INDEX' ( index-name ( 'IF' 'NOT' 'EXISTS' )? | + 'IF' 'NOT' 'EXISTS' index-name ) 'ON' keyspace-ref + '(' index-key-and-attrib ')' + index-include? index-partition? where-clause? index-using? index-with? +/* end::create-vector-index[] */ + +/* tag::index-keys-and-attribs[] */ +index-keys-and-attribs ::= index-key lead-key-attribs? ( ( ',' index-key key-attribs? )+ )? +/* end::index-keys-and-attribs[] */ + +/* tag::index-key-and-attrib[] */ +index-key-and-attrib ::= index-key index-vector +/* end::index-key-and-attrib[] */ + /* tag::index-key[] */ index-key ::= expr | array-expr /* end::index-key[] */ /* tag::lead-key-attribs[] */ -lead-key-attribs ::= index-order include-missing? | include-missing index-order? +lead-key-attribs ::= index-order include-missing? | + include-missing index-order? | + index-vector /* end::lead-key-attribs[] */ /* tag::key-attribs[] */ -key-attribs ::= index-order +key-attribs ::= index-order | index-vector /* end::key-attribs[] */ /* tag::include-missing[] */ @@ -112,6 +134,10 @@ include-missing ::= 'INCLUDE' 'MISSING' index-order ::= 'ASC' | 'DESC' /* end::index-order[] */ +/* tag::index-vector[] */ +index-vector ::= 'VECTOR' +/* end::index-vector[] */ + /* tag::array-expr[] */ array-expr ::= full-array-expr | simple-array-expr /* end::array-expr[] */ @@ -134,6 +160,10 @@ pairs-function ::= 'PAIRS' '(' ( 'SELF' | index-key-object ) ')' index-key-object ::= expr /* end::index-key-object[] */ +/* tag::index-include[] */ +index-include ::= 'INCLUDE' '(' expr ( ',' expr )* ')' +/* end::index-include[] */ + /* tag::index-partition[] */ index-partition ::= 'PARTITION' 'BY' 'HASH' '(' partition-key-expr ( ',' partition-key-expr )* ')' @@ -144,10 +174,15 @@ partition-key-expr ::= expr /* end::partition-key-expr[] */ /* tag::alter-index[] */ -alter-index ::= 'ALTER' 'INDEX' ( index-path '.' index-name | index-name 'ON' keyspace-ref ) - index-using? index-with +alter-index ::= 'ALTER' 'INDEX' ( index-path '.' index-name | + index-name 'ON' keyspace-ref ) index-using? index-with /* end::alter-index[] */ +/* tag::alter-vector-index[] */ +alter-vector-index ::= 'ALTER' 'VECTOR' 'INDEX' ( index-path '.' index-name | + index-name 'ON' keyspace-ref ) index-using? index-with +/* end::alter-vector-index[] */ + /* tag::build-index[] */ build-index ::= 'BUILD' 'INDEX' 'ON' keyspace-ref '(' index-term (',' index-term)* ')' index-using? @@ -162,15 +197,30 @@ index-expr ::= string | array /* end::index-expr[] */ /* tag::drop-primary-index[] */ -drop-primary-index ::= 'DROP' 'PRIMARY' 'INDEX' ( 'IF' 'EXISTS' )? 'ON' keyspace-ref - index-using? +drop-primary-index ::= 'DROP' 'PRIMARY' 'INDEX' ( index-name? ( 'IF' 'EXISTS' )? | + 'IF' 'EXISTS' index-name ) 'ON' keyspace-ref index-using? /* end::drop-primary-index[] */ /* tag::drop-index[] */ -drop-index ::= 'DROP' 'INDEX' ( index-path '.' index-name ( 'IF' 'EXISTS' )? | - index-name ( 'IF' 'EXISTS' )? 'ON' keyspace-ref ) index-using? +drop-index ::= 'DROP' 'INDEX' ( index-path-and-name | index-name-on-keyspace ) + index-using? /* end::drop-index[] */ +/* tag::drop-vector-index[] */ +drop-vector-index ::= 'DROP' 'VECTOR' 'INDEX' ( index-path-and-name | index-name-on-keyspace ) + index-using? +/* end::drop-vector-index[] */ + +/* tag::index-path-and-name[] */ +index-path-and-name ::= index-path '.' index-name ( 'IF' 'EXISTS' )? | + 'IF' 'EXISTS' index-path '.' index-name +/* end::index-path-and-name[] */ + +/* tag::index-name-on-keyspace[] */ +index-name-on-keyspace ::= ( index-name ( 'IF' 'EXISTS' )? | 'IF' 'EXISTS' index-name ) + 'ON' keyspace-ref +/* end::index-name-on-keyspace[] */ + /* tag::index-path[] */ index-path ::= keyspace-full | keyspace-prefix | keyspace-partial /* end::index-path[] */ diff --git a/modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc b/modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc new file mode 100644 index 000000000..bf7ee376e --- /dev/null +++ b/modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc @@ -0,0 +1,5 @@ +[IMPORTANT] +-- +You cannot use Hyperscale Vector Indexes or Composite Vector Indexes on Windows platforms. +You can use Hyperscale Vector Indexes and Composite Vector Indexes in Couchbase Server version 8.0 and later on Linux and macOS. +-- \ No newline at end of file diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index 3689eccd1..1f54cd50c 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -93,6 +93,7 @@ endif::flag-devex-javascript-udfs[] **** xref:n1ql:n1ql-language-reference/alterindex.adoc[] **** xref:n1ql:n1ql-language-reference/altersequence.adoc[] **** xref:n1ql:n1ql-language-reference/alteruser.adoc[] + **** xref:n1ql:n1ql-language-reference/altervectorindex.adoc[] **** xref:n1ql:n1ql-language-reference/begin-transaction.adoc[] **** xref:n1ql:n1ql-language-reference/build-index.adoc[] **** xref:n1ql:n1ql-language-reference/commit-transaction.adoc[] @@ -109,6 +110,7 @@ endif::flag-devex-javascript-udfs[] **** xref:n1ql:n1ql-language-reference/createsequence.adoc[] **** xref:n1ql:n1ql-language-reference/createscope.adoc[] **** xref:n1ql:n1ql-language-reference/createuser.adoc[] + **** xref:n1ql:n1ql-language-reference/createvectorindex.adoc[] **** xref:n1ql:n1ql-language-reference/delete.adoc[] **** xref:n1ql:n1ql-language-reference/dropbucket.adoc[] **** xref:n1ql:n1ql-language-reference/dropcollection.adoc[] @@ -117,6 +119,7 @@ endif::flag-devex-javascript-udfs[] **** xref:n1ql:n1ql-language-reference/dropindex.adoc[] **** xref:n1ql:n1ql-language-reference/dropprimaryindex.adoc[] **** xref:n1ql:n1ql-language-reference/dropsequence.adoc[] + **** xref:n1ql:n1ql-language-reference/dropvectorindex.adoc[] **** xref:n1ql:n1ql-language-reference/dropscope.adoc[] **** xref:n1ql:n1ql-language-reference/dropuser.adoc[] **** xref:n1ql:n1ql-language-reference/execute.adoc[] From 21e749095bb96c62a81bd131fb89324e512a8c1e Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 12 Sep 2025 11:07:38 +0100 Subject: [PATCH 60/80] DOC-12437: Similarity functions (#407) * Update Functions overview page * Update nav * Add Vector Functions page * Include ISVECTOR in the Type functions * Add Vector Functions * Tweak type functions * Add formulas --- .../n1ql-language-reference/functions.adoc | 1 + .../n1ql-language-reference/typefun.adoc | 3 + .../n1ql-language-reference/vectorfun.adoc | 674 ++++++++++++++++++ modules/n1ql/partials/nav.adoc | 1 + 4 files changed, 679 insertions(+) create mode 100644 modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc diff --git a/modules/n1ql/pages/n1ql-language-reference/functions.adoc b/modules/n1ql/pages/n1ql-language-reference/functions.adoc index e5f8e9985..fc5fadce9 100644 --- a/modules/n1ql/pages/n1ql-language-reference/functions.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/functions.adoc @@ -29,4 +29,5 @@ Here are the categories of {sqlpp} functions: * xref:n1ql-language-reference/tokenfun.adoc[Token Functions] * xref:n1ql-language-reference/typefun.adoc[Type Functions] * xref:n1ql-language-reference/userfun.adoc[User-Defined Functions] +* xref:n1ql-language-reference/vectorfun.adoc[Vector Functions] * xref:n1ql-language-reference/windowfun.adoc[Window Functions] diff --git a/modules/n1ql/pages/n1ql-language-reference/typefun.adoc b/modules/n1ql/pages/n1ql-language-reference/typefun.adoc index 084bd19a4..ff1a4e2b4 100644 --- a/modules/n1ql/pages/n1ql-language-reference/typefun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/typefun.adoc @@ -1,6 +1,7 @@ = Type Functions :description: Type functions perform operations that check or convert expressions. :page-topic-type: reference +:example-caption!: [abstract] {description} @@ -269,6 +270,8 @@ SELECT ISSTRING(true) AS `boolean`, ---- ==== +include::vectorfun.adoc[tags=isvector] + [#fn-type-type] == TYPE(expression) diff --git a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc new file mode 100644 index 000000000..c25d098b7 --- /dev/null +++ b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc @@ -0,0 +1,674 @@ += Vector Functions +:description: Vector functions enable you to work with vector values. +:stem: asciimath +:page-topic-type: reference +:page-status: Couchbase Server 8.0 +:page-partial: +:example-caption!: +:keywords: similarity + +[abstract] +{description} + +Vector functions include similarity functions to find the distance between two vectors, functions that check for a vector value, and functions that transform vector values. + +For more information about vectors and vector indexes, see xref:vector-index:vectors-and-indexes-overview.adoc[]. + +[[approx_vector_distance,APPROX_VECTOR_DISTANCE()]] +== APPROX_VECTOR_DISTANCE(`vec`, `queryvec`, `metric` [,{nbsp}``nprobes`` [,{nbsp}``rerank`` [,{nbsp}``topNScan``]]]) + +This function has an alias <>. + +=== Description + +Finds the approximate distance between a provided vector and the content of a specified field that contains vector embeddings. + +This function works best with a hyperscale vector index or composite vector index. +If a query contains this function, and all of the following are true: + +* There is a hyperscale vector index or a composite vector index with a vector index key which is the same as the vector field referenced by the function + +* The vector index key uses a similarity setting which is the same as the distance metric referenced by the function + +* The vector index key has the same dimension as the vector provided by the function + +… then the Query optimizer selects that hyperscale vector index or composite vector index for use with the query containing this function. + +This function is faster, but less precise than <>. +You should use this function in your production queries. + +=== Arguments + +vec:: The name of a field that contains vector embeddings. +The field must contain an array of floating point numbers, or a base64 encoded string. + +queryvec:: An array of floating point numbers, or a base64 encoded string, representing the vector value to search for in the vector field. + +metric:: A string representing the distance metric to use when comparing the vectors. +To select a hyperscale vector index or composite vector index for the query, the distance metric should match the `similarity` setting that you used when you created the index. ++ +[horizontal.compact] +COSINE;; xref:vector-index:vectors-and-indexes-overview.adoc#cosine[Cosine Similarity] +DOT;; xref:vector-index:vectors-and-indexes-overview.adoc#dot[Dot Product] +L2;; +EUCLIDEAN;; xref:vector-index:vectors-and-indexes-overview.adoc#euclidean[Euclidean Distance] +L2_SQUARED;; +EUCLIDEAN_SQUARED;; xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean Squared Distance] + +nprobes:: [Optional] An integer representing the number of centroids to probe for matching vectors. +If the Query Service selects a hyperscale vector index or composite vector index for the query, this option defaults to the `scan_nprobes` setting that you used when you created the index. +If an invalid value is provided, defaults to `1`. + +rerank:: [Optional; can only be used when `nprobes` is specified] +A boolean. +If `false`, the function uses quantized vectors. +It `true`, the function uses full vectors to reorder the results. +The default is `false`. + +topNScan:: [Optional; can only be used when `nprobes` and `rerank` are specified] +This option only applies if using a hyperscale vector index. +A positive integer representing the number of records to scan. +The default is `0`, meaning the function uses the indexer default. + +=== Return Value + +Returns a numeric value representing the approximate vector distance. + +=== Examples + +To try the examples in this section, you must do the following: + +* Install the `rgb` and `rgb-questions` collections from the supplied vector sample, as described in xref:vector-index:hyperscale-vector-index.adoc#prerequisites[Prerequisites]. + +* Create a composite vector index in the `rbg` collection on the field named `colorvect_l2`, as described in xref:n1ql:n1ql-language-reference/createindex.adoc#ex-create-rgb-idx[CREATE INDEX Example 6]. + +* Create a hyperscale vector index in the `rbg` collection on the field named `embedding-vector-dot`, as described in xref:n1ql:n1ql-language-reference/createvectorindex.adoc#ex-create-rgb-idx[CREATE VECTOR INDEX Example 1]. + +[#approx_vector_distance_ex_simple] +.APPROX_VECTOR_DISTANCE() Example 1 +==== +This example finds the approximate vector distance between a query vector and three different embedded vectors. + +.Query +[source,sqlpp] +---- +WITH data AS ([ + {"vector": [1, 2, 3, 4], "similarity": "identical"}, + {"vector": [1, 2, 3, 5], "similarity": "close"}, + {"vector": [6, 7, 8, 9], "similarity": "distant"} +]) +SELECT + similarity, + APPROX_VECTOR_DISTANCE(vector, [1, 2, 3, 4], "COSINE") AS cosine, + APPROX_VECTOR_DISTANCE(vector, [1, 2, 3, 4], "DOT") AS dot, + APPROX_VECTOR_DISTANCE(vector, [1, 2, 3, 4], "L2") AS l2, + APPROX_VECTOR_DISTANCE(vector, [1, 2, 3, 4], "L2_SQUARED") AS l2_squared +FROM data; +---- + +The results show how the distance changes as the similarity decreases. + +.Results +[source,json] +---- +[ + { + "similarity": "identical", + "cosine": 0, + "dot": -30, + "l2": 0, + "l2_squared": 0 + }, + { + "similarity": "close", + "cosine": 0.00600091145203363, + "dot": -34, + "l2": 1, + "l2_squared": 1 + }, + { + "similarity": "distant", + "cosine": 0.0369131753138463, + "dot": -80, + "l2": 10, + "l2_squared": 100 + } +] +---- + +Compare this with the result of <>. +In this case, the results are identical because the query is not using a hyperscale vector index or composite vector index. +==== + +[#approx_vector_distance_ex_rbg] +.APPROX_VECTOR_DISTANCE() Example 2 +==== +This example finds the colors from the `rgb` collection that are similar to gray, which has an RGB value of `[128, 128, 128]`. + +.Query +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-rgb-idx] +---- + +The top result is the entry for gray. +The other results are all shades of gray: + +.Results +[source,json] +---- +[ + { + "color": "grey", + "colorvect_l2": [ + 128, + 128, + 128 + ], + "brightness": 128 + }, + { + "color": "slate gray", + "colorvect_l2": [ + 112, + 128, + 144 + ], + "brightness": 125.04 + }, + { + "color": "light slate gray", + "colorvect_l2": [ + 119, + 136, + 153 + ], + "brightness": 132.855 + }, + { + "color": "light gray", + "colorvect_l2": [ + 144, + 144, + 144 + ], + "brightness": 144 + }, + { + "color": "dim gray", + "colorvect_l2": [ + 105, + 105, + 105 + ], + "brightness": 105 + } +] +---- +==== + +[#approx_vector_distance_ex_embedded] +.APPROX_VECTOR_DISTANCE() Example 3 +==== +This example compares embedded vector values. +The query finds the colors from the `rgb` collection whose descriptions are most similar to the following presupplied question: + +> What is the color that is often linked to feelings of peace and tranquility, and is reminiscent of the clear sky on a calm day? + +.Query +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=exact-query] +---- + +. The `vector` field in the `rgb-questions` collection contains the embedded vectors associated with the presupplied questions. @/couchbase_search_query.knn/ + +. The `embedding_vector_dot` field in the `rgb` collection contains the embedded vectors associated with the color descriptions. @/embedding_vector_dot/ + +The query returns 10 colors where the embedded vector associated with the color description is most similar to the embedded vector associated with the presupplied question. + +.Results +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=exact-query-results] +---- + +Compare this with the result of <>. +In this case, the approximate vector distance does not give very accurate results. +==== + +[#approx_vector_distance_ex_nprobe] +.APPROX_VECTOR_DISTANCE() Example 4 +==== +This example improves on <> by increasing the number of centroids to probe. + +.Query +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=tuned-query] +---- + +.Results +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=tuned-query-results] +---- + +Compare this with the result of <>. +The approximate vector distance now gives much more accurate results. +==== + +[#approx_vector_distance_ex_rerank] +.APPROX_VECTOR_DISTANCE() Example 5 +==== +This example is similar to <>, but also uses reranking to improve its accuracy. +The query finds colors from the `rgb` collection whose descriptions are most similar to the following presupplied question: + +> What is a soft and gentle hue that can add warmth and brightness to a room? + +.Query +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=rerank-after-example] +---- + +. The `vector` field in the `rgb-questions` collection contains the embedded vectors associated with the presupplied questions. @/couchbase_search_query.knn/ + +. The `embedding_vector_dot` field in the `rgb` collection contains the embedded vectors associated with the color descriptions. @/embedding_vector_dot/ + +The query returns 3 colors where the embedded vector associated with the color description is most similar to the embedded vector associated with the presupplied question. + +.Results +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=rerank-after] +---- + +For more details and examples, see xref:vector-index:hyperscale-reranking.adoc[]. +==== + +[[decode_vector,DECODE_VECTOR()]] +== DECODE_VECTOR(`vector` [,{nbsp}``byte_order``]) + +This function has an alias <>. + +=== Description + +Reverses the encoding done by the <> function. + +=== Arguments + +vector:: String, or any {sqlpp} expression that evaluates to a string, representing the base64 encoding of a vector value. + +byte_order:: [Optional] A boolean which determines the byte order of the vector value. +If `true`, it is big-endian. +If `false`, it is little-endian. +The default is `false`. + +=== Return Value + +An array of floating point numbers. + +=== Example + +[#decode_vector_ex] +.DECODE_VECTOR() Example +==== +The following query decodes the base64 encoding of a vector value using two different byte orders. + +.Query +[source,sqlpp] +---- +SELECT DECODE_VECTOR("AACAPwAAAEAAAEBAAACAQA==") AS little_endian, + DECODE_VECTOR("P4AAAEAAAABAQAAAQIAAAA==", true) AS big_endian; +---- + +.Results +[source,json] +---- +[ + { + "little_endian": [ + 1, + 2, + 3, + 4 + ], + "big_endian": [ + 1, + 2, + 3, + 4 + ] + } +] +---- +==== + +[[encode_vector,ENCODE_VECTOR()]] +== ENCODE_VECTOR(`vector` [,{nbsp}``byte_order``]) + +This function has an alias <>. + +=== Description + +Returns the https://en.wikipedia.org/wiki/Base64[base64] encoding of a vector value. + +=== Arguments + +vector:: An array of floating point numbers, or any {sqlpp} expression that evaluates to an array of floating point numbers. + +byte_order:: [Optional] A boolean which determines the byte order of the vector value. +If `true`, it is big-endian. +If `false`, it is little-endian. +The default is `false`. + +=== Return Value + +A string representing the base64 encoding of the input expression. + +=== Example + +[#encode_vector_ex] +.ENCODE_VECTOR() Example +==== +The following query encodes an array of floating point numbers using two different byte orders. + +.Query +[source,sqlpp] +---- +SELECT ENCODE_VECTOR([1, 2, 3, 4]) AS little_endian, + ENCODE_VECTOR([1, 2, 3, 4], true) AS big_endian; +---- + +.Results +[source,json] +---- +[ + { + "little_endian": "AACAPwAAAEAAAEBAAACAQA==", + "big_endian": "P4AAAEAAAABAQAAAQIAAAA==" + } +] +---- +==== + +// tag::isvector[] +[[isvector,ISVECTOR()]] +== ISVECTOR(`vector`, `dimension`, `format`) + +// This function has no alias + +=== Description + +Checks if the supplied expression is an array of floating point numbers with the specified number of dimensions. +This can be used to determine whether a field contains contains a vector value. + +=== Arguments + +vector:: An array of floating point numbers, or any {sqlpp} expression that evaluates to an array of floating point numbers. + +dimension:: An integer representing the number of dimensions. + +format:: A string. +This argument must always be present and must have the value `"float32"`. + +=== Return Value + +Returns `true` if the expression is an array of floating point numbers with the specified number of dimensions. + +=== Examples + +To try the examples in this section, you must install the `rgb` and `rgb-questions` collections from the supplied vector sample, as described in xref:vector-index:hyperscale-vector-index.adoc#prerequisites[Prerequisites]. + +[#isvector_ex_simple] +.ISVECTOR() Example 1 +==== +.Query +[source,sqlpp] +---- +SELECT ISVECTOR([1, 2, 3, 4], 4, "float32") as vector, + ISVECTOR([1, 2, 3, 4], 3, "float32") as wrong_dimension, + ISVECTOR(["a", "b", "c", "d"], 4, "float32") as wrong_values; +---- + +.Results +[source,json] +---- +[ + { + "vector": true, + "wrong_dimension": false, + "wrong_values": false + } +] +---- +==== + +[#isvector_ex2] +.ISVECTOR() Example 2 +==== + +Check whether the specified fields in the `rgb` collection contain vector values. + +.Query +[source,sqlpp] +---- +SELECT ISVECTOR(description, 1, "float32") AS description, + ISVECTOR(colorvect_l2, 3, "float32") AS colorvect_l2, + ISVECTOR(embedding_vector_dot, 1536, "float32") AS embedding_vector_dot +FROM `vector-sample`.color.rgb LIMIT 1; +---- + +.Results +[source,json] +---- +[{ + "description": false, + "colorvect_l2": true, + "embedding_vector_dot": true +}] +---- + +The results show that the `description` field is not a vector field. The `colorvect_l2` and `embedding_vector_dot` fields are vector fields, with the specified number of dimensions. +==== +// end::isvector[] + +[[normalize_vector,NORMALIZE_VECTOR()]] +== NORMALIZE_VECTOR(`vector`) + +This function has aliases <>, <>, and <>. + +=== Description + +Normalizes a vector. +This function changes the magnitude of a vector, but not its direction, so that the vector has unit length. +This is useful in cases where you only need the direction of the vector, not its magnitude. + +To normalize a vector stem:[x], the function first calculates the length of the vector, stem:[|x|]. +This is the square root of the sum of the squares of each component of the vector. + +[stem] +++++ +|x| = sqrt(x_1^2 + x_2^2 + ... + x_n^2) +++++ + +To find the normalized vector, stem:[hat x], the function then divides each component of the vector by the length of the vector. + +[stem] +++++ +hat x = (x_1/|x|, x_2/|x|, ... x_n/|x|) +++++ + +=== Arguments + +vector:: An array of floating point numbers, or any {sqlpp} expression that evaluates to an array of floating point numbers. + +=== Return Value + +An array of floating point numbers representing the normalized vector. + +=== Example + +[#normalize_vector_ex] +.NORMALIZE_VECTOR() Example +==== +The following query normalizes a vector. + +.Query +[source,sqlpp] +---- +SELECT NORMALIZE_VECTOR([1, 2, 3, 4]) AS normalized; +---- + +.Results +[source,json] +---- +[{ + "normalized": [ + 0.18257418583505536, + 0.3651483716701107, + 0.5477225575051661, + 0.7302967433402214 + ] +}] +---- +==== + +[[vector_distance,VECTOR_DISTANCE()]] +== VECTOR_DISTANCE(`vec`, `queryvec`, `metric`) + +This function has an alias <>. + +=== Description + +Finds the exact distance between a provided vector and the content of a specified field that contains vector embeddings. + +This function does not use a hyperscale vector index or composite vector index to perform the comparison. +Instead, it performs a brute-force search for similar vectors. + +This function is slower, but more precise than <>. +You should use this function to check the accuracy of your production queries, and adjust the index and query settings to improve the recall accuracy. + +=== Arguments + +vec:: The name of a field that contains vector embeddings. +The field must contain an array of floating point numbers, or a base64 encoded string. + +queryvec:: An array of floating point numbers, or a base64 encoded string, representing the vector value to search for in the vector field. + +metric:: A string representing the distance metric to use when comparing the vectors. ++ +[horizontal.compact] +COSINE;; xref:vector-index:vectors-and-indexes-overview.adoc#cosine[Cosine Similarity] +DOT;; xref:vector-index:vectors-and-indexes-overview.adoc#dot[Dot Product] +L2;; +EUCLIDEAN;; xref:vector-index:vectors-and-indexes-overview.adoc#euclidean[Euclidean Distance] +L2_SQUARED;; +EUCLIDEAN_SQUARED;; xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean Squared Distance] + +=== Return Value + +Returns a numeric value representing the vector distance. + +=== Examples + +To try the examples in this section, you must install the `rgb` and `rgb-questions` collections from the supplied vector sample, as described in xref:vector-index:hyperscale-vector-index.adoc#prerequisites[Prerequisites]. + +[#vector_distance_ex_simple] +.VECTOR_DISTANCE() Example 1 +==== +The following query finds the exact vector distance between a query vector and three different embedded vectors. + +.Query +[source,sqlpp] +---- +WITH data AS ([ + {"vector": [1, 2, 3, 4], "similarity": "identical"}, + {"vector": [1, 2, 3, 5], "similarity": "close"}, + {"vector": [6, 7, 8, 9], "similarity": "distant"} +]) +SELECT + similarity, + VECTOR_DISTANCE(vector, [1, 2, 3, 4], "COSINE") AS cosine, + VECTOR_DISTANCE(vector, [1, 2, 3, 4], "DOT") AS dot, + VECTOR_DISTANCE(vector, [1, 2, 3, 4], "L2") AS l2, + VECTOR_DISTANCE(vector, [1, 2, 3, 4], "L2_SQUARED") AS l2_squared +FROM data; +---- + +The results show how the distance changes as the similarity decreases. + +.Results +[source,json] +---- +[ + { + "similarity": "identical", + "cosine": 0, + "dot": -30, + "l2": 0, + "l2_squared": 0 + }, + { + "similarity": "close", + "cosine": 0.00600091145203363, + "dot": -34, + "l2": 1, + "l2_squared": 1 + }, + { + "similarity": "distant", + "cosine": 0.0369131753138463, + "dot": -80, + "l2": 10, + "l2_squared": 100 + } +] +---- + +Compare this with the result of <>. +==== + +[#vector_distance_ex_embedded] +.VECTOR_DISTANCE() Example 2 +==== +This example compares embedded vector values. +The query finds colors from the `rgb` collection whose descriptions are most similar to the following presupplied question: + +> What is the color that is often linked to feelings of peace and tranquility, and is reminiscent of the clear sky on a calm day? + +.Query +[source,sqlpp] +---- +include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=exact-query] +---- + +. The `vector` field in the `rgb-questions` collection contains the embedded vectors associated with the presupplied questions. @/couchbase_search_query.knn/ + +. The `embedding_vector_dot` field in the `rgb` collection contains the embedded vectors associated with the color descriptions. @/embedding_vector_dot/ + +The query returns 10 colors where the embedded vector associated with the color description is most similar to the embedded vector associated with the presupplied question. + +.Results +[source,json] +---- +include::vector-index:example$hyperscale-idx-data.json[tag=exact-query-results] +---- + +For more details and examples, see xref:vector-index:vector-index-best-practices.adoc#recall-accuracy[Determine Recall Rate]. +==== + +[#aliases] +== Aliases + +Some vector functions have aliases. + +* `ANN_DISTANCE()` is an alias for <>. +* `KNN_DISTANCE()` is an alias for <>. +* `NORMALISE_VECTOR()` is an alias for <>. +* `VECTOR_DECODE()` is an alias for <>. +* `VECTOR_ENCODE()` is an alias for <>. +* `VECTOR_NORMALISE()` is an alias for <>. +* `VECTOR_NORMALIZE()` is an alias for <>. + diff --git a/modules/n1ql/partials/nav.adoc b/modules/n1ql/partials/nav.adoc index 1f54cd50c..64615d668 100644 --- a/modules/n1ql/partials/nav.adoc +++ b/modules/n1ql/partials/nav.adoc @@ -77,6 +77,7 @@ endif::flag-devex-javascript-udfs[] **** xref:n1ql:n1ql-language-reference/tokenfun.adoc[] **** xref:n1ql:n1ql-language-reference/typefun.adoc[] **** xref:n1ql:n1ql-language-reference/userfun.adoc[] + **** xref:n1ql:n1ql-language-reference/vectorfun.adoc[] **** xref:n1ql:n1ql-language-reference/windowfun.adoc[] *** xref:n1ql:n1ql-language-reference/subqueries.adoc[] **** xref:n1ql:n1ql-language-reference/correlated-subqueries.adoc[] From 7bf4bd43d9412ed409f1faf7a1bf176a726042e7 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:28:46 +0100 Subject: [PATCH 61/80] NO ISSUE: Consolidate the vector index files (#419) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * TEMP: Preview config for feature branch * Fix links, tags, anchors, and includes * Tweak examples for consistency and formatting * Move composite examples to separate files — use the View button as intended --- .../n1ql-language-reference/createindex.adoc | 4 +- .../n1ql-language-reference/dropindex.adoc | 2 +- .../examples/gsi-vector-idx-examples.sqlpp | 3119 +---------------- .../query-vectors-idx-filtered-whole.sqlpp | 1544 ++++++++ .../examples/query-vectors-idx-whole.sqlpp | 1543 ++++++++ .../pages/composite-vector-index.adoc | 57 +- .../vector-index/pages/hyperscale-filter.adoc | 4 +- .../pages/hyperscale-vector-index.adoc | 43 +- .../pages/use-vector-indexes.adoc | 2 +- .../pages/vector-index-best-practices.adoc | 5 +- .../pages/vectors-and-indexes-overview.adoc | 13 +- .../partials/index-algorithm-settings.adoc | 20 +- preview/DOC-12294-GSI-vector-index.yml | 5 + 13 files changed, 3157 insertions(+), 3204 deletions(-) create mode 100644 modules/vector-index/examples/query-vectors-idx-filtered-whole.sqlpp create mode 100644 modules/vector-index/examples/query-vectors-idx-whole.sqlpp create mode 100644 preview/DOC-12294-GSI-vector-index.yml diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index b8ced7582..d3eaf2335 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -719,7 +719,7 @@ include::example$n1ql-language-reference/create-idx-include.n1ql[] For more examples of indexes where the leading key may be missing, see xref:n1ql:n1ql-language-reference/selectintro.adoc#index-selection[Index Selection]. ==== -[[eex-create-rgb-idx]] +[[ex-create-rgb-idx]] .Create a composite vector index ==== For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. @@ -729,7 +729,7 @@ Create a composite vector index that indexes the vector field named `colorvect_l [source,sqlpp] ---- -include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-idx] +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-rgb-idx] ---- ==== diff --git a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc index 5ec777f48..81dbb3ff9 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc @@ -34,7 +34,7 @@ For compatibility with legacy versions of Couchbase Server, you can also use DRO To use the {doctitle} statement, you must have the _Query Manage Index_ privilege on the keyspace or bucket. For more details about user roles, see {authorization-overview}[Authorization]. -// end::prerequisites +// end::prerequisites[] == Syntax diff --git a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp index 5cbd1303e..aae249659 100644 --- a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp +++ b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp @@ -55,20 +55,6 @@ order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "DOT") LIMIT 3; /* end::query-vectors-idx-subquery[] */ -/* tag::query-vectors-idx-truncated[] */ -SELECT b.color, b.description from `rgb` AS b -order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, -[ - 0.005115953739732504, - 0.004331615287810564, - 0.014279481954872608, - /* long list of vector values omitted */ - -0.005022349301725626, - 0.002007648814469576, - -0.03757078945636749 - ], "DOT") LIMIT 3; -/* end::query-vectors-idx-truncated[] */ - /* tag::query-vectors-idx-subquery-filtered[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector @@ -78,3107 +64,4 @@ SELECT b.color, b.description, b.brightness from `rgb` AS b WHERE b.brightness > 190.0 order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "DOT") LIMIT 3; -/* end::query-vectors-idx-subquery-filtered[] */ - -/* tag::query-vectors-idx-whole[] */ -SELECT b.color, b.description from `rgb` AS b -order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, -[ - 0.005115953739732504, - 0.004331615287810564, - 0.014279481954872608, - 0.000619320897385478, - 0.006700769532471895, - 0.018410978838801384, - -0.010367471724748611, - -0.019805356860160828, - 0.013059400022029877, - -0.011271236464381218, - -0.011251870542764664, - -0.004915834404528141, - -0.0031744735315442085, - 0.00843728892505169, - -0.01706824265420437, - 0.013362806290388107, - 0.04694411903619766, - 0.011258325539529324, - 0.01298193447291851, - -0.01080644316971302, - -0.01744265854358673, - 0.0044155362993478775, - -0.00742378132417798, - 0.014214927330613136, - -0.01248486340045929, - 0.0009481459856033325, - 0.027293693274259567, - -0.029204510152339935, - 0.006355402525514364, - 0.016254853457212448, - 0.02933361940085888, - -0.017352283000946045, - 0.007236572913825512, - -0.017094064503908157, - 0.002293302910402417, - -0.018139848485589027, - 0.007811109069734812, - 0.015028315596282482, - -0.008785883896052837, - -0.013453182764351368, - -8.422360406257212e-05, - 0.010896819643676281, - 0.002246500924229622, - -0.010586957447230816, - -0.0011482653208076954, - -0.003537593176588416, - 0.02017977461218834, - -0.013491915538907051, - -0.00977356918156147, - 0.01215563528239727, - 0.032122381031513214, - 0.02827492356300354, - 0.002995334332808852, - -0.027396980673074722, - 0.004583378322422504, - 0.0007577098440378904, - 0.00016683334251865745, - 0.025731472298502922, - 0.006158510688692331, - -0.008288813754916191, - 0.00016885067452676594, - 0.01956005021929741, - -0.01309813279658556, - 0.009934956207871437, - -0.007920851930975914, - 0.008721329271793365, - -0.032354775816202164, - -0.0031050771940499544, - -0.0049997554160654545, - 0.029178688302636147, - 0.0075980788096785545, - 0.024995548650622368, - 0.018165670335292816, - -0.008463110774755478, - 0.025292500853538513, - -0.0031518794130533934, - -0.01706824265420437, - -0.00925713311880827, - -0.013375717215240002, - 0.0066749476827681065, - 0.015144513919949532, - -0.0011805426329374313, - -0.037312570959329605, - 0.015092870220541954, - 0.01786871999502182, - 0.015002493746578693, - -0.020631656050682068, - 0.0021415995433926582, - -0.004912606440484524, - -0.004880329128354788, - -0.012523596175014973, - 0.024246715009212494, - 0.02413051761686802, - 0.0008162125013768673, - -0.02077367715537548, - 0.005419360473752022, - 0.008508299477398396, - 0.010470759123563766, - 0.0004575308703351766, - -0.01443441305309534, - -0.00852766539901495, - 0.017326461151242256, - -0.03674449026584625, - -0.009579905308783054, - -0.018643373623490334, - -0.0009473390528000891, - 0.00832109060138464, - -0.0016057961620390415, - 0.023614080622792244, - -0.024272536858916283, - -0.042502760887145996, - 0.03207073733210564, - 0.009534717537462711, - -0.041082561016082764, - -0.010651512071490288, - -0.01997319981455803, - 0.016306497156620026, - 0.015648040920495987, - -0.00894081499427557, - -0.03473038598895073, - -0.00884398352354765, - 0.018010739237070084, - 0.019004879519343376, - -0.015970813110470772, - 0.01914690062403679, - 0.0008166159386746585, - -0.006232748739421368, - -0.033568404614925385, - -0.03416230529546738, - -0.02494390495121479, - 0.02163870818912983, - 0.01701659895479679, - -0.004396169912070036, - 0.003786128479987383, - -0.008372734300792217, - 0.014563522301614285, - -0.01029646210372448, - 0.005622707307338715, - 0.010270640254020691, - 0.0004607586015481502, - 0.032096557319164276, - 0.021096449345350266, - -0.00034355162642896175, - -0.007966040633618832, - -0.004928745329380035, - 0.02806834876537323, - 0.010528858751058578, - 0.013349895365536213, - -0.006629759445786476, - -0.01913398876786232, - 0.02205185778439045, - -0.015480197966098785, - 0.02580893784761429, - 0.013362806290388107, - 0.010244818404316902, - 0.024246715009212494, - -0.0043122489005327225, - 0.0009594430448487401, - -0.02948855049908161, - 0.005044943653047085, - -0.004499457310885191, - -0.010373927652835846, - 0.0007040488417260349, - 0.012032981030642986, - 0.02039925940334797, - 0.02788759581744671, - 0.01807529479265213, - 0.008695507422089577, - 0.0015170335536822677, - 0.02059292420744896, - -0.012291199527680874, - 0.02706129662692547, - -0.009663826785981655, - 0.01101301796734333, - -0.013336984440684319, - 0.025705650448799133, - 0.006765324156731367, - 0.007197840139269829, - 0.024156339466571808, - -0.012975478544831276, - -0.03098621778190136, - -0.004870646167546511, - -0.000659667537547648, - -0.01186513900756836, - -0.007849842309951782, - -0.005797004792839289, - 0.022310076281428337, - -0.02099316194653511, - 0.0013346667401492596, - -0.011600465513765812, - -0.002236817730590701, - 0.020825320854783058, - 0.0010651513002812862, - -0.022826513275504112, - -0.6420344114303589, - 8.150020585162565e-05, - -0.014214927330613136, - -0.015841703861951828, - 0.02079949900507927, - 0.020205596461892128, - 0.037544965744018555, - 0.012265377677977085, - 0.0005870435852557421, - -0.01665509305894375, - 0.005919658578932285, - 0.013349895365536213, - 0.016577627509832382, - -0.01664218120276928, - 0.0006382837891578674, - -0.013969619758427143, - -0.017326461151242256, - -0.00033669269760139287, - -0.013027122244238853, - 0.00042283275979571044, - -0.00431870436295867, - 0.02161288633942604, - -0.007572256959974766, - 0.007262394763529301, - 0.019469672814011574, - 0.01372431218624115, - 0.001147458446212113, - -0.013479004614055157, - 0.014279481954872608, - 0.043587278574705124, - -0.027138762176036835, - 0.015118692070245743, - 8.61400694702752e-05, - 0.00968319270759821, - 0.04738309234380722, - 0.01579006016254425, - -0.026544859632849693, - 0.03506607189774513, - -0.022348809987306595, - 0.05510382354259491, - -0.01931474171578884, - 0.011671475134789944, - 0.02081240899860859, - -0.03098621778190136, - 0.0003318511007819325, - 0.021574154496192932, - 0.024272536858916283, - -0.015854615718126297, - 0.028378210961818695, - -0.015467287041246891, - 0.019689159467816353, - 0.005471004173159599, - 0.014718453399837017, - 0.0048641907051205635, - 0.00894081499427557, - 0.010845175944268703, - 0.030056631192564964, - -0.016538893803954124, - 0.012317021377384663, - 0.009366875514388084, - -0.003025997895747423, - 0.0029791956767439842, - -0.01434403657913208, - -0.019185632467269897, - -0.014976671896874905, - 0.03465292230248451, - -0.013788866810500622, - -0.013091676868498325, - -0.0024353230837732553, - -0.028791360557079315, - -0.005522647872567177, - -0.008630952797830105, - -0.02286524698138237, - 0.009418519213795662, - 0.00011145758617203683, - -0.0103932935744524, - 0.012342843227088451, - 0.017584679648280144, - -0.008288813754916191, - 0.009754203259944916, - 0.0016525982646271586, - -0.00712683005258441, - -0.005467776209115982, - 0.0034956326708197594, - 0.0353759340941906, - 0.013324073515832424, - -0.03535011038184166, - -0.04258022829890251, - 0.01322078611701727, - 0.011193770915269852, - 0.023756099864840508, - 0.030934574082493782, - 0.0018236680189147592, - -0.0009667054400779307, - -0.012588150799274445, - 0.003983020316809416, - -0.02369154617190361, - -0.015234890393912792, - -0.026299552991986275, - -0.007107463665306568, - 0.00779174268245697, - -0.015389821492135525, - -0.012310566380620003, - 0.008262991905212402, - 0.02664814703166485, - -0.0017284499481320381, - -0.0297467689961195, - 0.022607028484344482, - 0.023575346916913986, - -0.017326461151242256, - 0.020115219056606293, - -0.026751434430480003, - 0.0026580365374684334, - 0.003090552520006895, - 0.03596983477473259, - -0.02451784536242485, - 0.02471150830388069, - -0.003347157035022974, - -0.007533524185419083, - -0.02556362934410572, - 0.02933361940085888, - -0.013298251666128635, - -0.014279481954872608, - 0.007507702335715294, - 0.017571767792105675, - 0.00280489819124341, - -0.008424378000199795, - -0.0010514333844184875, - -0.0030469780322164297, - -0.0012862507719546556, - 0.021161004900932312, - -0.0022755505051463842, - -0.0011644039768725634, - 0.0031744735315442085, - -0.00047205566079355776, - -0.014576433226466179, - 0.004460724536329508, - -0.010031787678599358, - 0.008256535977125168, - -0.04513658955693245, - -0.019288919866085052, - -0.013233697041869164, - 0.00965091586112976, - 0.0026709474623203278, - -0.021884016692638397, - -0.03516935929656029, - -0.03281956911087036, - 0.008663230575621128, - -0.038784414529800415, - -0.010322283953428268, - -0.016474340111017227, - -0.013788866810500622, - -0.022568294778466225, - 0.03183833882212639, - 0.025834759697318077, - -0.0028807499911636114, - -0.02100607380270958, - -0.02249082922935486, - -0.01434403657913208, - -0.007365682162344456, - 0.01994737796485424, - 0.02972094714641571, - -0.008837527595460415, - -0.009457251988351345, - -0.013595202937722206, - -0.04121166840195656, - -0.009605727158486843, - 0.013111043721437454, - -0.010877453722059727, - -0.023368772119283676, - 0.012420308776199818, - -0.012820547446608543, - -0.006842789705842733, - 0.012523596175014973, - -0.005935797467827797, - 0.013646846637129784, - -0.006868611555546522, - -0.021264292299747467, - -0.002252956386655569, - -0.007681999821215868, - 0.00020627219055313617, - 0.009089291095733643, - -0.005713083781301975, - -0.005212785676121712, - 0.03496278449892998, - 0.001072413637302816, - 0.022090591490268707, - 0.07266268134117126, - -0.02431127056479454, - 0.032974500209093094, - -0.0030485920142382383, - 0.009289409965276718, - -0.01660344935953617, - 0.001254780450835824, - -0.01340153906494379, - 0.01103238482028246, - 0.010199629701673985, - -0.0026919275987893343, - -0.012142724357545376, - -0.005038488190621138, - 0.031709231436252594, - 0.023562436923384666, - 0.011781218461692333, - -0.003963653929531574, - 0.016164477914571762, - -0.02034761570394039, - 0.016745468601584435, - 0.0006649125716648996, - 0.008069328032433987, - 0.022168057039380074, - -0.0036215141881257296, - -0.03199326992034912, - -0.008366279304027557, - -0.014576433226466179, - 0.006668492220342159, - 0.0007762692985124886, - 0.00029594259103760123, - 0.010864542797207832, - -0.0174555703997612, - 0.013349895365536213, - 0.017984917387366295, - 0.010993652045726776, - 0.01976662501692772, - -0.013956708833575249, - -0.00499007198959589, - 0.007546435110270977, - 0.014498967677354813, - -0.0032164340373128653, - -0.01974080316722393, - -0.03395573049783707, - -0.013853421434760094, - -0.0065393829718232155, - -0.005961619317531586, - 0.0028016704600304365, - -0.005122409202158451, - 0.005061082076281309, - 0.01603536866605282, - -0.024595310911536217, - 0.03449799120426178, - 0.008217803202569485, - 0.01891450397670269, - 0.031683407723903656, - 0.005170824937522411, - 0.006481283809989691, - 0.04433611407876015, - -0.02637701854109764, - 0.0172231737524271, - 0.005474231671541929, - 0.0028710667975246906, - 0.0050417156890034676, - -0.026351196691393852, - -0.007681999821215868, - -0.04808028042316437, - 0.009780025109648705, - 0.011619831435382366, - -0.013982530683279037, - 0.014576433226466179, - -0.0004478476766962558, - 0.020864052698016167, - 0.017545945942401886, - 0.02428544871509075, - -0.019043613225221634, - 0.009986599907279015, - -0.01952131651341915, - 0.00379258394241333, - 0.008004773408174515, - 0.004909378942102194, - 0.003116374369710684, - -0.018785394728183746, - -0.008095149882137775, - 0.008701963350176811, - -0.0237173680216074, - 0.009082835167646408, - -0.02453075535595417, - -0.0049674781039357185, - 0.0127753596752882, - -0.003941059578210115, - -0.018165670335292816, - -0.00499007198959589, - 0.00441230833530426, - -0.010193174704909325, - -0.032328955829143524, - 0.004309020936489105, - 0.0170553307980299, - -0.005080448463559151, - -0.018630463629961014, - -0.00671368045732379, - 0.030237384140491486, - -0.026958009228110313, - 0.0016606675926595926, - 0.024375824257731438, - 0.033800799399614334, - 0.022619938477873802, - -0.0027839180547744036, - -0.0024272536393254995, - -0.02493099495768547, - 0.017829986289143562, - 0.004564011935144663, - 0.010690244846045971, - -0.00247244187630713, - 0.006426412612199783, - -0.006271481513977051, - -0.024220893159508705, - 0.008295268751680851, - 0.02227134443819523, - 0.017300639301538467, - 0.002096411306411028, - -0.00018418239778839052, - 0.00420250603929162, - -0.019430940970778465, - -0.010774166323244572, - -0.011903871782124043, - 0.0039023268036544323, - -0.00925713311880827, - 0.009276499040424824, - 0.015118692070245743, - -0.016383962705731392, - -0.018359335139393806, - 0.042270366102457047, - -0.013582292012870312, - 0.0026806306559592485, - -0.011206681840121746, - -0.014821740798652172, - 0.007075186353176832, - 0.05422588065266609, - -0.006026173941791058, - -0.010412660427391529, - 0.0015331722097471356, - 0.019676247611641884, - 0.012058802880346775, - -0.021303024142980576, - -0.02076076529920101, - 0.00893435999751091, - 0.004357437137514353, - -0.0068105123937129974, - 0.003177701262757182, - -0.014770097099244595, - 0.008469566702842712, - 0.0034052561968564987, - 0.001760727260261774, - -0.0002231169055448845, - -0.02892046980559826, - -0.006868611555546522, - -0.028326567262411118, - -0.014369858428835869, - 0.014395680278539658, - -0.005064310040324926, - 0.015467287041246891, - -0.010787077248096466, - 0.010832265019416809, - 0.038242157548666, - 0.018785394728183746, - 0.006449006497859955, - -0.020463814958930016, - 0.014679720625281334, - 0.0031486516818404198, - -0.007694910746067762, - 0.001307231024838984, - -0.030237384140491486, - -0.003976564854383469, - -0.020902786403894424, - -0.005809915717691183, - -0.01404708530753851, - -0.003650563769042492, - -0.003025997895747423, - 0.015660950914025307, - -0.014176194556057453, - -0.0116262873634696, - 0.01331116259098053, - -0.010535313747823238, - -0.014085818082094193, - 0.003834544448181987, - -0.013956708833575249, - 0.01422783825546503, - 0.007656177971512079, - -0.0012346070725470781, - -0.0008440516539849341, - -0.006145599763840437, - 0.0010465917875990272, - 0.0094766179099679, - -0.023188019171357155, - -0.0028339477721601725, - 0.01321433112025261, - -0.019689159467816353, - -0.0012321863323450089, - -0.022335898131132126, - 0.0003241852391511202, - 0.008256535977125168, - -0.011613376438617706, - -0.04136659950017929, - 0.005361261311918497, - -0.038242157548666, - -0.01059341337531805, - -0.014576433226466179, - -0.005667895544320345, - -0.027319515123963356, - -0.012704349122941494, - 0.01828186959028244, - 0.02349788136780262, - 0.02330421842634678, - 0.007236572913825512, - 0.00861804187297821, - 0.01975371316075325, - 0.01621612161397934, - -0.0014678107108920813, - -0.009424974210560322, - -0.006681403145194054, - -0.018772482872009277, - -0.0005394345498643816, - -0.0009868787601590157, - 0.0320449136197567, - -0.015635129064321518, - -0.01580297201871872, - 0.010122164152562618, - 0.016177387908101082, - -0.013259518891572952, - 0.03413648530840874, - -0.021057717502117157, - -0.00473508145660162, - 0.018152760341763496, - 0.011000107042491436, - 0.015919169411063194, - -0.004273516125977039, - -0.027758486568927765, - 0.008914993144571781, - -0.026983831077814102, - -0.0003104673814959824, - -0.02206476964056492, - 0.012168546207249165, - -0.00358600914478302, - -0.009308775886893272, - 0.0029097995720803738, - -0.018979057669639587, - -0.007385048549622297, - 0.010464304126799107, - -0.005532330833375454, - 0.004405852872878313, - 0.023562436923384666, - -0.006629759445786476, - 0.007101008202880621, - -0.023536615073680878, - 0.030857108533382416, - -0.00613914430141449, - -0.028817182406783104, - 0.012213733978569508, - -0.05587847903370857, - 0.0013596817152574658, - -0.0006209347629919648, - -0.022168057039380074, - 0.0028807499911636114, - 0.006303758826106787, - -0.00539999408647418, - 0.00671368045732379, - -0.0013120726216584444, - 0.002383679384365678, - 0.013149776495993137, - -0.007772376295179129, - -0.022568294778466225, - -0.04898404702544212, - -0.004215416964143515, - 0.011019473895430565, - 0.016345230862498283, - -0.004915834404528141, - -0.020463814958930016, - -0.01891450397670269, - 0.03300032392144203, - -0.015209068544209003, - -0.02121264860033989, - -0.03568579629063606, - -0.030624711886048317, - 0.033129431307315826, - 0.0057485890574753284, - -0.009941411204636097, - 0.02680307812988758, - -0.026364106684923172, - -0.00288559147156775, - -0.013995441608130932, - 0.014369858428835869, - -7.84742078394629e-05, - -0.014447323977947235, - -0.03196744993329048, - -0.017804164439439774, - 0.018385156989097595, - -0.005532330833375454, - 0.01112921629101038, - 0.015480197966098785, - 0.032742105424404144, - 0.011000107042491436, - -0.017197351902723312, - -0.010212540626525879, - -0.015441465191543102, - 0.002488580532371998, - -0.01600954681634903, - 0.012859280221164227, - 0.02429835870862007, - 0.014692631550133228, - 0.00968319270759821, - 0.00819843728095293, - 0.03116697072982788, - 0.022297166287899017, - 0.008689052425324917, - -0.01892741397023201, - -0.008863349445164204, - -0.02413051761686802, - -0.014653898775577545, - 0.005671123508363962, - -0.009625094011425972, - -0.00072664296021685, - 0.02493099495768547, - 0.009786480106413364, - 0.0253828763961792, - 0.017106974497437477, - -0.009689648635685444, - 0.004954567179083824, - 0.029798412695527077, - 0.010244818404316902, - 0.024569489061832428, - -0.005290251225233078, - 0.01206525880843401, - -0.03989475592970848, - -0.032948680222034454, - 0.0032067508436739445, - -0.024827707558870316, - -0.007230117451399565, - 0.0014653898542746902, - 0.009005369618535042, - 0.011961971409618855, - -0.0028016704600304365, - 0.011903871782124043, - 0.022374631837010384, - 0.014279481954872608, - 0.002787145785987377, - 0.008256535977125168, - -0.007920851930975914, - -0.0590287446975708, - -0.008179070428013802, - -0.04596288874745369, - -0.04172810539603233, - 0.0019027474336326122, - 0.006784690544009209, - -0.038552019745111465, - 0.026570681482553482, - 0.010012421756982803, - -0.002772620879113674, - -0.008153248578310013, - -0.0035827814135700464, - 0.00415731780230999, - -0.020334705710411072, - 0.0441037155687809, - -0.004292882513254881, - -0.00043211248703300953, - -0.009115112945437431, - 0.001920499955303967, - -0.016074100509285927, - -0.011755396611988544, - 0.03496278449892998, - 0.019418029114603996, - -0.001509771216660738, - -0.020864052698016167, - 0.022710315883159637, - 0.005758272018283606, - -0.015015404671430588, - -0.009192578494548798, - 0.004983616527169943, - 0.040230438113212585, - 0.0032842163927853107, - -0.039817288517951965, - 0.030185740441083908, - -0.02413051761686802, - 0.03341347351670265, - 0.0032083645928651094, - -0.018036561086773872, - 0.016732558608055115, - -0.02183237299323082, - 0.0003052223182749003, - 0.022723225876688957, - -0.017106974497437477, - 0.022568294778466225, - -0.00087632896611467, - 0.014176194556057453, - -0.01289155799895525, - 0.008753607049584389, - -0.022193878889083862, - -0.004238010849803686, - -0.0060584512539207935, - 0.0023304217029362917, - 0.01770087704062462, - 0.003155107144266367, - 0.011581098660826683, - 0.014628076925873756, - 0.0070170871913433075, - 0.01621612161397934, - 0.011774762533605099, - 0.027810130268335342, - -0.010141531005501747, - 0.014318214729428291, - -0.013737223111093044, - 0.0001642108109081164, - 0.0021545104682445526, - -0.0005850262241438031, - 0.0009626707760617137, - -0.0011571416398510337, - -0.0033891175407916307, - -0.015919169411063194, - 0.03881023824214935, - -0.00852766539901495, - -0.0292819757014513, - 0.01413746178150177, - 0.001689717173576355, - 0.009986599907279015, - -0.030908752232789993, - -0.017326461151242256, - 0.02330421842634678, - 0.0007924079545773566, - -0.03119279257953167, - -0.020257240161299706, - 3.0058245101827197e-05, - 0.018578819930553436, - 0.001744588604196906, - -0.012471952475607395, - -0.005761499982327223, - -0.0022077681496739388, - -0.020915696397423744, - 0.03488531708717346, - -0.007688455283641815, - 0.010548224672675133, - -0.009818757884204388, - 0.012323477305471897, - -0.0036150587256997824, - -0.04596288874745369, - 0.026983831077814102, - -0.01952131651341915, - -0.035453397780656815, - -0.011807040311396122, - 0.01847553253173828, - 0.014240749180316925, - -0.009547628462314606, - -0.0049707056023180485, - 0.0062262932769954205, - 0.006449006497859955, - -0.006158510688692331, - 0.0026919275987893343, - -0.016913311555981636, - 0.012736626900732517, - -0.008146793581545353, - -0.01372431218624115, - 0.015518930740654469, - -0.006048767827451229, - -0.005877698305994272, - -0.031915806233882904, - -0.005909975618124008, - -0.007139740977436304, - -0.031244436278939247, - -0.003595692338421941, - -0.0068105123937129974, - 0.036873601377010345, - -0.007165562827140093, - -0.014150372706353664, - -0.015183246694505215, - 0.0006019718130119145, - -0.01622903160750866, - 0.01874666102230549, - 0.012020070105791092, - -0.01619029976427555, - -0.017403926700353622, - 0.029462728649377823, - 0.022180967032909393, - 0.0210189837962389, - -0.007572256959974766, - -0.01644851826131344, - -0.01825604774057865, - -0.018385156989097595, - -0.01466680970042944, - -0.00905055832117796, - -0.0055839745327830315, - 0.027371158823370934, - 0.02597677893936634, - -0.04059194400906563, - -0.030857108533382416, - 0.023781921714544296, - -0.023420415818691254, - -0.025834759697318077, - 0.016371052712202072, - 0.004722170531749725, - -0.0015210682759061456, - 0.01724899560213089, - -0.004993299953639507, - 0.018991969525814056, - 0.004809319041669369, - -0.01748139224946499, - -0.019237276166677475, - 0.0008916606893762946, - 0.012743081897497177, - -0.030934574082493782, - 0.03842290863394737, - -0.025615273043513298, - -0.03036649338901043, - -0.005680806469172239, - 0.01932765357196331, - -0.0033923452720046043, - 0.0026725612115114927, - 0.004583378322422504, - 0.010361016727983952, - 0.019882822409272194, - -0.004883557092398405, - 0.033129431307315826, - -0.0001690524077275768, - 0.003650563769042492, - 0.009011825546622276, - -0.020063575357198715, - -0.02286524698138237, - -0.02081240899860859, - 0.03661538287997246, - -0.036073122173547745, - 0.013750134035944939, - 0.023162197321653366, - 0.012846369296312332, - -0.026958009228110313, - -0.019392207264900208, - -0.006219837814569473, - 0.006013263016939163, - -0.019043613225221634, - -0.001880153315141797, - 0.003411711659282446, - -0.014305303804576397, - -0.008359823375940323, - -0.011897416785359383, - -0.015867525711655617, - -0.006100411526858807, - -0.025499075651168823, - -0.013995441608130932, - -0.0001231581118190661, - 0.021483777090907097, - -0.0021464412566274405, - -0.0072236619889736176, - -0.016525983810424805, - 0.016061190515756607, - -0.01829477958381176, - -0.018578819930553436, - -0.02680307812988758, - -0.02726787142455578, - -0.01600954681634903, - 0.028972113505005836, - 0.016371052712202072, - -0.014382769353687763, - 0.007843386381864548, - -0.014692631550133228, - -0.007055819965898991, - 0.0005442761466838419, - -0.0042799715884029865, - 0.005874470341950655, - -0.04758966714143753, - 0.010361016727983952, - 0.009818757884204388, - -0.02969512529671192, - -0.003356840228661895, - -0.003760306630283594, - 0.007772376295179129, - 0.01788162998855114, - 0.03176087513566017, - 0.22434021532535553, - 0.022206788882613182, - -0.0009489529184065759, - 0.039171744138002396, - 0.0189532358199358, - 0.022387541830539703, - 0.02620917558670044, - 0.022168057039380074, - -0.0061326888389885426, - 0.026570681482553482, - 0.0018317373469471931, - 0.016990777105093002, - 0.0008521209820173681, - 0.00717201828956604, - 0.008237170055508614, - -0.007778831757605076, - -0.04635021835565567, - -0.00758516788482666, - -0.02014104090631008, - 0.0025369965005666018, - 0.005935797467827797, - -0.024453289806842804, - -0.021767817437648773, - -0.008986003696918488, - 0.0469699427485466, - 0.013530648313462734, - -0.004231555387377739, - 0.011878049932420254, - 0.004512368235737085, - -0.006113322451710701, - -0.002269095042720437, - 0.006681403145194054, - 0.00701063172891736, - -0.0016316180117428303, - -0.02034761570394039, - -0.0013120726216584444, - -0.012181457132101059, - -0.031657587736845016, - 0.02450493350625038, - 0.022916890680789948, - -0.025938047096133232, - 0.006946077104657888, - -0.018436800688505173, - 0.0010780622251331806, - -0.02056710235774517, - 0.01331116259098053, - -0.025912225246429443, - -0.018139848485589027, - 0.030082453042268753, - 0.006636214908212423, - -0.018862860277295113, - -0.0018220541533082724, - 0.032922856509685516, - 0.027164584025740623, - 0.0049674781039357185, - 0.004890012554824352, - 0.013375717215240002, - 0.001705855829641223, - -0.0007004176150076091, - 0.022826513275504112, - -0.016525983810424805, - 0.019172722473740578, - -0.014602255076169968, - 0.027371158823370934, - -0.010109253227710724, - -0.009250677190721035, - -0.027319515123963356, - -0.0037570788990706205, - 0.015699684619903564, - -0.006100411526858807, - -9.284770203521475e-05, - -0.006997720804065466, - 0.0019172722240909934, - 0.02329130657017231, - -0.00461565563455224, - -0.013685579411685467, - 0.005170824937522411, - -0.0017203806200996041, - 0.011639198288321495, - 0.016964955255389214, - -0.008856894448399544, - -0.013788866810500622, - -0.022206788882613182, - 0.013027122244238853, - -0.008327546529471874, - -0.012026526033878326, - 0.00020344792574178427, - 0.00208027265034616, - 0.001817212556488812, - -0.00914738979190588, - 0.002096411306411028, - 0.024801885709166527, - -0.006571660283952951, - -0.006784690544009209, - 0.014279481954872608, - 0.014150372706353664, - 0.0026709474623203278, - 0.008559943176805973, - -0.009076380170881748, - 0.01402126345783472, - -0.0292819757014513, - -0.004083079751580954, - 0.020283062011003494, - 0.012194368056952953, - -0.01624194346368313, - 0.008689052425324917, - -0.011761851608753204, - 0.003563415026292205, - 0.04289009049534798, - -0.0017591133946552873, - -0.009747747331857681, - 0.00556138064712286, - 0.018656285479664803, - -0.014382769353687763, - -0.0028823637403547764, - -0.005170824937522411, - -0.0009061854798346758, - -0.016138656064867973, - 0.003221275517717004, - -0.00014050716708879918, - -0.007094552740454674, - -0.022180967032909393, - -0.03075382113456726, - 0.01372431218624115, - -0.017403926700353622, - -0.007966040633618832, - -0.03653791546821594, - 0.013052944093942642, - 0.020115219056606293, - -0.03119279257953167, - 0.00556138064712286, - -0.0019156583584845066, - 0.02409178391098976, - -0.03305196762084961, - -0.01537691056728363, - 0.016500161960721016, - 0.015854615718126297, - -0.014008352532982826, - 0.014537700451910496, - -0.018036561086773872, - -0.01507995929569006, - -0.03488531708717346, - 0.02494390495121479, - -0.013763044960796833, - 0.005593657959252596, - -0.030289027839899063, - -0.024788973852992058, - 0.003569870488718152, - -0.015893347561359406, - -0.031115327030420303, - 0.007966040633618832, - -0.0341106615960598, - -0.009812301956117153, - -0.014524789527058601, - 0.016461428254842758, - -0.0013120726216584444, - -0.003531137714162469, - 0.004305793438106775, - 0.023988496512174606, - 0.014886295422911644, - -0.023846477270126343, - 0.0060584512539207935, - 0.027319515123963356, - 0.008185526356101036, - -0.01665509305894375, - -0.011871594935655594, - -0.16247107088565826, - 0.04035954922437668, - 0.017003687098622322, - -0.0315801203250885, - 0.0046995761804282665, - 0.011096939444541931, - -0.007197840139269829, - 0.012000704184174538, - -0.010193174704909325, - 0.016099922358989716, - 0.016500161960721016, - 0.004973933566361666, - -0.01971498131752014, - -0.029798412695527077, - -0.01080644316971302, - -0.0011305127991363406, - -0.032509706914424896, - 0.009599272161722183, - 0.03225148841738701, - 0.0255507193505764, - 0.003721573855727911, - -0.015454376116394997, - 0.022929800674319267, - 0.0010328739881515503, - 4.037815870105987e-06, - 0.005090131890028715, - -0.01528653409332037, - -0.004086307715624571, - 0.016964955255389214, - -0.014718453399837017, - -0.011671475134789944, - 0.005903520155698061, - 0.016706736758351326, - 0.01484756264835596, - 0.001228151610121131, - 0.0060294014401733875, - 0.009754203259944916, - 0.005745361093431711, - -0.0023772239219397306, - 0.02664814703166485, - -0.0033051965292543173, - 0.0022109958808869123, - 0.003171245800331235, - 0.02409178391098976, - -0.016745468601584435, - 0.02391103096306324, - 0.020502546802163124, - -0.01203943695873022, - -0.01030291710048914, - -0.018824126571416855, - 0.006219837814569473, - -0.01620320975780487, - 0.008772972971200943, - -0.004564011935144663, - 0.004709259606897831, - 0.015131602995097637, - 0.03558250889182091, - 0.00420250603929162, - 0.005432271398603916, - -0.014176194556057453, - -0.007094552740454674, - -0.007417325861752033, - 0.018772482872009277, - 0.0015840090345591307, - 0.017158618196845055, - -0.015196157619357109, - 0.0010005966760218143, - -0.0034407612401992083, - -0.022710315883159637, - 0.024840617552399635, - -0.025899313390254974, - -0.025279588997364044, - 0.003889415878802538, - -0.01059986837208271, - 0.0070493645034730434, - 0.009786480106413364, - 0.0005386276170611382, - -0.005629162769764662, - -0.017765432596206665, - -0.006481283809989691, - -0.04260604828596115, - 0.0211868267506361, - -0.015699684619903564, - 0.02015395276248455, - 0.005109498277306557, - 0.010193174704909325, - -0.015325266867876053, - 0.00905055832117796, - -0.017003687098622322, - -0.018630463629961014, - 0.032303132116794586, - -0.036279696971178055, - 0.01810111664235592, - -0.03912010043859482, - 0.025060104206204414, - 0.021741995587944984, - -0.0008488932508043945, - 0.01870792917907238, - -0.006171421613544226, - -0.0001905370008898899, - 0.017726698890328407, - -0.013763044960796833, - 0.0060907285660505295, - -0.0021157776936888695, - 0.030108274891972542, - 0.015712594613432884, - -0.012491319328546524, - 0.026067156344652176, - 0.03757078945636749, - 0.004628566559404135, - -0.027990883216261864, - 0.005409677047282457, - 0.036692846566438675, - 0.027500268071889877, - -0.02289106883108616, - 0.008275902830064297, - 0.013801777735352516, - -0.018036561086773872, - 0.01994737796485424, - 0.003921693190932274, - 0.05012020841240883, - -0.028972113505005836, - -0.011878049932420254, - 0.009670281782746315, - -0.0016542121302336454, - -0.004651160445064306, - -0.09636713564395905, - 0.013298251666128635, - 0.02558945119380951, - -0.008656774647533894, - 0.0031841567251831293, - 0.026880543678998947, - 0.010722522623836994, - 0.014731364324688911, - 0.011167949065566063, - 0.014989582821726799, - 0.00011952691420447081, - -0.015118692070245743, - -0.015351088717579842, - -0.014615166001021862, - -0.004676982294768095, - 0.007178473751991987, - -0.01321433112025261, - -0.0021851740311831236, - -0.034394703805446625, - 0.0041766841895878315, - -0.0012846369063481688, - -0.02619626559317112, - -0.016900399699807167, - -0.011309969238936901, - -0.01496376097202301, - -0.0008892398909665644, - -0.024698598310351372, - 0.011548821814358234, - 0.006468372885137796, - 0.02830074541270733, - -0.0017558856634423137, - -0.025873491540551186, - -0.007081641815602779, - -0.012032981030642986, - -0.026751434430480003, - -0.028145814314484596, - -0.0124590415507555, - 0.007075186353176832, - -0.0004353402182459831, - -0.020670389756560326, - 0.004770586267113686, - -0.014860473573207855, - 0.017829986289143562, - -0.013905065134167671, - 0.024982638657093048, - -0.020954430103302002, - -0.016125744208693504, - 0.018837038427591324, - 0.02428544871509075, - -0.003297127317637205, - -0.01994737796485424, - 0.006875067017972469, - -0.003363295691087842, - -0.0033277906477451324, - 0.030314849689602852, - -0.02930779755115509, - 0.012284744530916214, - 0.007184929214417934, - -0.014731364324688911, - -0.0052805677987635136, - -0.01622903160750866, - 0.027706842869520187, - -0.007468969561159611, - 0.018875770270824432, - -0.0013758203713223338, - 0.0021916294936090708, - -0.005780866369605064, - 0.008889171294867992, - 0.020915696397423744, - -0.022193878889083862, - -0.04263187199831009, - 0.005548469722270966, - -0.019004879519343376, - 0.0062262932769954205, - -0.032561350613832474, - 0.0063715409487485886, - -0.034807853400707245, - 0.009734836407005787, - -0.003019542433321476, - 0.0006003579474054277, - -0.014524789527058601, - -0.011251870542764664, - -0.014331125654280186, - -0.005874470341950655, - 0.0014960533007979393, - 0.043561458587646484, - 0.010348105803132057, - -0.006694314070045948, - -0.0012450972571969032, - -0.03240641951560974, - -0.01913398876786232, - 0.018152760341763496, - 0.0034536721650511026, - 0.0028178091160953045, - -0.00041839462937787175, - 0.014899206347763538, - 0.0057485890574753284, - 0.01018026378005743, - 0.03811304643750191, - -0.012452586553990841, - -0.011600465513765812, - -0.007972495630383492, - -0.06326352804899216, - 0.016977865248918533, - 0.01873375102877617, - -0.010858086869120598, - 0.02577020414173603, - 0.013775955885648727, - 0.027112940326333046, - 0.013479004614055157, - -0.009851034730672836, - -0.0170553307980299, - -0.008250080980360508, - 0.032535530626773834, - -0.0118586840108037, - -0.02180655114352703, - -0.025266679003834724, - 0.008049961179494858, - 0.024195071309804916, - 0.017972007393836975, - 0.011309969238936901, - 0.010832265019416809, - -0.021341757848858833, - 0.021135183051228523, - 0.02948855049908161, - 0.013905065134167671, - -0.023975586518645287, - -0.0034924049396067858, - -0.0065361554734408855, - -0.009063469246029854, - -0.025899313390254974, - 0.005367716774344444, - 0.02161288633942604, - -0.02096734009683132, - -0.0019414802081882954, - 0.04691829904913902, - -0.027371158823370934, - -0.008914993144571781, - 0.010380382649600506, - 0.019017791375517845, - 0.007972495630383492, - -0.020902786403894424, - -0.008166159503161907, - -0.025434520095586777, - -0.0012886716285720468, - -0.022206788882613182, - -0.015234890393912792, - 0.00441230833530426, - -0.009205489419400692, - 0.00014434009790420532, - 0.04059194400906563, - -0.008133882656693459, - 0.025666916742920876, - 0.018372245132923126, - -0.005380627699196339, - -0.004631794057786465, - 0.014214927330613136, - -0.026467394083738327, - 0.02014104090631008, - 0.004031436052173376, - 0.017145708203315735, - -0.008798794820904732, - 0.026092978194355965, - 0.0026644919998943806, - 0.021470867097377777, - 0.0034859494771808386, - 0.009224855341017246, - -0.00832109060138464, - -0.020205596461892128, - -0.01195551548153162, - 0.02597677893936634, - -0.011290603317320347, - -0.008805250748991966, - 0.00395074300467968, - 0.008953725919127464, - 0.007191384676843882, - 0.028145814314484596, - -0.020838230848312378, - 0.006842789705842733, - 0.003640880575403571, - -0.010612779296934605, - 0.03465292230248451, - 0.0011087256716564298, - 0.004305793438106775, - -0.05572354793548584, - 0.0075980788096785545, - 0.017933273687958717, - 0.006468372885137796, - -0.009760658256709576, - 0.0006330387550406158, - 0.004483318421989679, - 0.01786871999502182, - 0.02407887391746044, - -0.011084028519690037, - -0.04472343996167183, - 0.004089535214006901, - -0.008140337653458118, - -0.02079949900507927, - -0.006823423318564892, - -0.015854615718126297, - -0.001550117856822908, - 0.044413577765226364, - 0.019495494663715363, - 0.012730170972645283, - 0.017765432596206665, - -0.019637515768408775, - -0.016267765313386917, - 0.006419957149773836, - -0.013943797908723354, - -0.020437993109226227, - -0.008585765026509762, - 0.004725398030132055, - 0.004215416964143515, - -0.015196157619357109, - -0.0038506831042468548, - 0.012175001204013824, - -0.020231418311595917, - 0.012142724357545376, - -0.030056631192564964, - -0.021909838542342186, - 0.003108304925262928, - 0.02263285033404827, - -0.0094766179099679, - 0.00822425913065672, - 0.013020667247474194, - 0.005596885457634926, - 0.004270288161933422, - 0.006771779619157314, - 0.02207767963409424, - 0.0013701717834919691, - 0.03057306818664074, - 0.005603340920060873, - 0.021664530038833618, - -0.025421610102057457, - -0.0067459577694535255, - -0.017533035948872566, - 0.0064038182608783245, - -0.006187560502439737, - 0.040023863315582275, - 0.004673754330724478, - 0.0036118309944868088, - 0.050404246896505356, - 0.008488932624459267, - -0.031037861481308937, - -0.002519244095310569, - -0.008508299477398396, - 0.015944991260766983, - 0.017804164439439774, - 0.010845175944268703, - -0.02598969079554081, - -0.0043832589872181416, - 0.006277936976402998, - 0.010703155770897865, - 0.023446237668395042, - -0.005651757121086121, - -0.044207002967596054, - 0.011374523863196373, - -0.03535011038184166, - 0.007488335948437452, - -0.0061940159648656845, - -5.169412816030672e-06, - -0.0012289586011320353, - 0.0037635343614965677, - 0.01103238482028246, - 0.002398204058408737, - -0.015105781145393848, - -0.01289801299571991, - -0.015480197966098785, - -0.015944991260766983, - -0.02496972680091858, - -0.018824126571416855, - 0.013672668486833572, - -0.003145423950627446, - -0.04782206192612648, - -0.010154441930353642, - 0.008863349445164204, - -0.003411711659282446, - -0.005028804764151573, - 0.004906150978058577, - 0.005093359388411045, - 0.03612476587295532, - -0.018126938492059708, - 0.017403926700353622, - -0.03473038598895073, - -0.02283942513167858, - -0.0028016704600304365, - -0.004421991761773825, - -0.005022349301725626, - 0.002007648814469576, - -0.03757078945636749 - ], "DOT") LIMIT 3; -/* end::query-vectors-idx-whole[] */ - - -/* tag::query-vectors-idx-filtered-truncated[] */ -SELECT b.color, b.description from `rgb` AS b -WHERE brightness > 190.0 -ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, -[ - 0.005115953739732504, - 0.004331615287810564, - 0.014279481954872608, - /* long list of vector values omitted */ - -0.005022349301725626, - 0.002007648814469576, - -0.03757078945636749 - ], "DOT") LIMIT 3; -/* end::query-vectors-idx-filtered-truncated[] */ - -/* tag::query-vectors-idx-filtered-whole[] */ -SELECT b.color, b.description from `rgb` AS b -WHERE brightness > 190.0 -ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, -[ - 0.005115953739732504, - 0.004331615287810564, - 0.014279481954872608, - 0.000619320897385478, - 0.006700769532471895, - 0.018410978838801384, - -0.010367471724748611, - -0.019805356860160828, - 0.013059400022029877, - -0.011271236464381218, - -0.011251870542764664, - -0.004915834404528141, - -0.0031744735315442085, - 0.00843728892505169, - -0.01706824265420437, - 0.013362806290388107, - 0.04694411903619766, - 0.011258325539529324, - 0.01298193447291851, - -0.01080644316971302, - -0.01744265854358673, - 0.0044155362993478775, - -0.00742378132417798, - 0.014214927330613136, - -0.01248486340045929, - 0.0009481459856033325, - 0.027293693274259567, - -0.029204510152339935, - 0.006355402525514364, - 0.016254853457212448, - 0.02933361940085888, - -0.017352283000946045, - 0.007236572913825512, - -0.017094064503908157, - 0.002293302910402417, - -0.018139848485589027, - 0.007811109069734812, - 0.015028315596282482, - -0.008785883896052837, - -0.013453182764351368, - -8.422360406257212e-05, - 0.010896819643676281, - 0.002246500924229622, - -0.010586957447230816, - -0.0011482653208076954, - -0.003537593176588416, - 0.02017977461218834, - -0.013491915538907051, - -0.00977356918156147, - 0.01215563528239727, - 0.032122381031513214, - 0.02827492356300354, - 0.002995334332808852, - -0.027396980673074722, - 0.004583378322422504, - 0.0007577098440378904, - 0.00016683334251865745, - 0.025731472298502922, - 0.006158510688692331, - -0.008288813754916191, - 0.00016885067452676594, - 0.01956005021929741, - -0.01309813279658556, - 0.009934956207871437, - -0.007920851930975914, - 0.008721329271793365, - -0.032354775816202164, - -0.0031050771940499544, - -0.0049997554160654545, - 0.029178688302636147, - 0.0075980788096785545, - 0.024995548650622368, - 0.018165670335292816, - -0.008463110774755478, - 0.025292500853538513, - -0.0031518794130533934, - -0.01706824265420437, - -0.00925713311880827, - -0.013375717215240002, - 0.0066749476827681065, - 0.015144513919949532, - -0.0011805426329374313, - -0.037312570959329605, - 0.015092870220541954, - 0.01786871999502182, - 0.015002493746578693, - -0.020631656050682068, - 0.0021415995433926582, - -0.004912606440484524, - -0.004880329128354788, - -0.012523596175014973, - 0.024246715009212494, - 0.02413051761686802, - 0.0008162125013768673, - -0.02077367715537548, - 0.005419360473752022, - 0.008508299477398396, - 0.010470759123563766, - 0.0004575308703351766, - -0.01443441305309534, - -0.00852766539901495, - 0.017326461151242256, - -0.03674449026584625, - -0.009579905308783054, - -0.018643373623490334, - -0.0009473390528000891, - 0.00832109060138464, - -0.0016057961620390415, - 0.023614080622792244, - -0.024272536858916283, - -0.042502760887145996, - 0.03207073733210564, - 0.009534717537462711, - -0.041082561016082764, - -0.010651512071490288, - -0.01997319981455803, - 0.016306497156620026, - 0.015648040920495987, - -0.00894081499427557, - -0.03473038598895073, - -0.00884398352354765, - 0.018010739237070084, - 0.019004879519343376, - -0.015970813110470772, - 0.01914690062403679, - 0.0008166159386746585, - -0.006232748739421368, - -0.033568404614925385, - -0.03416230529546738, - -0.02494390495121479, - 0.02163870818912983, - 0.01701659895479679, - -0.004396169912070036, - 0.003786128479987383, - -0.008372734300792217, - 0.014563522301614285, - -0.01029646210372448, - 0.005622707307338715, - 0.010270640254020691, - 0.0004607586015481502, - 0.032096557319164276, - 0.021096449345350266, - -0.00034355162642896175, - -0.007966040633618832, - -0.004928745329380035, - 0.02806834876537323, - 0.010528858751058578, - 0.013349895365536213, - -0.006629759445786476, - -0.01913398876786232, - 0.02205185778439045, - -0.015480197966098785, - 0.02580893784761429, - 0.013362806290388107, - 0.010244818404316902, - 0.024246715009212494, - -0.0043122489005327225, - 0.0009594430448487401, - -0.02948855049908161, - 0.005044943653047085, - -0.004499457310885191, - -0.010373927652835846, - 0.0007040488417260349, - 0.012032981030642986, - 0.02039925940334797, - 0.02788759581744671, - 0.01807529479265213, - 0.008695507422089577, - 0.0015170335536822677, - 0.02059292420744896, - -0.012291199527680874, - 0.02706129662692547, - -0.009663826785981655, - 0.01101301796734333, - -0.013336984440684319, - 0.025705650448799133, - 0.006765324156731367, - 0.007197840139269829, - 0.024156339466571808, - -0.012975478544831276, - -0.03098621778190136, - -0.004870646167546511, - -0.000659667537547648, - -0.01186513900756836, - -0.007849842309951782, - -0.005797004792839289, - 0.022310076281428337, - -0.02099316194653511, - 0.0013346667401492596, - -0.011600465513765812, - -0.002236817730590701, - 0.020825320854783058, - 0.0010651513002812862, - -0.022826513275504112, - -0.6420344114303589, - 8.150020585162565e-05, - -0.014214927330613136, - -0.015841703861951828, - 0.02079949900507927, - 0.020205596461892128, - 0.037544965744018555, - 0.012265377677977085, - 0.0005870435852557421, - -0.01665509305894375, - 0.005919658578932285, - 0.013349895365536213, - 0.016577627509832382, - -0.01664218120276928, - 0.0006382837891578674, - -0.013969619758427143, - -0.017326461151242256, - -0.00033669269760139287, - -0.013027122244238853, - 0.00042283275979571044, - -0.00431870436295867, - 0.02161288633942604, - -0.007572256959974766, - 0.007262394763529301, - 0.019469672814011574, - 0.01372431218624115, - 0.001147458446212113, - -0.013479004614055157, - 0.014279481954872608, - 0.043587278574705124, - -0.027138762176036835, - 0.015118692070245743, - 8.61400694702752e-05, - 0.00968319270759821, - 0.04738309234380722, - 0.01579006016254425, - -0.026544859632849693, - 0.03506607189774513, - -0.022348809987306595, - 0.05510382354259491, - -0.01931474171578884, - 0.011671475134789944, - 0.02081240899860859, - -0.03098621778190136, - 0.0003318511007819325, - 0.021574154496192932, - 0.024272536858916283, - -0.015854615718126297, - 0.028378210961818695, - -0.015467287041246891, - 0.019689159467816353, - 0.005471004173159599, - 0.014718453399837017, - 0.0048641907051205635, - 0.00894081499427557, - 0.010845175944268703, - 0.030056631192564964, - -0.016538893803954124, - 0.012317021377384663, - 0.009366875514388084, - -0.003025997895747423, - 0.0029791956767439842, - -0.01434403657913208, - -0.019185632467269897, - -0.014976671896874905, - 0.03465292230248451, - -0.013788866810500622, - -0.013091676868498325, - -0.0024353230837732553, - -0.028791360557079315, - -0.005522647872567177, - -0.008630952797830105, - -0.02286524698138237, - 0.009418519213795662, - 0.00011145758617203683, - -0.0103932935744524, - 0.012342843227088451, - 0.017584679648280144, - -0.008288813754916191, - 0.009754203259944916, - 0.0016525982646271586, - -0.00712683005258441, - -0.005467776209115982, - 0.0034956326708197594, - 0.0353759340941906, - 0.013324073515832424, - -0.03535011038184166, - -0.04258022829890251, - 0.01322078611701727, - 0.011193770915269852, - 0.023756099864840508, - 0.030934574082493782, - 0.0018236680189147592, - -0.0009667054400779307, - -0.012588150799274445, - 0.003983020316809416, - -0.02369154617190361, - -0.015234890393912792, - -0.026299552991986275, - -0.007107463665306568, - 0.00779174268245697, - -0.015389821492135525, - -0.012310566380620003, - 0.008262991905212402, - 0.02664814703166485, - -0.0017284499481320381, - -0.0297467689961195, - 0.022607028484344482, - 0.023575346916913986, - -0.017326461151242256, - 0.020115219056606293, - -0.026751434430480003, - 0.0026580365374684334, - 0.003090552520006895, - 0.03596983477473259, - -0.02451784536242485, - 0.02471150830388069, - -0.003347157035022974, - -0.007533524185419083, - -0.02556362934410572, - 0.02933361940085888, - -0.013298251666128635, - -0.014279481954872608, - 0.007507702335715294, - 0.017571767792105675, - 0.00280489819124341, - -0.008424378000199795, - -0.0010514333844184875, - -0.0030469780322164297, - -0.0012862507719546556, - 0.021161004900932312, - -0.0022755505051463842, - -0.0011644039768725634, - 0.0031744735315442085, - -0.00047205566079355776, - -0.014576433226466179, - 0.004460724536329508, - -0.010031787678599358, - 0.008256535977125168, - -0.04513658955693245, - -0.019288919866085052, - -0.013233697041869164, - 0.00965091586112976, - 0.0026709474623203278, - -0.021884016692638397, - -0.03516935929656029, - -0.03281956911087036, - 0.008663230575621128, - -0.038784414529800415, - -0.010322283953428268, - -0.016474340111017227, - -0.013788866810500622, - -0.022568294778466225, - 0.03183833882212639, - 0.025834759697318077, - -0.0028807499911636114, - -0.02100607380270958, - -0.02249082922935486, - -0.01434403657913208, - -0.007365682162344456, - 0.01994737796485424, - 0.02972094714641571, - -0.008837527595460415, - -0.009457251988351345, - -0.013595202937722206, - -0.04121166840195656, - -0.009605727158486843, - 0.013111043721437454, - -0.010877453722059727, - -0.023368772119283676, - 0.012420308776199818, - -0.012820547446608543, - -0.006842789705842733, - 0.012523596175014973, - -0.005935797467827797, - 0.013646846637129784, - -0.006868611555546522, - -0.021264292299747467, - -0.002252956386655569, - -0.007681999821215868, - 0.00020627219055313617, - 0.009089291095733643, - -0.005713083781301975, - -0.005212785676121712, - 0.03496278449892998, - 0.001072413637302816, - 0.022090591490268707, - 0.07266268134117126, - -0.02431127056479454, - 0.032974500209093094, - -0.0030485920142382383, - 0.009289409965276718, - -0.01660344935953617, - 0.001254780450835824, - -0.01340153906494379, - 0.01103238482028246, - 0.010199629701673985, - -0.0026919275987893343, - -0.012142724357545376, - -0.005038488190621138, - 0.031709231436252594, - 0.023562436923384666, - 0.011781218461692333, - -0.003963653929531574, - 0.016164477914571762, - -0.02034761570394039, - 0.016745468601584435, - 0.0006649125716648996, - 0.008069328032433987, - 0.022168057039380074, - -0.0036215141881257296, - -0.03199326992034912, - -0.008366279304027557, - -0.014576433226466179, - 0.006668492220342159, - 0.0007762692985124886, - 0.00029594259103760123, - 0.010864542797207832, - -0.0174555703997612, - 0.013349895365536213, - 0.017984917387366295, - 0.010993652045726776, - 0.01976662501692772, - -0.013956708833575249, - -0.00499007198959589, - 0.007546435110270977, - 0.014498967677354813, - -0.0032164340373128653, - -0.01974080316722393, - -0.03395573049783707, - -0.013853421434760094, - -0.0065393829718232155, - -0.005961619317531586, - 0.0028016704600304365, - -0.005122409202158451, - 0.005061082076281309, - 0.01603536866605282, - -0.024595310911536217, - 0.03449799120426178, - 0.008217803202569485, - 0.01891450397670269, - 0.031683407723903656, - 0.005170824937522411, - 0.006481283809989691, - 0.04433611407876015, - -0.02637701854109764, - 0.0172231737524271, - 0.005474231671541929, - 0.0028710667975246906, - 0.0050417156890034676, - -0.026351196691393852, - -0.007681999821215868, - -0.04808028042316437, - 0.009780025109648705, - 0.011619831435382366, - -0.013982530683279037, - 0.014576433226466179, - -0.0004478476766962558, - 0.020864052698016167, - 0.017545945942401886, - 0.02428544871509075, - -0.019043613225221634, - 0.009986599907279015, - -0.01952131651341915, - 0.00379258394241333, - 0.008004773408174515, - 0.004909378942102194, - 0.003116374369710684, - -0.018785394728183746, - -0.008095149882137775, - 0.008701963350176811, - -0.0237173680216074, - 0.009082835167646408, - -0.02453075535595417, - -0.0049674781039357185, - 0.0127753596752882, - -0.003941059578210115, - -0.018165670335292816, - -0.00499007198959589, - 0.00441230833530426, - -0.010193174704909325, - -0.032328955829143524, - 0.004309020936489105, - 0.0170553307980299, - -0.005080448463559151, - -0.018630463629961014, - -0.00671368045732379, - 0.030237384140491486, - -0.026958009228110313, - 0.0016606675926595926, - 0.024375824257731438, - 0.033800799399614334, - 0.022619938477873802, - -0.0027839180547744036, - -0.0024272536393254995, - -0.02493099495768547, - 0.017829986289143562, - 0.004564011935144663, - 0.010690244846045971, - -0.00247244187630713, - 0.006426412612199783, - -0.006271481513977051, - -0.024220893159508705, - 0.008295268751680851, - 0.02227134443819523, - 0.017300639301538467, - 0.002096411306411028, - -0.00018418239778839052, - 0.00420250603929162, - -0.019430940970778465, - -0.010774166323244572, - -0.011903871782124043, - 0.0039023268036544323, - -0.00925713311880827, - 0.009276499040424824, - 0.015118692070245743, - -0.016383962705731392, - -0.018359335139393806, - 0.042270366102457047, - -0.013582292012870312, - 0.0026806306559592485, - -0.011206681840121746, - -0.014821740798652172, - 0.007075186353176832, - 0.05422588065266609, - -0.006026173941791058, - -0.010412660427391529, - 0.0015331722097471356, - 0.019676247611641884, - 0.012058802880346775, - -0.021303024142980576, - -0.02076076529920101, - 0.00893435999751091, - 0.004357437137514353, - -0.0068105123937129974, - 0.003177701262757182, - -0.014770097099244595, - 0.008469566702842712, - 0.0034052561968564987, - 0.001760727260261774, - -0.0002231169055448845, - -0.02892046980559826, - -0.006868611555546522, - -0.028326567262411118, - -0.014369858428835869, - 0.014395680278539658, - -0.005064310040324926, - 0.015467287041246891, - -0.010787077248096466, - 0.010832265019416809, - 0.038242157548666, - 0.018785394728183746, - 0.006449006497859955, - -0.020463814958930016, - 0.014679720625281334, - 0.0031486516818404198, - -0.007694910746067762, - 0.001307231024838984, - -0.030237384140491486, - -0.003976564854383469, - -0.020902786403894424, - -0.005809915717691183, - -0.01404708530753851, - -0.003650563769042492, - -0.003025997895747423, - 0.015660950914025307, - -0.014176194556057453, - -0.0116262873634696, - 0.01331116259098053, - -0.010535313747823238, - -0.014085818082094193, - 0.003834544448181987, - -0.013956708833575249, - 0.01422783825546503, - 0.007656177971512079, - -0.0012346070725470781, - -0.0008440516539849341, - -0.006145599763840437, - 0.0010465917875990272, - 0.0094766179099679, - -0.023188019171357155, - -0.0028339477721601725, - 0.01321433112025261, - -0.019689159467816353, - -0.0012321863323450089, - -0.022335898131132126, - 0.0003241852391511202, - 0.008256535977125168, - -0.011613376438617706, - -0.04136659950017929, - 0.005361261311918497, - -0.038242157548666, - -0.01059341337531805, - -0.014576433226466179, - -0.005667895544320345, - -0.027319515123963356, - -0.012704349122941494, - 0.01828186959028244, - 0.02349788136780262, - 0.02330421842634678, - 0.007236572913825512, - 0.00861804187297821, - 0.01975371316075325, - 0.01621612161397934, - -0.0014678107108920813, - -0.009424974210560322, - -0.006681403145194054, - -0.018772482872009277, - -0.0005394345498643816, - -0.0009868787601590157, - 0.0320449136197567, - -0.015635129064321518, - -0.01580297201871872, - 0.010122164152562618, - 0.016177387908101082, - -0.013259518891572952, - 0.03413648530840874, - -0.021057717502117157, - -0.00473508145660162, - 0.018152760341763496, - 0.011000107042491436, - 0.015919169411063194, - -0.004273516125977039, - -0.027758486568927765, - 0.008914993144571781, - -0.026983831077814102, - -0.0003104673814959824, - -0.02206476964056492, - 0.012168546207249165, - -0.00358600914478302, - -0.009308775886893272, - 0.0029097995720803738, - -0.018979057669639587, - -0.007385048549622297, - 0.010464304126799107, - -0.005532330833375454, - 0.004405852872878313, - 0.023562436923384666, - -0.006629759445786476, - 0.007101008202880621, - -0.023536615073680878, - 0.030857108533382416, - -0.00613914430141449, - -0.028817182406783104, - 0.012213733978569508, - -0.05587847903370857, - 0.0013596817152574658, - -0.0006209347629919648, - -0.022168057039380074, - 0.0028807499911636114, - 0.006303758826106787, - -0.00539999408647418, - 0.00671368045732379, - -0.0013120726216584444, - 0.002383679384365678, - 0.013149776495993137, - -0.007772376295179129, - -0.022568294778466225, - -0.04898404702544212, - -0.004215416964143515, - 0.011019473895430565, - 0.016345230862498283, - -0.004915834404528141, - -0.020463814958930016, - -0.01891450397670269, - 0.03300032392144203, - -0.015209068544209003, - -0.02121264860033989, - -0.03568579629063606, - -0.030624711886048317, - 0.033129431307315826, - 0.0057485890574753284, - -0.009941411204636097, - 0.02680307812988758, - -0.026364106684923172, - -0.00288559147156775, - -0.013995441608130932, - 0.014369858428835869, - -7.84742078394629e-05, - -0.014447323977947235, - -0.03196744993329048, - -0.017804164439439774, - 0.018385156989097595, - -0.005532330833375454, - 0.01112921629101038, - 0.015480197966098785, - 0.032742105424404144, - 0.011000107042491436, - -0.017197351902723312, - -0.010212540626525879, - -0.015441465191543102, - 0.002488580532371998, - -0.01600954681634903, - 0.012859280221164227, - 0.02429835870862007, - 0.014692631550133228, - 0.00968319270759821, - 0.00819843728095293, - 0.03116697072982788, - 0.022297166287899017, - 0.008689052425324917, - -0.01892741397023201, - -0.008863349445164204, - -0.02413051761686802, - -0.014653898775577545, - 0.005671123508363962, - -0.009625094011425972, - -0.00072664296021685, - 0.02493099495768547, - 0.009786480106413364, - 0.0253828763961792, - 0.017106974497437477, - -0.009689648635685444, - 0.004954567179083824, - 0.029798412695527077, - 0.010244818404316902, - 0.024569489061832428, - -0.005290251225233078, - 0.01206525880843401, - -0.03989475592970848, - -0.032948680222034454, - 0.0032067508436739445, - -0.024827707558870316, - -0.007230117451399565, - 0.0014653898542746902, - 0.009005369618535042, - 0.011961971409618855, - -0.0028016704600304365, - 0.011903871782124043, - 0.022374631837010384, - 0.014279481954872608, - 0.002787145785987377, - 0.008256535977125168, - -0.007920851930975914, - -0.0590287446975708, - -0.008179070428013802, - -0.04596288874745369, - -0.04172810539603233, - 0.0019027474336326122, - 0.006784690544009209, - -0.038552019745111465, - 0.026570681482553482, - 0.010012421756982803, - -0.002772620879113674, - -0.008153248578310013, - -0.0035827814135700464, - 0.00415731780230999, - -0.020334705710411072, - 0.0441037155687809, - -0.004292882513254881, - -0.00043211248703300953, - -0.009115112945437431, - 0.001920499955303967, - -0.016074100509285927, - -0.011755396611988544, - 0.03496278449892998, - 0.019418029114603996, - -0.001509771216660738, - -0.020864052698016167, - 0.022710315883159637, - 0.005758272018283606, - -0.015015404671430588, - -0.009192578494548798, - 0.004983616527169943, - 0.040230438113212585, - 0.0032842163927853107, - -0.039817288517951965, - 0.030185740441083908, - -0.02413051761686802, - 0.03341347351670265, - 0.0032083645928651094, - -0.018036561086773872, - 0.016732558608055115, - -0.02183237299323082, - 0.0003052223182749003, - 0.022723225876688957, - -0.017106974497437477, - 0.022568294778466225, - -0.00087632896611467, - 0.014176194556057453, - -0.01289155799895525, - 0.008753607049584389, - -0.022193878889083862, - -0.004238010849803686, - -0.0060584512539207935, - 0.0023304217029362917, - 0.01770087704062462, - 0.003155107144266367, - 0.011581098660826683, - 0.014628076925873756, - 0.0070170871913433075, - 0.01621612161397934, - 0.011774762533605099, - 0.027810130268335342, - -0.010141531005501747, - 0.014318214729428291, - -0.013737223111093044, - 0.0001642108109081164, - 0.0021545104682445526, - -0.0005850262241438031, - 0.0009626707760617137, - -0.0011571416398510337, - -0.0033891175407916307, - -0.015919169411063194, - 0.03881023824214935, - -0.00852766539901495, - -0.0292819757014513, - 0.01413746178150177, - 0.001689717173576355, - 0.009986599907279015, - -0.030908752232789993, - -0.017326461151242256, - 0.02330421842634678, - 0.0007924079545773566, - -0.03119279257953167, - -0.020257240161299706, - 3.0058245101827197e-05, - 0.018578819930553436, - 0.001744588604196906, - -0.012471952475607395, - -0.005761499982327223, - -0.0022077681496739388, - -0.020915696397423744, - 0.03488531708717346, - -0.007688455283641815, - 0.010548224672675133, - -0.009818757884204388, - 0.012323477305471897, - -0.0036150587256997824, - -0.04596288874745369, - 0.026983831077814102, - -0.01952131651341915, - -0.035453397780656815, - -0.011807040311396122, - 0.01847553253173828, - 0.014240749180316925, - -0.009547628462314606, - -0.0049707056023180485, - 0.0062262932769954205, - 0.006449006497859955, - -0.006158510688692331, - 0.0026919275987893343, - -0.016913311555981636, - 0.012736626900732517, - -0.008146793581545353, - -0.01372431218624115, - 0.015518930740654469, - -0.006048767827451229, - -0.005877698305994272, - -0.031915806233882904, - -0.005909975618124008, - -0.007139740977436304, - -0.031244436278939247, - -0.003595692338421941, - -0.0068105123937129974, - 0.036873601377010345, - -0.007165562827140093, - -0.014150372706353664, - -0.015183246694505215, - 0.0006019718130119145, - -0.01622903160750866, - 0.01874666102230549, - 0.012020070105791092, - -0.01619029976427555, - -0.017403926700353622, - 0.029462728649377823, - 0.022180967032909393, - 0.0210189837962389, - -0.007572256959974766, - -0.01644851826131344, - -0.01825604774057865, - -0.018385156989097595, - -0.01466680970042944, - -0.00905055832117796, - -0.0055839745327830315, - 0.027371158823370934, - 0.02597677893936634, - -0.04059194400906563, - -0.030857108533382416, - 0.023781921714544296, - -0.023420415818691254, - -0.025834759697318077, - 0.016371052712202072, - 0.004722170531749725, - -0.0015210682759061456, - 0.01724899560213089, - -0.004993299953639507, - 0.018991969525814056, - 0.004809319041669369, - -0.01748139224946499, - -0.019237276166677475, - 0.0008916606893762946, - 0.012743081897497177, - -0.030934574082493782, - 0.03842290863394737, - -0.025615273043513298, - -0.03036649338901043, - -0.005680806469172239, - 0.01932765357196331, - -0.0033923452720046043, - 0.0026725612115114927, - 0.004583378322422504, - 0.010361016727983952, - 0.019882822409272194, - -0.004883557092398405, - 0.033129431307315826, - -0.0001690524077275768, - 0.003650563769042492, - 0.009011825546622276, - -0.020063575357198715, - -0.02286524698138237, - -0.02081240899860859, - 0.03661538287997246, - -0.036073122173547745, - 0.013750134035944939, - 0.023162197321653366, - 0.012846369296312332, - -0.026958009228110313, - -0.019392207264900208, - -0.006219837814569473, - 0.006013263016939163, - -0.019043613225221634, - -0.001880153315141797, - 0.003411711659282446, - -0.014305303804576397, - -0.008359823375940323, - -0.011897416785359383, - -0.015867525711655617, - -0.006100411526858807, - -0.025499075651168823, - -0.013995441608130932, - -0.0001231581118190661, - 0.021483777090907097, - -0.0021464412566274405, - -0.0072236619889736176, - -0.016525983810424805, - 0.016061190515756607, - -0.01829477958381176, - -0.018578819930553436, - -0.02680307812988758, - -0.02726787142455578, - -0.01600954681634903, - 0.028972113505005836, - 0.016371052712202072, - -0.014382769353687763, - 0.007843386381864548, - -0.014692631550133228, - -0.007055819965898991, - 0.0005442761466838419, - -0.0042799715884029865, - 0.005874470341950655, - -0.04758966714143753, - 0.010361016727983952, - 0.009818757884204388, - -0.02969512529671192, - -0.003356840228661895, - -0.003760306630283594, - 0.007772376295179129, - 0.01788162998855114, - 0.03176087513566017, - 0.22434021532535553, - 0.022206788882613182, - -0.0009489529184065759, - 0.039171744138002396, - 0.0189532358199358, - 0.022387541830539703, - 0.02620917558670044, - 0.022168057039380074, - -0.0061326888389885426, - 0.026570681482553482, - 0.0018317373469471931, - 0.016990777105093002, - 0.0008521209820173681, - 0.00717201828956604, - 0.008237170055508614, - -0.007778831757605076, - -0.04635021835565567, - -0.00758516788482666, - -0.02014104090631008, - 0.0025369965005666018, - 0.005935797467827797, - -0.024453289806842804, - -0.021767817437648773, - -0.008986003696918488, - 0.0469699427485466, - 0.013530648313462734, - -0.004231555387377739, - 0.011878049932420254, - 0.004512368235737085, - -0.006113322451710701, - -0.002269095042720437, - 0.006681403145194054, - 0.00701063172891736, - -0.0016316180117428303, - -0.02034761570394039, - -0.0013120726216584444, - -0.012181457132101059, - -0.031657587736845016, - 0.02450493350625038, - 0.022916890680789948, - -0.025938047096133232, - 0.006946077104657888, - -0.018436800688505173, - 0.0010780622251331806, - -0.02056710235774517, - 0.01331116259098053, - -0.025912225246429443, - -0.018139848485589027, - 0.030082453042268753, - 0.006636214908212423, - -0.018862860277295113, - -0.0018220541533082724, - 0.032922856509685516, - 0.027164584025740623, - 0.0049674781039357185, - 0.004890012554824352, - 0.013375717215240002, - 0.001705855829641223, - -0.0007004176150076091, - 0.022826513275504112, - -0.016525983810424805, - 0.019172722473740578, - -0.014602255076169968, - 0.027371158823370934, - -0.010109253227710724, - -0.009250677190721035, - -0.027319515123963356, - -0.0037570788990706205, - 0.015699684619903564, - -0.006100411526858807, - -9.284770203521475e-05, - -0.006997720804065466, - 0.0019172722240909934, - 0.02329130657017231, - -0.00461565563455224, - -0.013685579411685467, - 0.005170824937522411, - -0.0017203806200996041, - 0.011639198288321495, - 0.016964955255389214, - -0.008856894448399544, - -0.013788866810500622, - -0.022206788882613182, - 0.013027122244238853, - -0.008327546529471874, - -0.012026526033878326, - 0.00020344792574178427, - 0.00208027265034616, - 0.001817212556488812, - -0.00914738979190588, - 0.002096411306411028, - 0.024801885709166527, - -0.006571660283952951, - -0.006784690544009209, - 0.014279481954872608, - 0.014150372706353664, - 0.0026709474623203278, - 0.008559943176805973, - -0.009076380170881748, - 0.01402126345783472, - -0.0292819757014513, - -0.004083079751580954, - 0.020283062011003494, - 0.012194368056952953, - -0.01624194346368313, - 0.008689052425324917, - -0.011761851608753204, - 0.003563415026292205, - 0.04289009049534798, - -0.0017591133946552873, - -0.009747747331857681, - 0.00556138064712286, - 0.018656285479664803, - -0.014382769353687763, - -0.0028823637403547764, - -0.005170824937522411, - -0.0009061854798346758, - -0.016138656064867973, - 0.003221275517717004, - -0.00014050716708879918, - -0.007094552740454674, - -0.022180967032909393, - -0.03075382113456726, - 0.01372431218624115, - -0.017403926700353622, - -0.007966040633618832, - -0.03653791546821594, - 0.013052944093942642, - 0.020115219056606293, - -0.03119279257953167, - 0.00556138064712286, - -0.0019156583584845066, - 0.02409178391098976, - -0.03305196762084961, - -0.01537691056728363, - 0.016500161960721016, - 0.015854615718126297, - -0.014008352532982826, - 0.014537700451910496, - -0.018036561086773872, - -0.01507995929569006, - -0.03488531708717346, - 0.02494390495121479, - -0.013763044960796833, - 0.005593657959252596, - -0.030289027839899063, - -0.024788973852992058, - 0.003569870488718152, - -0.015893347561359406, - -0.031115327030420303, - 0.007966040633618832, - -0.0341106615960598, - -0.009812301956117153, - -0.014524789527058601, - 0.016461428254842758, - -0.0013120726216584444, - -0.003531137714162469, - 0.004305793438106775, - 0.023988496512174606, - 0.014886295422911644, - -0.023846477270126343, - 0.0060584512539207935, - 0.027319515123963356, - 0.008185526356101036, - -0.01665509305894375, - -0.011871594935655594, - -0.16247107088565826, - 0.04035954922437668, - 0.017003687098622322, - -0.0315801203250885, - 0.0046995761804282665, - 0.011096939444541931, - -0.007197840139269829, - 0.012000704184174538, - -0.010193174704909325, - 0.016099922358989716, - 0.016500161960721016, - 0.004973933566361666, - -0.01971498131752014, - -0.029798412695527077, - -0.01080644316971302, - -0.0011305127991363406, - -0.032509706914424896, - 0.009599272161722183, - 0.03225148841738701, - 0.0255507193505764, - 0.003721573855727911, - -0.015454376116394997, - 0.022929800674319267, - 0.0010328739881515503, - 4.037815870105987e-06, - 0.005090131890028715, - -0.01528653409332037, - -0.004086307715624571, - 0.016964955255389214, - -0.014718453399837017, - -0.011671475134789944, - 0.005903520155698061, - 0.016706736758351326, - 0.01484756264835596, - 0.001228151610121131, - 0.0060294014401733875, - 0.009754203259944916, - 0.005745361093431711, - -0.0023772239219397306, - 0.02664814703166485, - -0.0033051965292543173, - 0.0022109958808869123, - 0.003171245800331235, - 0.02409178391098976, - -0.016745468601584435, - 0.02391103096306324, - 0.020502546802163124, - -0.01203943695873022, - -0.01030291710048914, - -0.018824126571416855, - 0.006219837814569473, - -0.01620320975780487, - 0.008772972971200943, - -0.004564011935144663, - 0.004709259606897831, - 0.015131602995097637, - 0.03558250889182091, - 0.00420250603929162, - 0.005432271398603916, - -0.014176194556057453, - -0.007094552740454674, - -0.007417325861752033, - 0.018772482872009277, - 0.0015840090345591307, - 0.017158618196845055, - -0.015196157619357109, - 0.0010005966760218143, - -0.0034407612401992083, - -0.022710315883159637, - 0.024840617552399635, - -0.025899313390254974, - -0.025279588997364044, - 0.003889415878802538, - -0.01059986837208271, - 0.0070493645034730434, - 0.009786480106413364, - 0.0005386276170611382, - -0.005629162769764662, - -0.017765432596206665, - -0.006481283809989691, - -0.04260604828596115, - 0.0211868267506361, - -0.015699684619903564, - 0.02015395276248455, - 0.005109498277306557, - 0.010193174704909325, - -0.015325266867876053, - 0.00905055832117796, - -0.017003687098622322, - -0.018630463629961014, - 0.032303132116794586, - -0.036279696971178055, - 0.01810111664235592, - -0.03912010043859482, - 0.025060104206204414, - 0.021741995587944984, - -0.0008488932508043945, - 0.01870792917907238, - -0.006171421613544226, - -0.0001905370008898899, - 0.017726698890328407, - -0.013763044960796833, - 0.0060907285660505295, - -0.0021157776936888695, - 0.030108274891972542, - 0.015712594613432884, - -0.012491319328546524, - 0.026067156344652176, - 0.03757078945636749, - 0.004628566559404135, - -0.027990883216261864, - 0.005409677047282457, - 0.036692846566438675, - 0.027500268071889877, - -0.02289106883108616, - 0.008275902830064297, - 0.013801777735352516, - -0.018036561086773872, - 0.01994737796485424, - 0.003921693190932274, - 0.05012020841240883, - -0.028972113505005836, - -0.011878049932420254, - 0.009670281782746315, - -0.0016542121302336454, - -0.004651160445064306, - -0.09636713564395905, - 0.013298251666128635, - 0.02558945119380951, - -0.008656774647533894, - 0.0031841567251831293, - 0.026880543678998947, - 0.010722522623836994, - 0.014731364324688911, - 0.011167949065566063, - 0.014989582821726799, - 0.00011952691420447081, - -0.015118692070245743, - -0.015351088717579842, - -0.014615166001021862, - -0.004676982294768095, - 0.007178473751991987, - -0.01321433112025261, - -0.0021851740311831236, - -0.034394703805446625, - 0.0041766841895878315, - -0.0012846369063481688, - -0.02619626559317112, - -0.016900399699807167, - -0.011309969238936901, - -0.01496376097202301, - -0.0008892398909665644, - -0.024698598310351372, - 0.011548821814358234, - 0.006468372885137796, - 0.02830074541270733, - -0.0017558856634423137, - -0.025873491540551186, - -0.007081641815602779, - -0.012032981030642986, - -0.026751434430480003, - -0.028145814314484596, - -0.0124590415507555, - 0.007075186353176832, - -0.0004353402182459831, - -0.020670389756560326, - 0.004770586267113686, - -0.014860473573207855, - 0.017829986289143562, - -0.013905065134167671, - 0.024982638657093048, - -0.020954430103302002, - -0.016125744208693504, - 0.018837038427591324, - 0.02428544871509075, - -0.003297127317637205, - -0.01994737796485424, - 0.006875067017972469, - -0.003363295691087842, - -0.0033277906477451324, - 0.030314849689602852, - -0.02930779755115509, - 0.012284744530916214, - 0.007184929214417934, - -0.014731364324688911, - -0.0052805677987635136, - -0.01622903160750866, - 0.027706842869520187, - -0.007468969561159611, - 0.018875770270824432, - -0.0013758203713223338, - 0.0021916294936090708, - -0.005780866369605064, - 0.008889171294867992, - 0.020915696397423744, - -0.022193878889083862, - -0.04263187199831009, - 0.005548469722270966, - -0.019004879519343376, - 0.0062262932769954205, - -0.032561350613832474, - 0.0063715409487485886, - -0.034807853400707245, - 0.009734836407005787, - -0.003019542433321476, - 0.0006003579474054277, - -0.014524789527058601, - -0.011251870542764664, - -0.014331125654280186, - -0.005874470341950655, - 0.0014960533007979393, - 0.043561458587646484, - 0.010348105803132057, - -0.006694314070045948, - -0.0012450972571969032, - -0.03240641951560974, - -0.01913398876786232, - 0.018152760341763496, - 0.0034536721650511026, - 0.0028178091160953045, - -0.00041839462937787175, - 0.014899206347763538, - 0.0057485890574753284, - 0.01018026378005743, - 0.03811304643750191, - -0.012452586553990841, - -0.011600465513765812, - -0.007972495630383492, - -0.06326352804899216, - 0.016977865248918533, - 0.01873375102877617, - -0.010858086869120598, - 0.02577020414173603, - 0.013775955885648727, - 0.027112940326333046, - 0.013479004614055157, - -0.009851034730672836, - -0.0170553307980299, - -0.008250080980360508, - 0.032535530626773834, - -0.0118586840108037, - -0.02180655114352703, - -0.025266679003834724, - 0.008049961179494858, - 0.024195071309804916, - 0.017972007393836975, - 0.011309969238936901, - 0.010832265019416809, - -0.021341757848858833, - 0.021135183051228523, - 0.02948855049908161, - 0.013905065134167671, - -0.023975586518645287, - -0.0034924049396067858, - -0.0065361554734408855, - -0.009063469246029854, - -0.025899313390254974, - 0.005367716774344444, - 0.02161288633942604, - -0.02096734009683132, - -0.0019414802081882954, - 0.04691829904913902, - -0.027371158823370934, - -0.008914993144571781, - 0.010380382649600506, - 0.019017791375517845, - 0.007972495630383492, - -0.020902786403894424, - -0.008166159503161907, - -0.025434520095586777, - -0.0012886716285720468, - -0.022206788882613182, - -0.015234890393912792, - 0.00441230833530426, - -0.009205489419400692, - 0.00014434009790420532, - 0.04059194400906563, - -0.008133882656693459, - 0.025666916742920876, - 0.018372245132923126, - -0.005380627699196339, - -0.004631794057786465, - 0.014214927330613136, - -0.026467394083738327, - 0.02014104090631008, - 0.004031436052173376, - 0.017145708203315735, - -0.008798794820904732, - 0.026092978194355965, - 0.0026644919998943806, - 0.021470867097377777, - 0.0034859494771808386, - 0.009224855341017246, - -0.00832109060138464, - -0.020205596461892128, - -0.01195551548153162, - 0.02597677893936634, - -0.011290603317320347, - -0.008805250748991966, - 0.00395074300467968, - 0.008953725919127464, - 0.007191384676843882, - 0.028145814314484596, - -0.020838230848312378, - 0.006842789705842733, - 0.003640880575403571, - -0.010612779296934605, - 0.03465292230248451, - 0.0011087256716564298, - 0.004305793438106775, - -0.05572354793548584, - 0.0075980788096785545, - 0.017933273687958717, - 0.006468372885137796, - -0.009760658256709576, - 0.0006330387550406158, - 0.004483318421989679, - 0.01786871999502182, - 0.02407887391746044, - -0.011084028519690037, - -0.04472343996167183, - 0.004089535214006901, - -0.008140337653458118, - -0.02079949900507927, - -0.006823423318564892, - -0.015854615718126297, - -0.001550117856822908, - 0.044413577765226364, - 0.019495494663715363, - 0.012730170972645283, - 0.017765432596206665, - -0.019637515768408775, - -0.016267765313386917, - 0.006419957149773836, - -0.013943797908723354, - -0.020437993109226227, - -0.008585765026509762, - 0.004725398030132055, - 0.004215416964143515, - -0.015196157619357109, - -0.0038506831042468548, - 0.012175001204013824, - -0.020231418311595917, - 0.012142724357545376, - -0.030056631192564964, - -0.021909838542342186, - 0.003108304925262928, - 0.02263285033404827, - -0.0094766179099679, - 0.00822425913065672, - 0.013020667247474194, - 0.005596885457634926, - 0.004270288161933422, - 0.006771779619157314, - 0.02207767963409424, - 0.0013701717834919691, - 0.03057306818664074, - 0.005603340920060873, - 0.021664530038833618, - -0.025421610102057457, - -0.0067459577694535255, - -0.017533035948872566, - 0.0064038182608783245, - -0.006187560502439737, - 0.040023863315582275, - 0.004673754330724478, - 0.0036118309944868088, - 0.050404246896505356, - 0.008488932624459267, - -0.031037861481308937, - -0.002519244095310569, - -0.008508299477398396, - 0.015944991260766983, - 0.017804164439439774, - 0.010845175944268703, - -0.02598969079554081, - -0.0043832589872181416, - 0.006277936976402998, - 0.010703155770897865, - 0.023446237668395042, - -0.005651757121086121, - -0.044207002967596054, - 0.011374523863196373, - -0.03535011038184166, - 0.007488335948437452, - -0.0061940159648656845, - -5.169412816030672e-06, - -0.0012289586011320353, - 0.0037635343614965677, - 0.01103238482028246, - 0.002398204058408737, - -0.015105781145393848, - -0.01289801299571991, - -0.015480197966098785, - -0.015944991260766983, - -0.02496972680091858, - -0.018824126571416855, - 0.013672668486833572, - -0.003145423950627446, - -0.04782206192612648, - -0.010154441930353642, - 0.008863349445164204, - -0.003411711659282446, - -0.005028804764151573, - 0.004906150978058577, - 0.005093359388411045, - 0.03612476587295532, - -0.018126938492059708, - 0.017403926700353622, - -0.03473038598895073, - -0.02283942513167858, - -0.0028016704600304365, - -0.004421991761773825, - -0.005022349301725626, - 0.002007648814469576, - -0.03757078945636749 - ], "DOT") LIMIT 3; -/* end::query-vectors-idx-filtered-whole[] */ \ No newline at end of file +/* end::query-vectors-idx-subquery-filtered[] */ \ No newline at end of file diff --git a/modules/vector-index/examples/query-vectors-idx-filtered-whole.sqlpp b/modules/vector-index/examples/query-vectors-idx-filtered-whole.sqlpp new file mode 100644 index 000000000..ef4e2a31d --- /dev/null +++ b/modules/vector-index/examples/query-vectors-idx-filtered-whole.sqlpp @@ -0,0 +1,1544 @@ +SELECT b.color, b.description from `rgb` AS b +WHERE brightness > 190.0 +ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +[ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + /* long list of vector values omitted */ + /* tag::query-vectors-idx-filtered-truncated[] */ + 0.000619320897385478, + 0.006700769532471895, + 0.018410978838801384, + -0.010367471724748611, + -0.019805356860160828, + 0.013059400022029877, + -0.011271236464381218, + -0.011251870542764664, + -0.004915834404528141, + -0.0031744735315442085, + 0.00843728892505169, + -0.01706824265420437, + 0.013362806290388107, + 0.04694411903619766, + 0.011258325539529324, + 0.01298193447291851, + -0.01080644316971302, + -0.01744265854358673, + 0.0044155362993478775, + -0.00742378132417798, + 0.014214927330613136, + -0.01248486340045929, + 0.0009481459856033325, + 0.027293693274259567, + -0.029204510152339935, + 0.006355402525514364, + 0.016254853457212448, + 0.02933361940085888, + -0.017352283000946045, + 0.007236572913825512, + -0.017094064503908157, + 0.002293302910402417, + -0.018139848485589027, + 0.007811109069734812, + 0.015028315596282482, + -0.008785883896052837, + -0.013453182764351368, + -8.422360406257212e-05, + 0.010896819643676281, + 0.002246500924229622, + -0.010586957447230816, + -0.0011482653208076954, + -0.003537593176588416, + 0.02017977461218834, + -0.013491915538907051, + -0.00977356918156147, + 0.01215563528239727, + 0.032122381031513214, + 0.02827492356300354, + 0.002995334332808852, + -0.027396980673074722, + 0.004583378322422504, + 0.0007577098440378904, + 0.00016683334251865745, + 0.025731472298502922, + 0.006158510688692331, + -0.008288813754916191, + 0.00016885067452676594, + 0.01956005021929741, + -0.01309813279658556, + 0.009934956207871437, + -0.007920851930975914, + 0.008721329271793365, + -0.032354775816202164, + -0.0031050771940499544, + -0.0049997554160654545, + 0.029178688302636147, + 0.0075980788096785545, + 0.024995548650622368, + 0.018165670335292816, + -0.008463110774755478, + 0.025292500853538513, + -0.0031518794130533934, + -0.01706824265420437, + -0.00925713311880827, + -0.013375717215240002, + 0.0066749476827681065, + 0.015144513919949532, + -0.0011805426329374313, + -0.037312570959329605, + 0.015092870220541954, + 0.01786871999502182, + 0.015002493746578693, + -0.020631656050682068, + 0.0021415995433926582, + -0.004912606440484524, + -0.004880329128354788, + -0.012523596175014973, + 0.024246715009212494, + 0.02413051761686802, + 0.0008162125013768673, + -0.02077367715537548, + 0.005419360473752022, + 0.008508299477398396, + 0.010470759123563766, + 0.0004575308703351766, + -0.01443441305309534, + -0.00852766539901495, + 0.017326461151242256, + -0.03674449026584625, + -0.009579905308783054, + -0.018643373623490334, + -0.0009473390528000891, + 0.00832109060138464, + -0.0016057961620390415, + 0.023614080622792244, + -0.024272536858916283, + -0.042502760887145996, + 0.03207073733210564, + 0.009534717537462711, + -0.041082561016082764, + -0.010651512071490288, + -0.01997319981455803, + 0.016306497156620026, + 0.015648040920495987, + -0.00894081499427557, + -0.03473038598895073, + -0.00884398352354765, + 0.018010739237070084, + 0.019004879519343376, + -0.015970813110470772, + 0.01914690062403679, + 0.0008166159386746585, + -0.006232748739421368, + -0.033568404614925385, + -0.03416230529546738, + -0.02494390495121479, + 0.02163870818912983, + 0.01701659895479679, + -0.004396169912070036, + 0.003786128479987383, + -0.008372734300792217, + 0.014563522301614285, + -0.01029646210372448, + 0.005622707307338715, + 0.010270640254020691, + 0.0004607586015481502, + 0.032096557319164276, + 0.021096449345350266, + -0.00034355162642896175, + -0.007966040633618832, + -0.004928745329380035, + 0.02806834876537323, + 0.010528858751058578, + 0.013349895365536213, + -0.006629759445786476, + -0.01913398876786232, + 0.02205185778439045, + -0.015480197966098785, + 0.02580893784761429, + 0.013362806290388107, + 0.010244818404316902, + 0.024246715009212494, + -0.0043122489005327225, + 0.0009594430448487401, + -0.02948855049908161, + 0.005044943653047085, + -0.004499457310885191, + -0.010373927652835846, + 0.0007040488417260349, + 0.012032981030642986, + 0.02039925940334797, + 0.02788759581744671, + 0.01807529479265213, + 0.008695507422089577, + 0.0015170335536822677, + 0.02059292420744896, + -0.012291199527680874, + 0.02706129662692547, + -0.009663826785981655, + 0.01101301796734333, + -0.013336984440684319, + 0.025705650448799133, + 0.006765324156731367, + 0.007197840139269829, + 0.024156339466571808, + -0.012975478544831276, + -0.03098621778190136, + -0.004870646167546511, + -0.000659667537547648, + -0.01186513900756836, + -0.007849842309951782, + -0.005797004792839289, + 0.022310076281428337, + -0.02099316194653511, + 0.0013346667401492596, + -0.011600465513765812, + -0.002236817730590701, + 0.020825320854783058, + 0.0010651513002812862, + -0.022826513275504112, + -0.6420344114303589, + 8.150020585162565e-05, + -0.014214927330613136, + -0.015841703861951828, + 0.02079949900507927, + 0.020205596461892128, + 0.037544965744018555, + 0.012265377677977085, + 0.0005870435852557421, + -0.01665509305894375, + 0.005919658578932285, + 0.013349895365536213, + 0.016577627509832382, + -0.01664218120276928, + 0.0006382837891578674, + -0.013969619758427143, + -0.017326461151242256, + -0.00033669269760139287, + -0.013027122244238853, + 0.00042283275979571044, + -0.00431870436295867, + 0.02161288633942604, + -0.007572256959974766, + 0.007262394763529301, + 0.019469672814011574, + 0.01372431218624115, + 0.001147458446212113, + -0.013479004614055157, + 0.014279481954872608, + 0.043587278574705124, + -0.027138762176036835, + 0.015118692070245743, + 8.61400694702752e-05, + 0.00968319270759821, + 0.04738309234380722, + 0.01579006016254425, + -0.026544859632849693, + 0.03506607189774513, + -0.022348809987306595, + 0.05510382354259491, + -0.01931474171578884, + 0.011671475134789944, + 0.02081240899860859, + -0.03098621778190136, + 0.0003318511007819325, + 0.021574154496192932, + 0.024272536858916283, + -0.015854615718126297, + 0.028378210961818695, + -0.015467287041246891, + 0.019689159467816353, + 0.005471004173159599, + 0.014718453399837017, + 0.0048641907051205635, + 0.00894081499427557, + 0.010845175944268703, + 0.030056631192564964, + -0.016538893803954124, + 0.012317021377384663, + 0.009366875514388084, + -0.003025997895747423, + 0.0029791956767439842, + -0.01434403657913208, + -0.019185632467269897, + -0.014976671896874905, + 0.03465292230248451, + -0.013788866810500622, + -0.013091676868498325, + -0.0024353230837732553, + -0.028791360557079315, + -0.005522647872567177, + -0.008630952797830105, + -0.02286524698138237, + 0.009418519213795662, + 0.00011145758617203683, + -0.0103932935744524, + 0.012342843227088451, + 0.017584679648280144, + -0.008288813754916191, + 0.009754203259944916, + 0.0016525982646271586, + -0.00712683005258441, + -0.005467776209115982, + 0.0034956326708197594, + 0.0353759340941906, + 0.013324073515832424, + -0.03535011038184166, + -0.04258022829890251, + 0.01322078611701727, + 0.011193770915269852, + 0.023756099864840508, + 0.030934574082493782, + 0.0018236680189147592, + -0.0009667054400779307, + -0.012588150799274445, + 0.003983020316809416, + -0.02369154617190361, + -0.015234890393912792, + -0.026299552991986275, + -0.007107463665306568, + 0.00779174268245697, + -0.015389821492135525, + -0.012310566380620003, + 0.008262991905212402, + 0.02664814703166485, + -0.0017284499481320381, + -0.0297467689961195, + 0.022607028484344482, + 0.023575346916913986, + -0.017326461151242256, + 0.020115219056606293, + -0.026751434430480003, + 0.0026580365374684334, + 0.003090552520006895, + 0.03596983477473259, + -0.02451784536242485, + 0.02471150830388069, + -0.003347157035022974, + -0.007533524185419083, + -0.02556362934410572, + 0.02933361940085888, + -0.013298251666128635, + -0.014279481954872608, + 0.007507702335715294, + 0.017571767792105675, + 0.00280489819124341, + -0.008424378000199795, + -0.0010514333844184875, + -0.0030469780322164297, + -0.0012862507719546556, + 0.021161004900932312, + -0.0022755505051463842, + -0.0011644039768725634, + 0.0031744735315442085, + -0.00047205566079355776, + -0.014576433226466179, + 0.004460724536329508, + -0.010031787678599358, + 0.008256535977125168, + -0.04513658955693245, + -0.019288919866085052, + -0.013233697041869164, + 0.00965091586112976, + 0.0026709474623203278, + -0.021884016692638397, + -0.03516935929656029, + -0.03281956911087036, + 0.008663230575621128, + -0.038784414529800415, + -0.010322283953428268, + -0.016474340111017227, + -0.013788866810500622, + -0.022568294778466225, + 0.03183833882212639, + 0.025834759697318077, + -0.0028807499911636114, + -0.02100607380270958, + -0.02249082922935486, + -0.01434403657913208, + -0.007365682162344456, + 0.01994737796485424, + 0.02972094714641571, + -0.008837527595460415, + -0.009457251988351345, + -0.013595202937722206, + -0.04121166840195656, + -0.009605727158486843, + 0.013111043721437454, + -0.010877453722059727, + -0.023368772119283676, + 0.012420308776199818, + -0.012820547446608543, + -0.006842789705842733, + 0.012523596175014973, + -0.005935797467827797, + 0.013646846637129784, + -0.006868611555546522, + -0.021264292299747467, + -0.002252956386655569, + -0.007681999821215868, + 0.00020627219055313617, + 0.009089291095733643, + -0.005713083781301975, + -0.005212785676121712, + 0.03496278449892998, + 0.001072413637302816, + 0.022090591490268707, + 0.07266268134117126, + -0.02431127056479454, + 0.032974500209093094, + -0.0030485920142382383, + 0.009289409965276718, + -0.01660344935953617, + 0.001254780450835824, + -0.01340153906494379, + 0.01103238482028246, + 0.010199629701673985, + -0.0026919275987893343, + -0.012142724357545376, + -0.005038488190621138, + 0.031709231436252594, + 0.023562436923384666, + 0.011781218461692333, + -0.003963653929531574, + 0.016164477914571762, + -0.02034761570394039, + 0.016745468601584435, + 0.0006649125716648996, + 0.008069328032433987, + 0.022168057039380074, + -0.0036215141881257296, + -0.03199326992034912, + -0.008366279304027557, + -0.014576433226466179, + 0.006668492220342159, + 0.0007762692985124886, + 0.00029594259103760123, + 0.010864542797207832, + -0.0174555703997612, + 0.013349895365536213, + 0.017984917387366295, + 0.010993652045726776, + 0.01976662501692772, + -0.013956708833575249, + -0.00499007198959589, + 0.007546435110270977, + 0.014498967677354813, + -0.0032164340373128653, + -0.01974080316722393, + -0.03395573049783707, + -0.013853421434760094, + -0.0065393829718232155, + -0.005961619317531586, + 0.0028016704600304365, + -0.005122409202158451, + 0.005061082076281309, + 0.01603536866605282, + -0.024595310911536217, + 0.03449799120426178, + 0.008217803202569485, + 0.01891450397670269, + 0.031683407723903656, + 0.005170824937522411, + 0.006481283809989691, + 0.04433611407876015, + -0.02637701854109764, + 0.0172231737524271, + 0.005474231671541929, + 0.0028710667975246906, + 0.0050417156890034676, + -0.026351196691393852, + -0.007681999821215868, + -0.04808028042316437, + 0.009780025109648705, + 0.011619831435382366, + -0.013982530683279037, + 0.014576433226466179, + -0.0004478476766962558, + 0.020864052698016167, + 0.017545945942401886, + 0.02428544871509075, + -0.019043613225221634, + 0.009986599907279015, + -0.01952131651341915, + 0.00379258394241333, + 0.008004773408174515, + 0.004909378942102194, + 0.003116374369710684, + -0.018785394728183746, + -0.008095149882137775, + 0.008701963350176811, + -0.0237173680216074, + 0.009082835167646408, + -0.02453075535595417, + -0.0049674781039357185, + 0.0127753596752882, + -0.003941059578210115, + -0.018165670335292816, + -0.00499007198959589, + 0.00441230833530426, + -0.010193174704909325, + -0.032328955829143524, + 0.004309020936489105, + 0.0170553307980299, + -0.005080448463559151, + -0.018630463629961014, + -0.00671368045732379, + 0.030237384140491486, + -0.026958009228110313, + 0.0016606675926595926, + 0.024375824257731438, + 0.033800799399614334, + 0.022619938477873802, + -0.0027839180547744036, + -0.0024272536393254995, + -0.02493099495768547, + 0.017829986289143562, + 0.004564011935144663, + 0.010690244846045971, + -0.00247244187630713, + 0.006426412612199783, + -0.006271481513977051, + -0.024220893159508705, + 0.008295268751680851, + 0.02227134443819523, + 0.017300639301538467, + 0.002096411306411028, + -0.00018418239778839052, + 0.00420250603929162, + -0.019430940970778465, + -0.010774166323244572, + -0.011903871782124043, + 0.0039023268036544323, + -0.00925713311880827, + 0.009276499040424824, + 0.015118692070245743, + -0.016383962705731392, + -0.018359335139393806, + 0.042270366102457047, + -0.013582292012870312, + 0.0026806306559592485, + -0.011206681840121746, + -0.014821740798652172, + 0.007075186353176832, + 0.05422588065266609, + -0.006026173941791058, + -0.010412660427391529, + 0.0015331722097471356, + 0.019676247611641884, + 0.012058802880346775, + -0.021303024142980576, + -0.02076076529920101, + 0.00893435999751091, + 0.004357437137514353, + -0.0068105123937129974, + 0.003177701262757182, + -0.014770097099244595, + 0.008469566702842712, + 0.0034052561968564987, + 0.001760727260261774, + -0.0002231169055448845, + -0.02892046980559826, + -0.006868611555546522, + -0.028326567262411118, + -0.014369858428835869, + 0.014395680278539658, + -0.005064310040324926, + 0.015467287041246891, + -0.010787077248096466, + 0.010832265019416809, + 0.038242157548666, + 0.018785394728183746, + 0.006449006497859955, + -0.020463814958930016, + 0.014679720625281334, + 0.0031486516818404198, + -0.007694910746067762, + 0.001307231024838984, + -0.030237384140491486, + -0.003976564854383469, + -0.020902786403894424, + -0.005809915717691183, + -0.01404708530753851, + -0.003650563769042492, + -0.003025997895747423, + 0.015660950914025307, + -0.014176194556057453, + -0.0116262873634696, + 0.01331116259098053, + -0.010535313747823238, + -0.014085818082094193, + 0.003834544448181987, + -0.013956708833575249, + 0.01422783825546503, + 0.007656177971512079, + -0.0012346070725470781, + -0.0008440516539849341, + -0.006145599763840437, + 0.0010465917875990272, + 0.0094766179099679, + -0.023188019171357155, + -0.0028339477721601725, + 0.01321433112025261, + -0.019689159467816353, + -0.0012321863323450089, + -0.022335898131132126, + 0.0003241852391511202, + 0.008256535977125168, + -0.011613376438617706, + -0.04136659950017929, + 0.005361261311918497, + -0.038242157548666, + -0.01059341337531805, + -0.014576433226466179, + -0.005667895544320345, + -0.027319515123963356, + -0.012704349122941494, + 0.01828186959028244, + 0.02349788136780262, + 0.02330421842634678, + 0.007236572913825512, + 0.00861804187297821, + 0.01975371316075325, + 0.01621612161397934, + -0.0014678107108920813, + -0.009424974210560322, + -0.006681403145194054, + -0.018772482872009277, + -0.0005394345498643816, + -0.0009868787601590157, + 0.0320449136197567, + -0.015635129064321518, + -0.01580297201871872, + 0.010122164152562618, + 0.016177387908101082, + -0.013259518891572952, + 0.03413648530840874, + -0.021057717502117157, + -0.00473508145660162, + 0.018152760341763496, + 0.011000107042491436, + 0.015919169411063194, + -0.004273516125977039, + -0.027758486568927765, + 0.008914993144571781, + -0.026983831077814102, + -0.0003104673814959824, + -0.02206476964056492, + 0.012168546207249165, + -0.00358600914478302, + -0.009308775886893272, + 0.0029097995720803738, + -0.018979057669639587, + -0.007385048549622297, + 0.010464304126799107, + -0.005532330833375454, + 0.004405852872878313, + 0.023562436923384666, + -0.006629759445786476, + 0.007101008202880621, + -0.023536615073680878, + 0.030857108533382416, + -0.00613914430141449, + -0.028817182406783104, + 0.012213733978569508, + -0.05587847903370857, + 0.0013596817152574658, + -0.0006209347629919648, + -0.022168057039380074, + 0.0028807499911636114, + 0.006303758826106787, + -0.00539999408647418, + 0.00671368045732379, + -0.0013120726216584444, + 0.002383679384365678, + 0.013149776495993137, + -0.007772376295179129, + -0.022568294778466225, + -0.04898404702544212, + -0.004215416964143515, + 0.011019473895430565, + 0.016345230862498283, + -0.004915834404528141, + -0.020463814958930016, + -0.01891450397670269, + 0.03300032392144203, + -0.015209068544209003, + -0.02121264860033989, + -0.03568579629063606, + -0.030624711886048317, + 0.033129431307315826, + 0.0057485890574753284, + -0.009941411204636097, + 0.02680307812988758, + -0.026364106684923172, + -0.00288559147156775, + -0.013995441608130932, + 0.014369858428835869, + -7.84742078394629e-05, + -0.014447323977947235, + -0.03196744993329048, + -0.017804164439439774, + 0.018385156989097595, + -0.005532330833375454, + 0.01112921629101038, + 0.015480197966098785, + 0.032742105424404144, + 0.011000107042491436, + -0.017197351902723312, + -0.010212540626525879, + -0.015441465191543102, + 0.002488580532371998, + -0.01600954681634903, + 0.012859280221164227, + 0.02429835870862007, + 0.014692631550133228, + 0.00968319270759821, + 0.00819843728095293, + 0.03116697072982788, + 0.022297166287899017, + 0.008689052425324917, + -0.01892741397023201, + -0.008863349445164204, + -0.02413051761686802, + -0.014653898775577545, + 0.005671123508363962, + -0.009625094011425972, + -0.00072664296021685, + 0.02493099495768547, + 0.009786480106413364, + 0.0253828763961792, + 0.017106974497437477, + -0.009689648635685444, + 0.004954567179083824, + 0.029798412695527077, + 0.010244818404316902, + 0.024569489061832428, + -0.005290251225233078, + 0.01206525880843401, + -0.03989475592970848, + -0.032948680222034454, + 0.0032067508436739445, + -0.024827707558870316, + -0.007230117451399565, + 0.0014653898542746902, + 0.009005369618535042, + 0.011961971409618855, + -0.0028016704600304365, + 0.011903871782124043, + 0.022374631837010384, + 0.014279481954872608, + 0.002787145785987377, + 0.008256535977125168, + -0.007920851930975914, + -0.0590287446975708, + -0.008179070428013802, + -0.04596288874745369, + -0.04172810539603233, + 0.0019027474336326122, + 0.006784690544009209, + -0.038552019745111465, + 0.026570681482553482, + 0.010012421756982803, + -0.002772620879113674, + -0.008153248578310013, + -0.0035827814135700464, + 0.00415731780230999, + -0.020334705710411072, + 0.0441037155687809, + -0.004292882513254881, + -0.00043211248703300953, + -0.009115112945437431, + 0.001920499955303967, + -0.016074100509285927, + -0.011755396611988544, + 0.03496278449892998, + 0.019418029114603996, + -0.001509771216660738, + -0.020864052698016167, + 0.022710315883159637, + 0.005758272018283606, + -0.015015404671430588, + -0.009192578494548798, + 0.004983616527169943, + 0.040230438113212585, + 0.0032842163927853107, + -0.039817288517951965, + 0.030185740441083908, + -0.02413051761686802, + 0.03341347351670265, + 0.0032083645928651094, + -0.018036561086773872, + 0.016732558608055115, + -0.02183237299323082, + 0.0003052223182749003, + 0.022723225876688957, + -0.017106974497437477, + 0.022568294778466225, + -0.00087632896611467, + 0.014176194556057453, + -0.01289155799895525, + 0.008753607049584389, + -0.022193878889083862, + -0.004238010849803686, + -0.0060584512539207935, + 0.0023304217029362917, + 0.01770087704062462, + 0.003155107144266367, + 0.011581098660826683, + 0.014628076925873756, + 0.0070170871913433075, + 0.01621612161397934, + 0.011774762533605099, + 0.027810130268335342, + -0.010141531005501747, + 0.014318214729428291, + -0.013737223111093044, + 0.0001642108109081164, + 0.0021545104682445526, + -0.0005850262241438031, + 0.0009626707760617137, + -0.0011571416398510337, + -0.0033891175407916307, + -0.015919169411063194, + 0.03881023824214935, + -0.00852766539901495, + -0.0292819757014513, + 0.01413746178150177, + 0.001689717173576355, + 0.009986599907279015, + -0.030908752232789993, + -0.017326461151242256, + 0.02330421842634678, + 0.0007924079545773566, + -0.03119279257953167, + -0.020257240161299706, + 3.0058245101827197e-05, + 0.018578819930553436, + 0.001744588604196906, + -0.012471952475607395, + -0.005761499982327223, + -0.0022077681496739388, + -0.020915696397423744, + 0.03488531708717346, + -0.007688455283641815, + 0.010548224672675133, + -0.009818757884204388, + 0.012323477305471897, + -0.0036150587256997824, + -0.04596288874745369, + 0.026983831077814102, + -0.01952131651341915, + -0.035453397780656815, + -0.011807040311396122, + 0.01847553253173828, + 0.014240749180316925, + -0.009547628462314606, + -0.0049707056023180485, + 0.0062262932769954205, + 0.006449006497859955, + -0.006158510688692331, + 0.0026919275987893343, + -0.016913311555981636, + 0.012736626900732517, + -0.008146793581545353, + -0.01372431218624115, + 0.015518930740654469, + -0.006048767827451229, + -0.005877698305994272, + -0.031915806233882904, + -0.005909975618124008, + -0.007139740977436304, + -0.031244436278939247, + -0.003595692338421941, + -0.0068105123937129974, + 0.036873601377010345, + -0.007165562827140093, + -0.014150372706353664, + -0.015183246694505215, + 0.0006019718130119145, + -0.01622903160750866, + 0.01874666102230549, + 0.012020070105791092, + -0.01619029976427555, + -0.017403926700353622, + 0.029462728649377823, + 0.022180967032909393, + 0.0210189837962389, + -0.007572256959974766, + -0.01644851826131344, + -0.01825604774057865, + -0.018385156989097595, + -0.01466680970042944, + -0.00905055832117796, + -0.0055839745327830315, + 0.027371158823370934, + 0.02597677893936634, + -0.04059194400906563, + -0.030857108533382416, + 0.023781921714544296, + -0.023420415818691254, + -0.025834759697318077, + 0.016371052712202072, + 0.004722170531749725, + -0.0015210682759061456, + 0.01724899560213089, + -0.004993299953639507, + 0.018991969525814056, + 0.004809319041669369, + -0.01748139224946499, + -0.019237276166677475, + 0.0008916606893762946, + 0.012743081897497177, + -0.030934574082493782, + 0.03842290863394737, + -0.025615273043513298, + -0.03036649338901043, + -0.005680806469172239, + 0.01932765357196331, + -0.0033923452720046043, + 0.0026725612115114927, + 0.004583378322422504, + 0.010361016727983952, + 0.019882822409272194, + -0.004883557092398405, + 0.033129431307315826, + -0.0001690524077275768, + 0.003650563769042492, + 0.009011825546622276, + -0.020063575357198715, + -0.02286524698138237, + -0.02081240899860859, + 0.03661538287997246, + -0.036073122173547745, + 0.013750134035944939, + 0.023162197321653366, + 0.012846369296312332, + -0.026958009228110313, + -0.019392207264900208, + -0.006219837814569473, + 0.006013263016939163, + -0.019043613225221634, + -0.001880153315141797, + 0.003411711659282446, + -0.014305303804576397, + -0.008359823375940323, + -0.011897416785359383, + -0.015867525711655617, + -0.006100411526858807, + -0.025499075651168823, + -0.013995441608130932, + -0.0001231581118190661, + 0.021483777090907097, + -0.0021464412566274405, + -0.0072236619889736176, + -0.016525983810424805, + 0.016061190515756607, + -0.01829477958381176, + -0.018578819930553436, + -0.02680307812988758, + -0.02726787142455578, + -0.01600954681634903, + 0.028972113505005836, + 0.016371052712202072, + -0.014382769353687763, + 0.007843386381864548, + -0.014692631550133228, + -0.007055819965898991, + 0.0005442761466838419, + -0.0042799715884029865, + 0.005874470341950655, + -0.04758966714143753, + 0.010361016727983952, + 0.009818757884204388, + -0.02969512529671192, + -0.003356840228661895, + -0.003760306630283594, + 0.007772376295179129, + 0.01788162998855114, + 0.03176087513566017, + 0.22434021532535553, + 0.022206788882613182, + -0.0009489529184065759, + 0.039171744138002396, + 0.0189532358199358, + 0.022387541830539703, + 0.02620917558670044, + 0.022168057039380074, + -0.0061326888389885426, + 0.026570681482553482, + 0.0018317373469471931, + 0.016990777105093002, + 0.0008521209820173681, + 0.00717201828956604, + 0.008237170055508614, + -0.007778831757605076, + -0.04635021835565567, + -0.00758516788482666, + -0.02014104090631008, + 0.0025369965005666018, + 0.005935797467827797, + -0.024453289806842804, + -0.021767817437648773, + -0.008986003696918488, + 0.0469699427485466, + 0.013530648313462734, + -0.004231555387377739, + 0.011878049932420254, + 0.004512368235737085, + -0.006113322451710701, + -0.002269095042720437, + 0.006681403145194054, + 0.00701063172891736, + -0.0016316180117428303, + -0.02034761570394039, + -0.0013120726216584444, + -0.012181457132101059, + -0.031657587736845016, + 0.02450493350625038, + 0.022916890680789948, + -0.025938047096133232, + 0.006946077104657888, + -0.018436800688505173, + 0.0010780622251331806, + -0.02056710235774517, + 0.01331116259098053, + -0.025912225246429443, + -0.018139848485589027, + 0.030082453042268753, + 0.006636214908212423, + -0.018862860277295113, + -0.0018220541533082724, + 0.032922856509685516, + 0.027164584025740623, + 0.0049674781039357185, + 0.004890012554824352, + 0.013375717215240002, + 0.001705855829641223, + -0.0007004176150076091, + 0.022826513275504112, + -0.016525983810424805, + 0.019172722473740578, + -0.014602255076169968, + 0.027371158823370934, + -0.010109253227710724, + -0.009250677190721035, + -0.027319515123963356, + -0.0037570788990706205, + 0.015699684619903564, + -0.006100411526858807, + -9.284770203521475e-05, + -0.006997720804065466, + 0.0019172722240909934, + 0.02329130657017231, + -0.00461565563455224, + -0.013685579411685467, + 0.005170824937522411, + -0.0017203806200996041, + 0.011639198288321495, + 0.016964955255389214, + -0.008856894448399544, + -0.013788866810500622, + -0.022206788882613182, + 0.013027122244238853, + -0.008327546529471874, + -0.012026526033878326, + 0.00020344792574178427, + 0.00208027265034616, + 0.001817212556488812, + -0.00914738979190588, + 0.002096411306411028, + 0.024801885709166527, + -0.006571660283952951, + -0.006784690544009209, + 0.014279481954872608, + 0.014150372706353664, + 0.0026709474623203278, + 0.008559943176805973, + -0.009076380170881748, + 0.01402126345783472, + -0.0292819757014513, + -0.004083079751580954, + 0.020283062011003494, + 0.012194368056952953, + -0.01624194346368313, + 0.008689052425324917, + -0.011761851608753204, + 0.003563415026292205, + 0.04289009049534798, + -0.0017591133946552873, + -0.009747747331857681, + 0.00556138064712286, + 0.018656285479664803, + -0.014382769353687763, + -0.0028823637403547764, + -0.005170824937522411, + -0.0009061854798346758, + -0.016138656064867973, + 0.003221275517717004, + -0.00014050716708879918, + -0.007094552740454674, + -0.022180967032909393, + -0.03075382113456726, + 0.01372431218624115, + -0.017403926700353622, + -0.007966040633618832, + -0.03653791546821594, + 0.013052944093942642, + 0.020115219056606293, + -0.03119279257953167, + 0.00556138064712286, + -0.0019156583584845066, + 0.02409178391098976, + -0.03305196762084961, + -0.01537691056728363, + 0.016500161960721016, + 0.015854615718126297, + -0.014008352532982826, + 0.014537700451910496, + -0.018036561086773872, + -0.01507995929569006, + -0.03488531708717346, + 0.02494390495121479, + -0.013763044960796833, + 0.005593657959252596, + -0.030289027839899063, + -0.024788973852992058, + 0.003569870488718152, + -0.015893347561359406, + -0.031115327030420303, + 0.007966040633618832, + -0.0341106615960598, + -0.009812301956117153, + -0.014524789527058601, + 0.016461428254842758, + -0.0013120726216584444, + -0.003531137714162469, + 0.004305793438106775, + 0.023988496512174606, + 0.014886295422911644, + -0.023846477270126343, + 0.0060584512539207935, + 0.027319515123963356, + 0.008185526356101036, + -0.01665509305894375, + -0.011871594935655594, + -0.16247107088565826, + 0.04035954922437668, + 0.017003687098622322, + -0.0315801203250885, + 0.0046995761804282665, + 0.011096939444541931, + -0.007197840139269829, + 0.012000704184174538, + -0.010193174704909325, + 0.016099922358989716, + 0.016500161960721016, + 0.004973933566361666, + -0.01971498131752014, + -0.029798412695527077, + -0.01080644316971302, + -0.0011305127991363406, + -0.032509706914424896, + 0.009599272161722183, + 0.03225148841738701, + 0.0255507193505764, + 0.003721573855727911, + -0.015454376116394997, + 0.022929800674319267, + 0.0010328739881515503, + 4.037815870105987e-06, + 0.005090131890028715, + -0.01528653409332037, + -0.004086307715624571, + 0.016964955255389214, + -0.014718453399837017, + -0.011671475134789944, + 0.005903520155698061, + 0.016706736758351326, + 0.01484756264835596, + 0.001228151610121131, + 0.0060294014401733875, + 0.009754203259944916, + 0.005745361093431711, + -0.0023772239219397306, + 0.02664814703166485, + -0.0033051965292543173, + 0.0022109958808869123, + 0.003171245800331235, + 0.02409178391098976, + -0.016745468601584435, + 0.02391103096306324, + 0.020502546802163124, + -0.01203943695873022, + -0.01030291710048914, + -0.018824126571416855, + 0.006219837814569473, + -0.01620320975780487, + 0.008772972971200943, + -0.004564011935144663, + 0.004709259606897831, + 0.015131602995097637, + 0.03558250889182091, + 0.00420250603929162, + 0.005432271398603916, + -0.014176194556057453, + -0.007094552740454674, + -0.007417325861752033, + 0.018772482872009277, + 0.0015840090345591307, + 0.017158618196845055, + -0.015196157619357109, + 0.0010005966760218143, + -0.0034407612401992083, + -0.022710315883159637, + 0.024840617552399635, + -0.025899313390254974, + -0.025279588997364044, + 0.003889415878802538, + -0.01059986837208271, + 0.0070493645034730434, + 0.009786480106413364, + 0.0005386276170611382, + -0.005629162769764662, + -0.017765432596206665, + -0.006481283809989691, + -0.04260604828596115, + 0.0211868267506361, + -0.015699684619903564, + 0.02015395276248455, + 0.005109498277306557, + 0.010193174704909325, + -0.015325266867876053, + 0.00905055832117796, + -0.017003687098622322, + -0.018630463629961014, + 0.032303132116794586, + -0.036279696971178055, + 0.01810111664235592, + -0.03912010043859482, + 0.025060104206204414, + 0.021741995587944984, + -0.0008488932508043945, + 0.01870792917907238, + -0.006171421613544226, + -0.0001905370008898899, + 0.017726698890328407, + -0.013763044960796833, + 0.0060907285660505295, + -0.0021157776936888695, + 0.030108274891972542, + 0.015712594613432884, + -0.012491319328546524, + 0.026067156344652176, + 0.03757078945636749, + 0.004628566559404135, + -0.027990883216261864, + 0.005409677047282457, + 0.036692846566438675, + 0.027500268071889877, + -0.02289106883108616, + 0.008275902830064297, + 0.013801777735352516, + -0.018036561086773872, + 0.01994737796485424, + 0.003921693190932274, + 0.05012020841240883, + -0.028972113505005836, + -0.011878049932420254, + 0.009670281782746315, + -0.0016542121302336454, + -0.004651160445064306, + -0.09636713564395905, + 0.013298251666128635, + 0.02558945119380951, + -0.008656774647533894, + 0.0031841567251831293, + 0.026880543678998947, + 0.010722522623836994, + 0.014731364324688911, + 0.011167949065566063, + 0.014989582821726799, + 0.00011952691420447081, + -0.015118692070245743, + -0.015351088717579842, + -0.014615166001021862, + -0.004676982294768095, + 0.007178473751991987, + -0.01321433112025261, + -0.0021851740311831236, + -0.034394703805446625, + 0.0041766841895878315, + -0.0012846369063481688, + -0.02619626559317112, + -0.016900399699807167, + -0.011309969238936901, + -0.01496376097202301, + -0.0008892398909665644, + -0.024698598310351372, + 0.011548821814358234, + 0.006468372885137796, + 0.02830074541270733, + -0.0017558856634423137, + -0.025873491540551186, + -0.007081641815602779, + -0.012032981030642986, + -0.026751434430480003, + -0.028145814314484596, + -0.0124590415507555, + 0.007075186353176832, + -0.0004353402182459831, + -0.020670389756560326, + 0.004770586267113686, + -0.014860473573207855, + 0.017829986289143562, + -0.013905065134167671, + 0.024982638657093048, + -0.020954430103302002, + -0.016125744208693504, + 0.018837038427591324, + 0.02428544871509075, + -0.003297127317637205, + -0.01994737796485424, + 0.006875067017972469, + -0.003363295691087842, + -0.0033277906477451324, + 0.030314849689602852, + -0.02930779755115509, + 0.012284744530916214, + 0.007184929214417934, + -0.014731364324688911, + -0.0052805677987635136, + -0.01622903160750866, + 0.027706842869520187, + -0.007468969561159611, + 0.018875770270824432, + -0.0013758203713223338, + 0.0021916294936090708, + -0.005780866369605064, + 0.008889171294867992, + 0.020915696397423744, + -0.022193878889083862, + -0.04263187199831009, + 0.005548469722270966, + -0.019004879519343376, + 0.0062262932769954205, + -0.032561350613832474, + 0.0063715409487485886, + -0.034807853400707245, + 0.009734836407005787, + -0.003019542433321476, + 0.0006003579474054277, + -0.014524789527058601, + -0.011251870542764664, + -0.014331125654280186, + -0.005874470341950655, + 0.0014960533007979393, + 0.043561458587646484, + 0.010348105803132057, + -0.006694314070045948, + -0.0012450972571969032, + -0.03240641951560974, + -0.01913398876786232, + 0.018152760341763496, + 0.0034536721650511026, + 0.0028178091160953045, + -0.00041839462937787175, + 0.014899206347763538, + 0.0057485890574753284, + 0.01018026378005743, + 0.03811304643750191, + -0.012452586553990841, + -0.011600465513765812, + -0.007972495630383492, + -0.06326352804899216, + 0.016977865248918533, + 0.01873375102877617, + -0.010858086869120598, + 0.02577020414173603, + 0.013775955885648727, + 0.027112940326333046, + 0.013479004614055157, + -0.009851034730672836, + -0.0170553307980299, + -0.008250080980360508, + 0.032535530626773834, + -0.0118586840108037, + -0.02180655114352703, + -0.025266679003834724, + 0.008049961179494858, + 0.024195071309804916, + 0.017972007393836975, + 0.011309969238936901, + 0.010832265019416809, + -0.021341757848858833, + 0.021135183051228523, + 0.02948855049908161, + 0.013905065134167671, + -0.023975586518645287, + -0.0034924049396067858, + -0.0065361554734408855, + -0.009063469246029854, + -0.025899313390254974, + 0.005367716774344444, + 0.02161288633942604, + -0.02096734009683132, + -0.0019414802081882954, + 0.04691829904913902, + -0.027371158823370934, + -0.008914993144571781, + 0.010380382649600506, + 0.019017791375517845, + 0.007972495630383492, + -0.020902786403894424, + -0.008166159503161907, + -0.025434520095586777, + -0.0012886716285720468, + -0.022206788882613182, + -0.015234890393912792, + 0.00441230833530426, + -0.009205489419400692, + 0.00014434009790420532, + 0.04059194400906563, + -0.008133882656693459, + 0.025666916742920876, + 0.018372245132923126, + -0.005380627699196339, + -0.004631794057786465, + 0.014214927330613136, + -0.026467394083738327, + 0.02014104090631008, + 0.004031436052173376, + 0.017145708203315735, + -0.008798794820904732, + 0.026092978194355965, + 0.0026644919998943806, + 0.021470867097377777, + 0.0034859494771808386, + 0.009224855341017246, + -0.00832109060138464, + -0.020205596461892128, + -0.01195551548153162, + 0.02597677893936634, + -0.011290603317320347, + -0.008805250748991966, + 0.00395074300467968, + 0.008953725919127464, + 0.007191384676843882, + 0.028145814314484596, + -0.020838230848312378, + 0.006842789705842733, + 0.003640880575403571, + -0.010612779296934605, + 0.03465292230248451, + 0.0011087256716564298, + 0.004305793438106775, + -0.05572354793548584, + 0.0075980788096785545, + 0.017933273687958717, + 0.006468372885137796, + -0.009760658256709576, + 0.0006330387550406158, + 0.004483318421989679, + 0.01786871999502182, + 0.02407887391746044, + -0.011084028519690037, + -0.04472343996167183, + 0.004089535214006901, + -0.008140337653458118, + -0.02079949900507927, + -0.006823423318564892, + -0.015854615718126297, + -0.001550117856822908, + 0.044413577765226364, + 0.019495494663715363, + 0.012730170972645283, + 0.017765432596206665, + -0.019637515768408775, + -0.016267765313386917, + 0.006419957149773836, + -0.013943797908723354, + -0.020437993109226227, + -0.008585765026509762, + 0.004725398030132055, + 0.004215416964143515, + -0.015196157619357109, + -0.0038506831042468548, + 0.012175001204013824, + -0.020231418311595917, + 0.012142724357545376, + -0.030056631192564964, + -0.021909838542342186, + 0.003108304925262928, + 0.02263285033404827, + -0.0094766179099679, + 0.00822425913065672, + 0.013020667247474194, + 0.005596885457634926, + 0.004270288161933422, + 0.006771779619157314, + 0.02207767963409424, + 0.0013701717834919691, + 0.03057306818664074, + 0.005603340920060873, + 0.021664530038833618, + -0.025421610102057457, + -0.0067459577694535255, + -0.017533035948872566, + 0.0064038182608783245, + -0.006187560502439737, + 0.040023863315582275, + 0.004673754330724478, + 0.0036118309944868088, + 0.050404246896505356, + 0.008488932624459267, + -0.031037861481308937, + -0.002519244095310569, + -0.008508299477398396, + 0.015944991260766983, + 0.017804164439439774, + 0.010845175944268703, + -0.02598969079554081, + -0.0043832589872181416, + 0.006277936976402998, + 0.010703155770897865, + 0.023446237668395042, + -0.005651757121086121, + -0.044207002967596054, + 0.011374523863196373, + -0.03535011038184166, + 0.007488335948437452, + -0.0061940159648656845, + -5.169412816030672e-06, + -0.0012289586011320353, + 0.0037635343614965677, + 0.01103238482028246, + 0.002398204058408737, + -0.015105781145393848, + -0.01289801299571991, + -0.015480197966098785, + -0.015944991260766983, + -0.02496972680091858, + -0.018824126571416855, + 0.013672668486833572, + -0.003145423950627446, + -0.04782206192612648, + -0.010154441930353642, + 0.008863349445164204, + -0.003411711659282446, + -0.005028804764151573, + 0.004906150978058577, + 0.005093359388411045, + 0.03612476587295532, + -0.018126938492059708, + 0.017403926700353622, + -0.03473038598895073, + -0.02283942513167858, + -0.0028016704600304365, + -0.004421991761773825, + /* end::query-vectors-idx-filtered-truncated[] */ + -0.005022349301725626, + 0.002007648814469576, + -0.03757078945636749 + ], "DOT") LIMIT 3; \ No newline at end of file diff --git a/modules/vector-index/examples/query-vectors-idx-whole.sqlpp b/modules/vector-index/examples/query-vectors-idx-whole.sqlpp new file mode 100644 index 000000000..f3edff66f --- /dev/null +++ b/modules/vector-index/examples/query-vectors-idx-whole.sqlpp @@ -0,0 +1,1543 @@ +SELECT b.color, b.description from `rgb` AS b +order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, +[ + 0.005115953739732504, + 0.004331615287810564, + 0.014279481954872608, + /* long list of vector values omitted */ + /* tag::query-vectors-idx-truncated[] */ + 0.000619320897385478, + 0.006700769532471895, + 0.018410978838801384, + -0.010367471724748611, + -0.019805356860160828, + 0.013059400022029877, + -0.011271236464381218, + -0.011251870542764664, + -0.004915834404528141, + -0.0031744735315442085, + 0.00843728892505169, + -0.01706824265420437, + 0.013362806290388107, + 0.04694411903619766, + 0.011258325539529324, + 0.01298193447291851, + -0.01080644316971302, + -0.01744265854358673, + 0.0044155362993478775, + -0.00742378132417798, + 0.014214927330613136, + -0.01248486340045929, + 0.0009481459856033325, + 0.027293693274259567, + -0.029204510152339935, + 0.006355402525514364, + 0.016254853457212448, + 0.02933361940085888, + -0.017352283000946045, + 0.007236572913825512, + -0.017094064503908157, + 0.002293302910402417, + -0.018139848485589027, + 0.007811109069734812, + 0.015028315596282482, + -0.008785883896052837, + -0.013453182764351368, + -8.422360406257212e-05, + 0.010896819643676281, + 0.002246500924229622, + -0.010586957447230816, + -0.0011482653208076954, + -0.003537593176588416, + 0.02017977461218834, + -0.013491915538907051, + -0.00977356918156147, + 0.01215563528239727, + 0.032122381031513214, + 0.02827492356300354, + 0.002995334332808852, + -0.027396980673074722, + 0.004583378322422504, + 0.0007577098440378904, + 0.00016683334251865745, + 0.025731472298502922, + 0.006158510688692331, + -0.008288813754916191, + 0.00016885067452676594, + 0.01956005021929741, + -0.01309813279658556, + 0.009934956207871437, + -0.007920851930975914, + 0.008721329271793365, + -0.032354775816202164, + -0.0031050771940499544, + -0.0049997554160654545, + 0.029178688302636147, + 0.0075980788096785545, + 0.024995548650622368, + 0.018165670335292816, + -0.008463110774755478, + 0.025292500853538513, + -0.0031518794130533934, + -0.01706824265420437, + -0.00925713311880827, + -0.013375717215240002, + 0.0066749476827681065, + 0.015144513919949532, + -0.0011805426329374313, + -0.037312570959329605, + 0.015092870220541954, + 0.01786871999502182, + 0.015002493746578693, + -0.020631656050682068, + 0.0021415995433926582, + -0.004912606440484524, + -0.004880329128354788, + -0.012523596175014973, + 0.024246715009212494, + 0.02413051761686802, + 0.0008162125013768673, + -0.02077367715537548, + 0.005419360473752022, + 0.008508299477398396, + 0.010470759123563766, + 0.0004575308703351766, + -0.01443441305309534, + -0.00852766539901495, + 0.017326461151242256, + -0.03674449026584625, + -0.009579905308783054, + -0.018643373623490334, + -0.0009473390528000891, + 0.00832109060138464, + -0.0016057961620390415, + 0.023614080622792244, + -0.024272536858916283, + -0.042502760887145996, + 0.03207073733210564, + 0.009534717537462711, + -0.041082561016082764, + -0.010651512071490288, + -0.01997319981455803, + 0.016306497156620026, + 0.015648040920495987, + -0.00894081499427557, + -0.03473038598895073, + -0.00884398352354765, + 0.018010739237070084, + 0.019004879519343376, + -0.015970813110470772, + 0.01914690062403679, + 0.0008166159386746585, + -0.006232748739421368, + -0.033568404614925385, + -0.03416230529546738, + -0.02494390495121479, + 0.02163870818912983, + 0.01701659895479679, + -0.004396169912070036, + 0.003786128479987383, + -0.008372734300792217, + 0.014563522301614285, + -0.01029646210372448, + 0.005622707307338715, + 0.010270640254020691, + 0.0004607586015481502, + 0.032096557319164276, + 0.021096449345350266, + -0.00034355162642896175, + -0.007966040633618832, + -0.004928745329380035, + 0.02806834876537323, + 0.010528858751058578, + 0.013349895365536213, + -0.006629759445786476, + -0.01913398876786232, + 0.02205185778439045, + -0.015480197966098785, + 0.02580893784761429, + 0.013362806290388107, + 0.010244818404316902, + 0.024246715009212494, + -0.0043122489005327225, + 0.0009594430448487401, + -0.02948855049908161, + 0.005044943653047085, + -0.004499457310885191, + -0.010373927652835846, + 0.0007040488417260349, + 0.012032981030642986, + 0.02039925940334797, + 0.02788759581744671, + 0.01807529479265213, + 0.008695507422089577, + 0.0015170335536822677, + 0.02059292420744896, + -0.012291199527680874, + 0.02706129662692547, + -0.009663826785981655, + 0.01101301796734333, + -0.013336984440684319, + 0.025705650448799133, + 0.006765324156731367, + 0.007197840139269829, + 0.024156339466571808, + -0.012975478544831276, + -0.03098621778190136, + -0.004870646167546511, + -0.000659667537547648, + -0.01186513900756836, + -0.007849842309951782, + -0.005797004792839289, + 0.022310076281428337, + -0.02099316194653511, + 0.0013346667401492596, + -0.011600465513765812, + -0.002236817730590701, + 0.020825320854783058, + 0.0010651513002812862, + -0.022826513275504112, + -0.6420344114303589, + 8.150020585162565e-05, + -0.014214927330613136, + -0.015841703861951828, + 0.02079949900507927, + 0.020205596461892128, + 0.037544965744018555, + 0.012265377677977085, + 0.0005870435852557421, + -0.01665509305894375, + 0.005919658578932285, + 0.013349895365536213, + 0.016577627509832382, + -0.01664218120276928, + 0.0006382837891578674, + -0.013969619758427143, + -0.017326461151242256, + -0.00033669269760139287, + -0.013027122244238853, + 0.00042283275979571044, + -0.00431870436295867, + 0.02161288633942604, + -0.007572256959974766, + 0.007262394763529301, + 0.019469672814011574, + 0.01372431218624115, + 0.001147458446212113, + -0.013479004614055157, + 0.014279481954872608, + 0.043587278574705124, + -0.027138762176036835, + 0.015118692070245743, + 8.61400694702752e-05, + 0.00968319270759821, + 0.04738309234380722, + 0.01579006016254425, + -0.026544859632849693, + 0.03506607189774513, + -0.022348809987306595, + 0.05510382354259491, + -0.01931474171578884, + 0.011671475134789944, + 0.02081240899860859, + -0.03098621778190136, + 0.0003318511007819325, + 0.021574154496192932, + 0.024272536858916283, + -0.015854615718126297, + 0.028378210961818695, + -0.015467287041246891, + 0.019689159467816353, + 0.005471004173159599, + 0.014718453399837017, + 0.0048641907051205635, + 0.00894081499427557, + 0.010845175944268703, + 0.030056631192564964, + -0.016538893803954124, + 0.012317021377384663, + 0.009366875514388084, + -0.003025997895747423, + 0.0029791956767439842, + -0.01434403657913208, + -0.019185632467269897, + -0.014976671896874905, + 0.03465292230248451, + -0.013788866810500622, + -0.013091676868498325, + -0.0024353230837732553, + -0.028791360557079315, + -0.005522647872567177, + -0.008630952797830105, + -0.02286524698138237, + 0.009418519213795662, + 0.00011145758617203683, + -0.0103932935744524, + 0.012342843227088451, + 0.017584679648280144, + -0.008288813754916191, + 0.009754203259944916, + 0.0016525982646271586, + -0.00712683005258441, + -0.005467776209115982, + 0.0034956326708197594, + 0.0353759340941906, + 0.013324073515832424, + -0.03535011038184166, + -0.04258022829890251, + 0.01322078611701727, + 0.011193770915269852, + 0.023756099864840508, + 0.030934574082493782, + 0.0018236680189147592, + -0.0009667054400779307, + -0.012588150799274445, + 0.003983020316809416, + -0.02369154617190361, + -0.015234890393912792, + -0.026299552991986275, + -0.007107463665306568, + 0.00779174268245697, + -0.015389821492135525, + -0.012310566380620003, + 0.008262991905212402, + 0.02664814703166485, + -0.0017284499481320381, + -0.0297467689961195, + 0.022607028484344482, + 0.023575346916913986, + -0.017326461151242256, + 0.020115219056606293, + -0.026751434430480003, + 0.0026580365374684334, + 0.003090552520006895, + 0.03596983477473259, + -0.02451784536242485, + 0.02471150830388069, + -0.003347157035022974, + -0.007533524185419083, + -0.02556362934410572, + 0.02933361940085888, + -0.013298251666128635, + -0.014279481954872608, + 0.007507702335715294, + 0.017571767792105675, + 0.00280489819124341, + -0.008424378000199795, + -0.0010514333844184875, + -0.0030469780322164297, + -0.0012862507719546556, + 0.021161004900932312, + -0.0022755505051463842, + -0.0011644039768725634, + 0.0031744735315442085, + -0.00047205566079355776, + -0.014576433226466179, + 0.004460724536329508, + -0.010031787678599358, + 0.008256535977125168, + -0.04513658955693245, + -0.019288919866085052, + -0.013233697041869164, + 0.00965091586112976, + 0.0026709474623203278, + -0.021884016692638397, + -0.03516935929656029, + -0.03281956911087036, + 0.008663230575621128, + -0.038784414529800415, + -0.010322283953428268, + -0.016474340111017227, + -0.013788866810500622, + -0.022568294778466225, + 0.03183833882212639, + 0.025834759697318077, + -0.0028807499911636114, + -0.02100607380270958, + -0.02249082922935486, + -0.01434403657913208, + -0.007365682162344456, + 0.01994737796485424, + 0.02972094714641571, + -0.008837527595460415, + -0.009457251988351345, + -0.013595202937722206, + -0.04121166840195656, + -0.009605727158486843, + 0.013111043721437454, + -0.010877453722059727, + -0.023368772119283676, + 0.012420308776199818, + -0.012820547446608543, + -0.006842789705842733, + 0.012523596175014973, + -0.005935797467827797, + 0.013646846637129784, + -0.006868611555546522, + -0.021264292299747467, + -0.002252956386655569, + -0.007681999821215868, + 0.00020627219055313617, + 0.009089291095733643, + -0.005713083781301975, + -0.005212785676121712, + 0.03496278449892998, + 0.001072413637302816, + 0.022090591490268707, + 0.07266268134117126, + -0.02431127056479454, + 0.032974500209093094, + -0.0030485920142382383, + 0.009289409965276718, + -0.01660344935953617, + 0.001254780450835824, + -0.01340153906494379, + 0.01103238482028246, + 0.010199629701673985, + -0.0026919275987893343, + -0.012142724357545376, + -0.005038488190621138, + 0.031709231436252594, + 0.023562436923384666, + 0.011781218461692333, + -0.003963653929531574, + 0.016164477914571762, + -0.02034761570394039, + 0.016745468601584435, + 0.0006649125716648996, + 0.008069328032433987, + 0.022168057039380074, + -0.0036215141881257296, + -0.03199326992034912, + -0.008366279304027557, + -0.014576433226466179, + 0.006668492220342159, + 0.0007762692985124886, + 0.00029594259103760123, + 0.010864542797207832, + -0.0174555703997612, + 0.013349895365536213, + 0.017984917387366295, + 0.010993652045726776, + 0.01976662501692772, + -0.013956708833575249, + -0.00499007198959589, + 0.007546435110270977, + 0.014498967677354813, + -0.0032164340373128653, + -0.01974080316722393, + -0.03395573049783707, + -0.013853421434760094, + -0.0065393829718232155, + -0.005961619317531586, + 0.0028016704600304365, + -0.005122409202158451, + 0.005061082076281309, + 0.01603536866605282, + -0.024595310911536217, + 0.03449799120426178, + 0.008217803202569485, + 0.01891450397670269, + 0.031683407723903656, + 0.005170824937522411, + 0.006481283809989691, + 0.04433611407876015, + -0.02637701854109764, + 0.0172231737524271, + 0.005474231671541929, + 0.0028710667975246906, + 0.0050417156890034676, + -0.026351196691393852, + -0.007681999821215868, + -0.04808028042316437, + 0.009780025109648705, + 0.011619831435382366, + -0.013982530683279037, + 0.014576433226466179, + -0.0004478476766962558, + 0.020864052698016167, + 0.017545945942401886, + 0.02428544871509075, + -0.019043613225221634, + 0.009986599907279015, + -0.01952131651341915, + 0.00379258394241333, + 0.008004773408174515, + 0.004909378942102194, + 0.003116374369710684, + -0.018785394728183746, + -0.008095149882137775, + 0.008701963350176811, + -0.0237173680216074, + 0.009082835167646408, + -0.02453075535595417, + -0.0049674781039357185, + 0.0127753596752882, + -0.003941059578210115, + -0.018165670335292816, + -0.00499007198959589, + 0.00441230833530426, + -0.010193174704909325, + -0.032328955829143524, + 0.004309020936489105, + 0.0170553307980299, + -0.005080448463559151, + -0.018630463629961014, + -0.00671368045732379, + 0.030237384140491486, + -0.026958009228110313, + 0.0016606675926595926, + 0.024375824257731438, + 0.033800799399614334, + 0.022619938477873802, + -0.0027839180547744036, + -0.0024272536393254995, + -0.02493099495768547, + 0.017829986289143562, + 0.004564011935144663, + 0.010690244846045971, + -0.00247244187630713, + 0.006426412612199783, + -0.006271481513977051, + -0.024220893159508705, + 0.008295268751680851, + 0.02227134443819523, + 0.017300639301538467, + 0.002096411306411028, + -0.00018418239778839052, + 0.00420250603929162, + -0.019430940970778465, + -0.010774166323244572, + -0.011903871782124043, + 0.0039023268036544323, + -0.00925713311880827, + 0.009276499040424824, + 0.015118692070245743, + -0.016383962705731392, + -0.018359335139393806, + 0.042270366102457047, + -0.013582292012870312, + 0.0026806306559592485, + -0.011206681840121746, + -0.014821740798652172, + 0.007075186353176832, + 0.05422588065266609, + -0.006026173941791058, + -0.010412660427391529, + 0.0015331722097471356, + 0.019676247611641884, + 0.012058802880346775, + -0.021303024142980576, + -0.02076076529920101, + 0.00893435999751091, + 0.004357437137514353, + -0.0068105123937129974, + 0.003177701262757182, + -0.014770097099244595, + 0.008469566702842712, + 0.0034052561968564987, + 0.001760727260261774, + -0.0002231169055448845, + -0.02892046980559826, + -0.006868611555546522, + -0.028326567262411118, + -0.014369858428835869, + 0.014395680278539658, + -0.005064310040324926, + 0.015467287041246891, + -0.010787077248096466, + 0.010832265019416809, + 0.038242157548666, + 0.018785394728183746, + 0.006449006497859955, + -0.020463814958930016, + 0.014679720625281334, + 0.0031486516818404198, + -0.007694910746067762, + 0.001307231024838984, + -0.030237384140491486, + -0.003976564854383469, + -0.020902786403894424, + -0.005809915717691183, + -0.01404708530753851, + -0.003650563769042492, + -0.003025997895747423, + 0.015660950914025307, + -0.014176194556057453, + -0.0116262873634696, + 0.01331116259098053, + -0.010535313747823238, + -0.014085818082094193, + 0.003834544448181987, + -0.013956708833575249, + 0.01422783825546503, + 0.007656177971512079, + -0.0012346070725470781, + -0.0008440516539849341, + -0.006145599763840437, + 0.0010465917875990272, + 0.0094766179099679, + -0.023188019171357155, + -0.0028339477721601725, + 0.01321433112025261, + -0.019689159467816353, + -0.0012321863323450089, + -0.022335898131132126, + 0.0003241852391511202, + 0.008256535977125168, + -0.011613376438617706, + -0.04136659950017929, + 0.005361261311918497, + -0.038242157548666, + -0.01059341337531805, + -0.014576433226466179, + -0.005667895544320345, + -0.027319515123963356, + -0.012704349122941494, + 0.01828186959028244, + 0.02349788136780262, + 0.02330421842634678, + 0.007236572913825512, + 0.00861804187297821, + 0.01975371316075325, + 0.01621612161397934, + -0.0014678107108920813, + -0.009424974210560322, + -0.006681403145194054, + -0.018772482872009277, + -0.0005394345498643816, + -0.0009868787601590157, + 0.0320449136197567, + -0.015635129064321518, + -0.01580297201871872, + 0.010122164152562618, + 0.016177387908101082, + -0.013259518891572952, + 0.03413648530840874, + -0.021057717502117157, + -0.00473508145660162, + 0.018152760341763496, + 0.011000107042491436, + 0.015919169411063194, + -0.004273516125977039, + -0.027758486568927765, + 0.008914993144571781, + -0.026983831077814102, + -0.0003104673814959824, + -0.02206476964056492, + 0.012168546207249165, + -0.00358600914478302, + -0.009308775886893272, + 0.0029097995720803738, + -0.018979057669639587, + -0.007385048549622297, + 0.010464304126799107, + -0.005532330833375454, + 0.004405852872878313, + 0.023562436923384666, + -0.006629759445786476, + 0.007101008202880621, + -0.023536615073680878, + 0.030857108533382416, + -0.00613914430141449, + -0.028817182406783104, + 0.012213733978569508, + -0.05587847903370857, + 0.0013596817152574658, + -0.0006209347629919648, + -0.022168057039380074, + 0.0028807499911636114, + 0.006303758826106787, + -0.00539999408647418, + 0.00671368045732379, + -0.0013120726216584444, + 0.002383679384365678, + 0.013149776495993137, + -0.007772376295179129, + -0.022568294778466225, + -0.04898404702544212, + -0.004215416964143515, + 0.011019473895430565, + 0.016345230862498283, + -0.004915834404528141, + -0.020463814958930016, + -0.01891450397670269, + 0.03300032392144203, + -0.015209068544209003, + -0.02121264860033989, + -0.03568579629063606, + -0.030624711886048317, + 0.033129431307315826, + 0.0057485890574753284, + -0.009941411204636097, + 0.02680307812988758, + -0.026364106684923172, + -0.00288559147156775, + -0.013995441608130932, + 0.014369858428835869, + -7.84742078394629e-05, + -0.014447323977947235, + -0.03196744993329048, + -0.017804164439439774, + 0.018385156989097595, + -0.005532330833375454, + 0.01112921629101038, + 0.015480197966098785, + 0.032742105424404144, + 0.011000107042491436, + -0.017197351902723312, + -0.010212540626525879, + -0.015441465191543102, + 0.002488580532371998, + -0.01600954681634903, + 0.012859280221164227, + 0.02429835870862007, + 0.014692631550133228, + 0.00968319270759821, + 0.00819843728095293, + 0.03116697072982788, + 0.022297166287899017, + 0.008689052425324917, + -0.01892741397023201, + -0.008863349445164204, + -0.02413051761686802, + -0.014653898775577545, + 0.005671123508363962, + -0.009625094011425972, + -0.00072664296021685, + 0.02493099495768547, + 0.009786480106413364, + 0.0253828763961792, + 0.017106974497437477, + -0.009689648635685444, + 0.004954567179083824, + 0.029798412695527077, + 0.010244818404316902, + 0.024569489061832428, + -0.005290251225233078, + 0.01206525880843401, + -0.03989475592970848, + -0.032948680222034454, + 0.0032067508436739445, + -0.024827707558870316, + -0.007230117451399565, + 0.0014653898542746902, + 0.009005369618535042, + 0.011961971409618855, + -0.0028016704600304365, + 0.011903871782124043, + 0.022374631837010384, + 0.014279481954872608, + 0.002787145785987377, + 0.008256535977125168, + -0.007920851930975914, + -0.0590287446975708, + -0.008179070428013802, + -0.04596288874745369, + -0.04172810539603233, + 0.0019027474336326122, + 0.006784690544009209, + -0.038552019745111465, + 0.026570681482553482, + 0.010012421756982803, + -0.002772620879113674, + -0.008153248578310013, + -0.0035827814135700464, + 0.00415731780230999, + -0.020334705710411072, + 0.0441037155687809, + -0.004292882513254881, + -0.00043211248703300953, + -0.009115112945437431, + 0.001920499955303967, + -0.016074100509285927, + -0.011755396611988544, + 0.03496278449892998, + 0.019418029114603996, + -0.001509771216660738, + -0.020864052698016167, + 0.022710315883159637, + 0.005758272018283606, + -0.015015404671430588, + -0.009192578494548798, + 0.004983616527169943, + 0.040230438113212585, + 0.0032842163927853107, + -0.039817288517951965, + 0.030185740441083908, + -0.02413051761686802, + 0.03341347351670265, + 0.0032083645928651094, + -0.018036561086773872, + 0.016732558608055115, + -0.02183237299323082, + 0.0003052223182749003, + 0.022723225876688957, + -0.017106974497437477, + 0.022568294778466225, + -0.00087632896611467, + 0.014176194556057453, + -0.01289155799895525, + 0.008753607049584389, + -0.022193878889083862, + -0.004238010849803686, + -0.0060584512539207935, + 0.0023304217029362917, + 0.01770087704062462, + 0.003155107144266367, + 0.011581098660826683, + 0.014628076925873756, + 0.0070170871913433075, + 0.01621612161397934, + 0.011774762533605099, + 0.027810130268335342, + -0.010141531005501747, + 0.014318214729428291, + -0.013737223111093044, + 0.0001642108109081164, + 0.0021545104682445526, + -0.0005850262241438031, + 0.0009626707760617137, + -0.0011571416398510337, + -0.0033891175407916307, + -0.015919169411063194, + 0.03881023824214935, + -0.00852766539901495, + -0.0292819757014513, + 0.01413746178150177, + 0.001689717173576355, + 0.009986599907279015, + -0.030908752232789993, + -0.017326461151242256, + 0.02330421842634678, + 0.0007924079545773566, + -0.03119279257953167, + -0.020257240161299706, + 3.0058245101827197e-05, + 0.018578819930553436, + 0.001744588604196906, + -0.012471952475607395, + -0.005761499982327223, + -0.0022077681496739388, + -0.020915696397423744, + 0.03488531708717346, + -0.007688455283641815, + 0.010548224672675133, + -0.009818757884204388, + 0.012323477305471897, + -0.0036150587256997824, + -0.04596288874745369, + 0.026983831077814102, + -0.01952131651341915, + -0.035453397780656815, + -0.011807040311396122, + 0.01847553253173828, + 0.014240749180316925, + -0.009547628462314606, + -0.0049707056023180485, + 0.0062262932769954205, + 0.006449006497859955, + -0.006158510688692331, + 0.0026919275987893343, + -0.016913311555981636, + 0.012736626900732517, + -0.008146793581545353, + -0.01372431218624115, + 0.015518930740654469, + -0.006048767827451229, + -0.005877698305994272, + -0.031915806233882904, + -0.005909975618124008, + -0.007139740977436304, + -0.031244436278939247, + -0.003595692338421941, + -0.0068105123937129974, + 0.036873601377010345, + -0.007165562827140093, + -0.014150372706353664, + -0.015183246694505215, + 0.0006019718130119145, + -0.01622903160750866, + 0.01874666102230549, + 0.012020070105791092, + -0.01619029976427555, + -0.017403926700353622, + 0.029462728649377823, + 0.022180967032909393, + 0.0210189837962389, + -0.007572256959974766, + -0.01644851826131344, + -0.01825604774057865, + -0.018385156989097595, + -0.01466680970042944, + -0.00905055832117796, + -0.0055839745327830315, + 0.027371158823370934, + 0.02597677893936634, + -0.04059194400906563, + -0.030857108533382416, + 0.023781921714544296, + -0.023420415818691254, + -0.025834759697318077, + 0.016371052712202072, + 0.004722170531749725, + -0.0015210682759061456, + 0.01724899560213089, + -0.004993299953639507, + 0.018991969525814056, + 0.004809319041669369, + -0.01748139224946499, + -0.019237276166677475, + 0.0008916606893762946, + 0.012743081897497177, + -0.030934574082493782, + 0.03842290863394737, + -0.025615273043513298, + -0.03036649338901043, + -0.005680806469172239, + 0.01932765357196331, + -0.0033923452720046043, + 0.0026725612115114927, + 0.004583378322422504, + 0.010361016727983952, + 0.019882822409272194, + -0.004883557092398405, + 0.033129431307315826, + -0.0001690524077275768, + 0.003650563769042492, + 0.009011825546622276, + -0.020063575357198715, + -0.02286524698138237, + -0.02081240899860859, + 0.03661538287997246, + -0.036073122173547745, + 0.013750134035944939, + 0.023162197321653366, + 0.012846369296312332, + -0.026958009228110313, + -0.019392207264900208, + -0.006219837814569473, + 0.006013263016939163, + -0.019043613225221634, + -0.001880153315141797, + 0.003411711659282446, + -0.014305303804576397, + -0.008359823375940323, + -0.011897416785359383, + -0.015867525711655617, + -0.006100411526858807, + -0.025499075651168823, + -0.013995441608130932, + -0.0001231581118190661, + 0.021483777090907097, + -0.0021464412566274405, + -0.0072236619889736176, + -0.016525983810424805, + 0.016061190515756607, + -0.01829477958381176, + -0.018578819930553436, + -0.02680307812988758, + -0.02726787142455578, + -0.01600954681634903, + 0.028972113505005836, + 0.016371052712202072, + -0.014382769353687763, + 0.007843386381864548, + -0.014692631550133228, + -0.007055819965898991, + 0.0005442761466838419, + -0.0042799715884029865, + 0.005874470341950655, + -0.04758966714143753, + 0.010361016727983952, + 0.009818757884204388, + -0.02969512529671192, + -0.003356840228661895, + -0.003760306630283594, + 0.007772376295179129, + 0.01788162998855114, + 0.03176087513566017, + 0.22434021532535553, + 0.022206788882613182, + -0.0009489529184065759, + 0.039171744138002396, + 0.0189532358199358, + 0.022387541830539703, + 0.02620917558670044, + 0.022168057039380074, + -0.0061326888389885426, + 0.026570681482553482, + 0.0018317373469471931, + 0.016990777105093002, + 0.0008521209820173681, + 0.00717201828956604, + 0.008237170055508614, + -0.007778831757605076, + -0.04635021835565567, + -0.00758516788482666, + -0.02014104090631008, + 0.0025369965005666018, + 0.005935797467827797, + -0.024453289806842804, + -0.021767817437648773, + -0.008986003696918488, + 0.0469699427485466, + 0.013530648313462734, + -0.004231555387377739, + 0.011878049932420254, + 0.004512368235737085, + -0.006113322451710701, + -0.002269095042720437, + 0.006681403145194054, + 0.00701063172891736, + -0.0016316180117428303, + -0.02034761570394039, + -0.0013120726216584444, + -0.012181457132101059, + -0.031657587736845016, + 0.02450493350625038, + 0.022916890680789948, + -0.025938047096133232, + 0.006946077104657888, + -0.018436800688505173, + 0.0010780622251331806, + -0.02056710235774517, + 0.01331116259098053, + -0.025912225246429443, + -0.018139848485589027, + 0.030082453042268753, + 0.006636214908212423, + -0.018862860277295113, + -0.0018220541533082724, + 0.032922856509685516, + 0.027164584025740623, + 0.0049674781039357185, + 0.004890012554824352, + 0.013375717215240002, + 0.001705855829641223, + -0.0007004176150076091, + 0.022826513275504112, + -0.016525983810424805, + 0.019172722473740578, + -0.014602255076169968, + 0.027371158823370934, + -0.010109253227710724, + -0.009250677190721035, + -0.027319515123963356, + -0.0037570788990706205, + 0.015699684619903564, + -0.006100411526858807, + -9.284770203521475e-05, + -0.006997720804065466, + 0.0019172722240909934, + 0.02329130657017231, + -0.00461565563455224, + -0.013685579411685467, + 0.005170824937522411, + -0.0017203806200996041, + 0.011639198288321495, + 0.016964955255389214, + -0.008856894448399544, + -0.013788866810500622, + -0.022206788882613182, + 0.013027122244238853, + -0.008327546529471874, + -0.012026526033878326, + 0.00020344792574178427, + 0.00208027265034616, + 0.001817212556488812, + -0.00914738979190588, + 0.002096411306411028, + 0.024801885709166527, + -0.006571660283952951, + -0.006784690544009209, + 0.014279481954872608, + 0.014150372706353664, + 0.0026709474623203278, + 0.008559943176805973, + -0.009076380170881748, + 0.01402126345783472, + -0.0292819757014513, + -0.004083079751580954, + 0.020283062011003494, + 0.012194368056952953, + -0.01624194346368313, + 0.008689052425324917, + -0.011761851608753204, + 0.003563415026292205, + 0.04289009049534798, + -0.0017591133946552873, + -0.009747747331857681, + 0.00556138064712286, + 0.018656285479664803, + -0.014382769353687763, + -0.0028823637403547764, + -0.005170824937522411, + -0.0009061854798346758, + -0.016138656064867973, + 0.003221275517717004, + -0.00014050716708879918, + -0.007094552740454674, + -0.022180967032909393, + -0.03075382113456726, + 0.01372431218624115, + -0.017403926700353622, + -0.007966040633618832, + -0.03653791546821594, + 0.013052944093942642, + 0.020115219056606293, + -0.03119279257953167, + 0.00556138064712286, + -0.0019156583584845066, + 0.02409178391098976, + -0.03305196762084961, + -0.01537691056728363, + 0.016500161960721016, + 0.015854615718126297, + -0.014008352532982826, + 0.014537700451910496, + -0.018036561086773872, + -0.01507995929569006, + -0.03488531708717346, + 0.02494390495121479, + -0.013763044960796833, + 0.005593657959252596, + -0.030289027839899063, + -0.024788973852992058, + 0.003569870488718152, + -0.015893347561359406, + -0.031115327030420303, + 0.007966040633618832, + -0.0341106615960598, + -0.009812301956117153, + -0.014524789527058601, + 0.016461428254842758, + -0.0013120726216584444, + -0.003531137714162469, + 0.004305793438106775, + 0.023988496512174606, + 0.014886295422911644, + -0.023846477270126343, + 0.0060584512539207935, + 0.027319515123963356, + 0.008185526356101036, + -0.01665509305894375, + -0.011871594935655594, + -0.16247107088565826, + 0.04035954922437668, + 0.017003687098622322, + -0.0315801203250885, + 0.0046995761804282665, + 0.011096939444541931, + -0.007197840139269829, + 0.012000704184174538, + -0.010193174704909325, + 0.016099922358989716, + 0.016500161960721016, + 0.004973933566361666, + -0.01971498131752014, + -0.029798412695527077, + -0.01080644316971302, + -0.0011305127991363406, + -0.032509706914424896, + 0.009599272161722183, + 0.03225148841738701, + 0.0255507193505764, + 0.003721573855727911, + -0.015454376116394997, + 0.022929800674319267, + 0.0010328739881515503, + 4.037815870105987e-06, + 0.005090131890028715, + -0.01528653409332037, + -0.004086307715624571, + 0.016964955255389214, + -0.014718453399837017, + -0.011671475134789944, + 0.005903520155698061, + 0.016706736758351326, + 0.01484756264835596, + 0.001228151610121131, + 0.0060294014401733875, + 0.009754203259944916, + 0.005745361093431711, + -0.0023772239219397306, + 0.02664814703166485, + -0.0033051965292543173, + 0.0022109958808869123, + 0.003171245800331235, + 0.02409178391098976, + -0.016745468601584435, + 0.02391103096306324, + 0.020502546802163124, + -0.01203943695873022, + -0.01030291710048914, + -0.018824126571416855, + 0.006219837814569473, + -0.01620320975780487, + 0.008772972971200943, + -0.004564011935144663, + 0.004709259606897831, + 0.015131602995097637, + 0.03558250889182091, + 0.00420250603929162, + 0.005432271398603916, + -0.014176194556057453, + -0.007094552740454674, + -0.007417325861752033, + 0.018772482872009277, + 0.0015840090345591307, + 0.017158618196845055, + -0.015196157619357109, + 0.0010005966760218143, + -0.0034407612401992083, + -0.022710315883159637, + 0.024840617552399635, + -0.025899313390254974, + -0.025279588997364044, + 0.003889415878802538, + -0.01059986837208271, + 0.0070493645034730434, + 0.009786480106413364, + 0.0005386276170611382, + -0.005629162769764662, + -0.017765432596206665, + -0.006481283809989691, + -0.04260604828596115, + 0.0211868267506361, + -0.015699684619903564, + 0.02015395276248455, + 0.005109498277306557, + 0.010193174704909325, + -0.015325266867876053, + 0.00905055832117796, + -0.017003687098622322, + -0.018630463629961014, + 0.032303132116794586, + -0.036279696971178055, + 0.01810111664235592, + -0.03912010043859482, + 0.025060104206204414, + 0.021741995587944984, + -0.0008488932508043945, + 0.01870792917907238, + -0.006171421613544226, + -0.0001905370008898899, + 0.017726698890328407, + -0.013763044960796833, + 0.0060907285660505295, + -0.0021157776936888695, + 0.030108274891972542, + 0.015712594613432884, + -0.012491319328546524, + 0.026067156344652176, + 0.03757078945636749, + 0.004628566559404135, + -0.027990883216261864, + 0.005409677047282457, + 0.036692846566438675, + 0.027500268071889877, + -0.02289106883108616, + 0.008275902830064297, + 0.013801777735352516, + -0.018036561086773872, + 0.01994737796485424, + 0.003921693190932274, + 0.05012020841240883, + -0.028972113505005836, + -0.011878049932420254, + 0.009670281782746315, + -0.0016542121302336454, + -0.004651160445064306, + -0.09636713564395905, + 0.013298251666128635, + 0.02558945119380951, + -0.008656774647533894, + 0.0031841567251831293, + 0.026880543678998947, + 0.010722522623836994, + 0.014731364324688911, + 0.011167949065566063, + 0.014989582821726799, + 0.00011952691420447081, + -0.015118692070245743, + -0.015351088717579842, + -0.014615166001021862, + -0.004676982294768095, + 0.007178473751991987, + -0.01321433112025261, + -0.0021851740311831236, + -0.034394703805446625, + 0.0041766841895878315, + -0.0012846369063481688, + -0.02619626559317112, + -0.016900399699807167, + -0.011309969238936901, + -0.01496376097202301, + -0.0008892398909665644, + -0.024698598310351372, + 0.011548821814358234, + 0.006468372885137796, + 0.02830074541270733, + -0.0017558856634423137, + -0.025873491540551186, + -0.007081641815602779, + -0.012032981030642986, + -0.026751434430480003, + -0.028145814314484596, + -0.0124590415507555, + 0.007075186353176832, + -0.0004353402182459831, + -0.020670389756560326, + 0.004770586267113686, + -0.014860473573207855, + 0.017829986289143562, + -0.013905065134167671, + 0.024982638657093048, + -0.020954430103302002, + -0.016125744208693504, + 0.018837038427591324, + 0.02428544871509075, + -0.003297127317637205, + -0.01994737796485424, + 0.006875067017972469, + -0.003363295691087842, + -0.0033277906477451324, + 0.030314849689602852, + -0.02930779755115509, + 0.012284744530916214, + 0.007184929214417934, + -0.014731364324688911, + -0.0052805677987635136, + -0.01622903160750866, + 0.027706842869520187, + -0.007468969561159611, + 0.018875770270824432, + -0.0013758203713223338, + 0.0021916294936090708, + -0.005780866369605064, + 0.008889171294867992, + 0.020915696397423744, + -0.022193878889083862, + -0.04263187199831009, + 0.005548469722270966, + -0.019004879519343376, + 0.0062262932769954205, + -0.032561350613832474, + 0.0063715409487485886, + -0.034807853400707245, + 0.009734836407005787, + -0.003019542433321476, + 0.0006003579474054277, + -0.014524789527058601, + -0.011251870542764664, + -0.014331125654280186, + -0.005874470341950655, + 0.0014960533007979393, + 0.043561458587646484, + 0.010348105803132057, + -0.006694314070045948, + -0.0012450972571969032, + -0.03240641951560974, + -0.01913398876786232, + 0.018152760341763496, + 0.0034536721650511026, + 0.0028178091160953045, + -0.00041839462937787175, + 0.014899206347763538, + 0.0057485890574753284, + 0.01018026378005743, + 0.03811304643750191, + -0.012452586553990841, + -0.011600465513765812, + -0.007972495630383492, + -0.06326352804899216, + 0.016977865248918533, + 0.01873375102877617, + -0.010858086869120598, + 0.02577020414173603, + 0.013775955885648727, + 0.027112940326333046, + 0.013479004614055157, + -0.009851034730672836, + -0.0170553307980299, + -0.008250080980360508, + 0.032535530626773834, + -0.0118586840108037, + -0.02180655114352703, + -0.025266679003834724, + 0.008049961179494858, + 0.024195071309804916, + 0.017972007393836975, + 0.011309969238936901, + 0.010832265019416809, + -0.021341757848858833, + 0.021135183051228523, + 0.02948855049908161, + 0.013905065134167671, + -0.023975586518645287, + -0.0034924049396067858, + -0.0065361554734408855, + -0.009063469246029854, + -0.025899313390254974, + 0.005367716774344444, + 0.02161288633942604, + -0.02096734009683132, + -0.0019414802081882954, + 0.04691829904913902, + -0.027371158823370934, + -0.008914993144571781, + 0.010380382649600506, + 0.019017791375517845, + 0.007972495630383492, + -0.020902786403894424, + -0.008166159503161907, + -0.025434520095586777, + -0.0012886716285720468, + -0.022206788882613182, + -0.015234890393912792, + 0.00441230833530426, + -0.009205489419400692, + 0.00014434009790420532, + 0.04059194400906563, + -0.008133882656693459, + 0.025666916742920876, + 0.018372245132923126, + -0.005380627699196339, + -0.004631794057786465, + 0.014214927330613136, + -0.026467394083738327, + 0.02014104090631008, + 0.004031436052173376, + 0.017145708203315735, + -0.008798794820904732, + 0.026092978194355965, + 0.0026644919998943806, + 0.021470867097377777, + 0.0034859494771808386, + 0.009224855341017246, + -0.00832109060138464, + -0.020205596461892128, + -0.01195551548153162, + 0.02597677893936634, + -0.011290603317320347, + -0.008805250748991966, + 0.00395074300467968, + 0.008953725919127464, + 0.007191384676843882, + 0.028145814314484596, + -0.020838230848312378, + 0.006842789705842733, + 0.003640880575403571, + -0.010612779296934605, + 0.03465292230248451, + 0.0011087256716564298, + 0.004305793438106775, + -0.05572354793548584, + 0.0075980788096785545, + 0.017933273687958717, + 0.006468372885137796, + -0.009760658256709576, + 0.0006330387550406158, + 0.004483318421989679, + 0.01786871999502182, + 0.02407887391746044, + -0.011084028519690037, + -0.04472343996167183, + 0.004089535214006901, + -0.008140337653458118, + -0.02079949900507927, + -0.006823423318564892, + -0.015854615718126297, + -0.001550117856822908, + 0.044413577765226364, + 0.019495494663715363, + 0.012730170972645283, + 0.017765432596206665, + -0.019637515768408775, + -0.016267765313386917, + 0.006419957149773836, + -0.013943797908723354, + -0.020437993109226227, + -0.008585765026509762, + 0.004725398030132055, + 0.004215416964143515, + -0.015196157619357109, + -0.0038506831042468548, + 0.012175001204013824, + -0.020231418311595917, + 0.012142724357545376, + -0.030056631192564964, + -0.021909838542342186, + 0.003108304925262928, + 0.02263285033404827, + -0.0094766179099679, + 0.00822425913065672, + 0.013020667247474194, + 0.005596885457634926, + 0.004270288161933422, + 0.006771779619157314, + 0.02207767963409424, + 0.0013701717834919691, + 0.03057306818664074, + 0.005603340920060873, + 0.021664530038833618, + -0.025421610102057457, + -0.0067459577694535255, + -0.017533035948872566, + 0.0064038182608783245, + -0.006187560502439737, + 0.040023863315582275, + 0.004673754330724478, + 0.0036118309944868088, + 0.050404246896505356, + 0.008488932624459267, + -0.031037861481308937, + -0.002519244095310569, + -0.008508299477398396, + 0.015944991260766983, + 0.017804164439439774, + 0.010845175944268703, + -0.02598969079554081, + -0.0043832589872181416, + 0.006277936976402998, + 0.010703155770897865, + 0.023446237668395042, + -0.005651757121086121, + -0.044207002967596054, + 0.011374523863196373, + -0.03535011038184166, + 0.007488335948437452, + -0.0061940159648656845, + -5.169412816030672e-06, + -0.0012289586011320353, + 0.0037635343614965677, + 0.01103238482028246, + 0.002398204058408737, + -0.015105781145393848, + -0.01289801299571991, + -0.015480197966098785, + -0.015944991260766983, + -0.02496972680091858, + -0.018824126571416855, + 0.013672668486833572, + -0.003145423950627446, + -0.04782206192612648, + -0.010154441930353642, + 0.008863349445164204, + -0.003411711659282446, + -0.005028804764151573, + 0.004906150978058577, + 0.005093359388411045, + 0.03612476587295532, + -0.018126938492059708, + 0.017403926700353622, + -0.03473038598895073, + -0.02283942513167858, + -0.0028016704600304365, + -0.004421991761773825, + /* end::query-vectors-idx-truncated[] */ + -0.005022349301725626, + 0.002007648814469576, + -0.03757078945636749 + ], "DOT") LIMIT 3; \ No newline at end of file diff --git a/modules/vector-index/pages/composite-vector-index.adoc b/modules/vector-index/pages/composite-vector-index.adoc index 747974123..5bf59cf0a 100644 --- a/modules/vector-index/pages/composite-vector-index.adoc +++ b/modules/vector-index/pages/composite-vector-index.adoc @@ -28,11 +28,11 @@ For more information about how to deploy a new node and Services on your databas * You must have a bucket with scopes and collections in your database. For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. -* Your account must have the xref:learn:security:roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. +* Your account must have the xref:learn:security/roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. * You have documents in a collection that contain one or more vector embeddings. You can add a single vector to a Composite Vector index. -If your documents contain multiple embedded vectors, you can create multiple indexes---one for each vector attribute. +If your documents contain multiple embedded vectors, you can create multiple indexes -- one for each vector attribute. + Embeddings can be an array of floating point numbers or a base64 encoded string. Couchbase {product-name} does not embed vectors itself. @@ -54,28 +54,27 @@ See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector [#create-index] -ifeval::['{product-name}' == 'Capella'] -include::vector-index:partial$create-composite-index-capella-ui.adoc[] +// TODO: For uptake in Couchbase Capella +//// +include::vector-index:partial$create-composite-index-capella-ui.adoc[opts=optional] == Create a Composite Vector Index Using SQL++ -endif::[] -ifeval::['{product-name}' == 'Server'] -== Create a Hyperscale Vector Index -endif::[] +//// +== Create a Composite Vector Index Creating a Composite Vector index is similar to creating a non-vector GSI index. See xref:guides:create-index.adoc[] for an overview of creating indexes. In the `CREATE INDEX` statement to create the Composite Vector index, add the `VECTOR` lead key attribute after the vector's key name to declare it as an embedded vector. -You must also use the xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[`WITH`] clause to specify some additional information for the vector column. +You must also use the xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[WITH] clause to specify some additional information for the vector column. The format for this clause with the most commonly used parameters is: [source,sqlpp] ---- -WITH { "dimension": , - "similarity":, - "description": - }; +WITH {"dimension": , + "similarity": , + "description": + }; ---- NOTE: The `WITH` clause can contain other parameters that affect how the index processes vectors. @@ -83,13 +82,13 @@ For a full list of these parameters, see xref:n1ql:n1ql-language-reference/creat * `dimensions` is an integer value that sets the number of dimensions in the vector. This value is set by the embedded model you used to embed the vectors. -* `similarity-metric` is a string that sets the distance metric to use when comparing vectors during index creation. +* `similarity_metric` is a string that sets the distance metric to use when comparing vectors during index creation. + include::partial$distance-metric-list.adoc[] + For the greatest accuracy, use the distance function you plan to use when querying vector data. -* `centroids-and-quantization` is a string containing the settings for the quantization and index algorithms. +* `centroids_and_quantization` is a string containing the settings for the quantization and index algorithms. See <<#algo_settings>> in the next section for more information. For a full list of the parameters that affect a Composite Vector index, see xref:n1ql:n1ql-language-reference/createindex.adoc[]. @@ -134,7 +133,7 @@ In this example: * The similarity function is `L2`. This function works well to find related vectors which are close by the search vector. In this example, finding similar colors depends more on proximity than the magnitude or alignment of the vectors. -See xref:gsi-with-vectors.adoc##vector_similarity[Vector Similarity] for a comparison of similarity functions. +See xref:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity] for a comparison of similarity functions. * The `description` lets Couchbase {product-name} decide the number of centroids for the IVF algorithm. It also chooses to use Scalar Quantization with an 8-bit index, splitting each dimension into 256 bins. This setting does not actually save any space in the index, as each of the RGB dimensions are already 8-bit values. @@ -358,19 +357,10 @@ It appears here with most of the 1536 vectors omitted: [source,sqlpp] ---- -include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-truncated] +include::vector-index:example$query-vectors-idx-whole.sqlpp[tags=!query-vectors-idx-truncated] ---- -You can expand the following section to see and copy the entire query with all the vectors: - -.Show full example -[%collapsible] -==== -[source,sqlpp] ----- -include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-whole] ----- -==== +You can click the btn:[View] button to see and copy the entire query with all the vectors. Another option is to import the `rgb_questions.json` file into another collection in the `vector-sample` bucket's `color` scope named `rgb-questions`. Then you can use a subquery to get the vectors for the question and use it in your query of the `rgb` collection's `embedding_vector_dot` attribute: @@ -431,19 +421,10 @@ The truncated version of the query is: [source,sqlpp] ---- -include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-filtered-truncated] +include::vector-index:example$query-vectors-idx-filtered-whole.sqlpp[tags=!query-vectors-idx-filtered-truncated] ---- -You can expand the Show full example section to see and copy the entire query with all the vectors: - -.Show full example -[%collapsible] -==== -[source,sqlpp] ----- -include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-filtered-whole] ----- -==== +You can click the btn:[View] button to see and copy the entire query with all the vectors. The results of this query moves the papaya whip entry to the top. diff --git a/modules/vector-index/pages/hyperscale-filter.adoc b/modules/vector-index/pages/hyperscale-filter.adoc index 4cf963392..554bde79d 100644 --- a/modules/vector-index/pages/hyperscale-filter.adoc +++ b/modules/vector-index/pages/hyperscale-filter.adoc @@ -38,7 +38,7 @@ This example is the same as the example from xref:vector-index:hyperscale-vector When you query a Hyperscale Vector index, you can use the included scalar values as predicates in the `WHERE` clause of your query. Couchbase {product-name} uses the predicates to filter the results before performing the vector comparison. -The following example performs the same query as the example from xref:vector-index:hyperscale-vector-index.adoc#example[Query with a Hyperscale Vector Index], but adds the `brightness` key as a predicate in the `WHERE` clause: +The following example performs the same query as the example from xref:vector-index:hyperscale-vector-index.adoc#query-with-a-hyperscale-vector-index[Query with a Hyperscale Vector Index], but adds the `brightness` key as a predicate in the `WHERE` clause: [source,sqlpp] ---- @@ -52,6 +52,6 @@ The result of running the query is: include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-brightness] ---- -Querying with the `brightness` attribute changes makes `sky blue` the top result compared to the results from the example in xref:vector-index:hyperscale-vector-index.adoc#query-example[Query with a Hyperscale Vector Index]. +Querying with the `brightness` attribute changes makes `sky blue` the top result compared to the results from the example in xref:vector-index:hyperscale-vector-index.adoc#query-with-a-hyperscale-vector-index[Query with a Hyperscale Vector Index]. The restriction can also make the query faster. On a laptop running a three-node cluster in Docker containers, the query ran in (43{nbsp}ms verses 219{nbsp}ms for the query without the filter. diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc index 62f5f018c..036dcf776 100644 --- a/modules/vector-index/pages/hyperscale-vector-index.adoc +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -23,7 +23,7 @@ By relying on disk storage, they have lower memory requirements than other index You add a single vector column to a Hyperscale Vector Index. The vector value can be an array of floating point values. -You can nest the array in another array as long as you use an xref:n1ql:n1ql-language-reference/unnest.adoc[`UNNEST` clause] to extract the it from the containing array. +You can nest the array in another array as long as you use an xref:n1ql:n1ql-language-reference/unnest.adoc[UNNEST clause] to extract the it from the containing array. You can also store the vector in a BASE64 string. == Prerequisites @@ -33,14 +33,14 @@ Hyperscale Vector Indexes have the following requirements: * You must have the Index Service enabled on at least one node in your cluster. For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. -* Your account must have the xref:learn:security:roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. +* Your account must have the xref:learn:security/roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. * You must have a bucket your database. For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. * You have documents in a collection that contain one or more vector embeddings. You can add a single vector to a Hyperscale Vector Index. -If your documents contain multiple embedded vectors, you can create multiple indexes---one for each vector attribute. +If your documents contain multiple embedded vectors, you can create multiple indexes -- one for each vector attribute. + Embeddings can be an array of floating point numbers or a base64 encoded string. Couchbase {product-name} does not embed vectors itself. @@ -66,14 +66,13 @@ The quantization determines how much memory your index uses and the amount of pr See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity Metrics] and xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization] for more information. [#create-index] -ifeval::['{product-name}' == 'Capella'] -include::vector-index:partial$create-hyperscale-index-capella-ui.adoc[] +// TODO: For uptake in Couchbase Capella +//// +include::vector-index:partial$create-hyperscale-index-capella-ui.adoc[opts=optional] -== Create a Hyperscale Vector Index Using SQL++ -endif::[] -ifeval::['{product-name}' == 'Server'] +== Create a Hyperscale Vector Index Using {sqlpp} +//// == Create a Hyperscale Vector Index -endif::[] Use the `CREATE VECTOR INDEX` statement to create a Hyperscale Vector Index. This statement is similar to the `CREATE INDEX` statement that you use to create Global Secondary Indexes (GSI). @@ -84,32 +83,32 @@ The following syntax shows the minimum required parameters to create a Hyperscal [source,sqlpp] ---- -CREATE VECTOR INDEX `` - ON ``(`` VECTOR) - WITH { "dimension": , - "similarity":, - "description": - }; +CREATE VECTOR INDEX `` + ON ``(`` VECTOR) + WITH {"dimension": , + "similarity": , + "description": + }; ---- NOTE: This syntax for the `CREATE VECTOR INDEX` shows the minimum required parameters to get you started. -For the full syntax, see xref:n1ql:n1ql-language-reference/createvectorindex.adoc[`CREATE VECTOR INDEX`] in the SQL++ for Query Reference. +For the full syntax, see xref:n1ql:n1ql-language-reference/createvectorindex.adoc[] in the SQL++ for Query Reference. The parameters in this statement are: -* `index-name` is a string that sets the name of the index. +* `index_name` is a string that sets the name of the index. * `collection` is the path of the collection to index. -* `key-name` is the name of the key containing the vector that you want to index. +* `key_name` is the name of the key containing the vector that you want to index. The key value must be an array of floating point numbers or a base64 encoded string. * `dimensions` The number of dimensions in the vector as an integer. The embedded model you use to embed the vectors determines the number of dimensions in the vector. -* `distance-metric` is a string that sets the distance metric to use when comparing vectors during index creation. +* `similarity_metric` is a string that sets the distance metric to use when comparing vectors during index creation. + include::partial$distance-metric-list.adoc[] + For the greatest accuracy, use the distance metric you plan to use to query the data. -* `centroids-and-quantization` is a string containing the settings for the quantization and index algorithms. +* `centroids_and_quantization` is a string containing the settings for the quantization and index algorithms. See <<#algo_settings>> in the next section for more information. include::partial$index-algorithm-settings.adoc[] @@ -179,7 +178,7 @@ SELECT ---- NOTE: The previous query example shows just a subset of the most common parameters for the `APPROX_VECTOR_DISTANCE` function. -See xref:n1ql:n1ql-language-reference:vectorfun.adoc#approx_vector_distance[APPROX_VECTOR_DISTANCE] for the full set of parameters available in this function. +See xref:n1ql:n1ql-language-reference/vectorfun.adoc#approx_vector_distance[APPROX_VECTOR_DISTANCE()] for the full set of parameters available in this function. The `APPROX_VECTOR_DISTANCE` parameters shown in the example are: @@ -192,7 +191,7 @@ This value should match the distance metric you used when you created the index. By default, the vector search only probes a single centroid. -NOTE: You can also call the function xref:n1ql:n1ql-language-reference:vectorfun.adoc#vector_distance[`VECTOR_DISTANCE`] to find similar vectors. +NOTE: You can also call the function xref:n1ql:n1ql-language-reference/vectorfun.adoc#vector_distance[VECTOR_DISTANCE()] to find similar vectors. However, this function does not use the Hyperscale Vector index to perform the vector search. Instead, it performs a brute-force search for similar vectors. It's useful to measure the recall of your Hyperscale Vector index. diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc index 4c408a184..1faaea4ee 100644 --- a/modules/vector-index/pages/use-vector-indexes.adoc +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -45,7 +45,7 @@ Composite Vector Indexes:: * Designed for searches using a single vector value along with standard scalar values that filter out large portions of the dataset. The scalar attributes in a query reduce the number of vectors the Couchbase {product-name} has to compare when performing a vector search to find similar vectors. * Consume a moderate amount of memory and can index billions of documents. -* Work well for cases where your queries are highly selective---returning a small number of results from a large dataset +* Work well for cases where your queries are highly selective -- returning a small number of results from a large dataset -- + diff --git a/modules/vector-index/pages/vector-index-best-practices.adoc b/modules/vector-index/pages/vector-index-best-practices.adoc index 91261975a..79ed31ef8 100644 --- a/modules/vector-index/pages/vector-index-best-practices.adoc +++ b/modules/vector-index/pages/vector-index-best-practices.adoc @@ -229,6 +229,7 @@ include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=recall-rate-quer The result of running the recall rate query is: +[source,json] ---- include::vector-index:example$hyperscale-idx-data.json[tag=recall-rate-results] ---- @@ -244,7 +245,7 @@ The following example shows how to increase this value to `4` in the approximate [source,sqlpp] ---- include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=tuned-query] ----- +---- The results of running the tuned query are: @@ -262,7 +263,7 @@ The following example shows the recall rate query with the `APPROX_VECTOR_DISTAN include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=recall-rate-tuned] ---- -The result of this update are: +The results of this update are: [source,json] ---- diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc index 96cdc6ab4..868d2f5c9 100644 --- a/modules/vector-index/pages/vectors-and-indexes-overview.adoc +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -93,20 +93,19 @@ You also cannot compare a vector for a piece of text generated by Word2Vec with === Using Embedding Models with Couchbase {product-name} -ifeval::['{product-name}' == 'Server'] -Couchbase {product-name} does not implement any embedding models. +// TODO: Remove in Couchbase Capella +Couchbase {product-name} does not implement any embedding models. You must use external embedding models to generate them and then store the resulting vectors in your documents. -A common method of embedding vectors in your database is to call an https://openai.com/index/introducing-text-and-code-embeddings/[OpenAI Embedding API^] to generate vectors for your data. +A common method of embedding vectors in your database is to call an https://openai.com/index/introducing-text-and-code-embeddings/[OpenAI Embedding API^] to generate vectors for your data. You then store the vector as an attribute in your document. Another option is to use Couchbase Capella along with Capella's AI Services which integrates several embedding models. See https://www.couchbase.com/products/ai-services/[Capella AI Services] for more information. -endif::[] -ifeval::['{product-name}' != 'Server'] +// TODO: For uptake in Couchbase Capella +//// You can use external embedding models or https://www.couchbase.com/products/ai-services/[Capella AI Services] to generate vector embeddings. - -endif::[] +//// [#vector_similarity] == Vector Similarity Metrics diff --git a/modules/vector-index/partials/index-algorithm-settings.adoc b/modules/vector-index/partials/index-algorithm-settings.adoc index 3198ae3ea..22771ff84 100644 --- a/modules/vector-index/partials/index-algorithm-settings.adoc +++ b/modules/vector-index/partials/index-algorithm-settings.adoc @@ -7,9 +7,9 @@ Using it, you control how the index subdivides the dataset to improve performanc The `description` parameter is a string in the following format: -[source,sqlpp] +[source,ebnf] ---- -'IVF[],{PQ|SQ}' +description ::= '"' 'IVF' number-of-centroids? ',' ('SQ' sq-settings | 'PQ' pq-settings) '"' ---- The following sections describe the settings for centroids and quantization. @@ -17,7 +17,7 @@ The following sections describe the settings for centroids and quantization. ==== Number of Centroids {index-name} uses several algorithms to organize its data to improve its performance. -One of these algorithms, xref:vector-index:use-vector-indexes.adoc#IVF[Inverted File (IVF)], has a setting you can adjust to control how it subdivides the dataset. +One of these algorithms, xref:vector-index:vectors-and-indexes-overview.adoc#IVF[Inverted File (IVF)], has a setting you can adjust to control how it subdivides the dataset. The other algorithms that {index-name} uses do not have settings you can adjust. The key setting for IVF is the number of centroids it allocates for the index. @@ -30,7 +30,7 @@ It sets the number of centroids to the number of vectors in the dataset divided You can manually set the number of centroids for the index by adding an integer value after the `IVF` in the `description` parameter. The number of centroids you set manually must be less than the number of vectors in the dataset. -ifeval::['{index-name}' == 'Composite Vector index'] +ifeval::['{index-name}' == 'Composite Vector index'] The number of centroids affects the performance of your {index-name} index in two ways: * If the index has fewer centroids, each centroid is larger (has more vectors associated with it). @@ -41,7 +41,7 @@ However, having fewer centroids decreases the processing required to train the i This increase is due to the training process having to search for more data cluster to identify more centroids. However, it reduces the number of vectors associated with each centroid. This reduction makes search faster by limiting the number of vector comparisons during a search. -endif::[] +endif::[] ifeval::['{index-name}' == 'Hyperscale Vector index'] {index-name-plural} perform better with larger centroids (fewer centroids in the index). @@ -57,8 +57,7 @@ Another option is to have the fastest possible storage such as a fast NVME conne * If your working data set is much larger than the bucket's memory quota, choose a larger number of centroids for the index. This setting reduces the number of vectors associated with each centroid, which can reduce disk I/O during searches. - -endif::[] +endif::[] You may need to experiment with different numbers of centroids to find the best setting for your dataset and queries. @@ -67,8 +66,7 @@ See xref:vector-index:vector-index-best-practices.adoc#nlist[nList] for more gui ==== Quantization Setting {index-name} always uses quantization to reduce the size of vectors stored in the index. -By default, it uses -You must choose whether the index uses xref:vector-index:use-vector-indexes.adoc#sq[Scalar Quantization (SQ)] or xref:vector-index:use-vector-indexes.adoc#pq[Product Quantization (PQ)]. +You must choose whether the index uses xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization (SQ)] or xref:vector-index:vectors-and-indexes-overview.adoc#pq[Product Quantization (PQ)]. See xref:vector-index:vector-index-best-practices.adoc#quantization[Quantization] for guidance on choosing the quantization method for the index. You select the quantization by adding a comma followed by either `PQ` or `SQ` to the `description` parameter after the IVF setting in the `description` value. @@ -126,9 +124,9 @@ A smaller value results in a smaller index that returns less accurate results. The format for the PQ settings is: -[source,sqlpp] +[source,ebnf] ---- -PQx +pq-settings ::= 'PQ' subquantizers 'x' number-of-bits ---- For example, `PQ32x8` has PQ break the vector's dimensions into 32 subspaces, each of which has 256 centroids. diff --git a/preview/DOC-12294-GSI-vector-index.yml b/preview/DOC-12294-GSI-vector-index.yml new file mode 100644 index 000000000..c28497293 --- /dev/null +++ b/preview/DOC-12294-GSI-vector-index.yml @@ -0,0 +1,5 @@ +sources: + docs-server: + branches: [DOC-12565_vector_search_concepts] +override: + startPage: server:introduction:intro.adoc From c50d6079f1c521c8d40b2968cb503e364d792a68 Mon Sep 17 00:00:00 2001 From: Gary Gray <137797428+ggray-cb@users.noreply.github.com> Date: Tue, 16 Sep 2025 15:36:16 -0400 Subject: [PATCH 62/80] DOC-13545 GSI Vector Index Similarity internally uses squared variant for L2 and Euclidean (#422) * Added note to Euclidean Distance to explain that Couchbase uses Euclidean Squared Distance instead behind the scenes. * Changed "FTS Vector Index" to "Search Vector Index" which is PM's current nomenclature. * Fixing a typo spotted by Nischal --- .../pages/hyperscale-vector-index.adoc | 2 +- .../pages/use-vector-indexes.adoc | 28 +++++++++---------- .../pages/vectors-and-indexes-overview.adoc | 27 +++++++++++------- .../partials/fts-vector-app-workflow.puml | 2 +- 4 files changed, 33 insertions(+), 26 deletions(-) diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc index 036dcf776..9ca86667a 100644 --- a/modules/vector-index/pages/hyperscale-vector-index.adoc +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -13,7 +13,7 @@ They can scale up to a billion documents containing vectors with a large number of dimensions. Because they provide the best performance, consider testing a Hyperscale Vector index for your application before resorting to the other types of indexes. -If you find theirs performance does not meet your needs, then test using a Composite Vector Index or a FTS Vector Index. +If you find theirs performance does not meet your needs, then test using a Composite Vector Index or a Search Vector Index. == How the Hyperscale Vector Index Works diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc index 1faaea4ee..970ab7926 100644 --- a/modules/vector-index/pages/use-vector-indexes.adoc +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -55,7 +55,7 @@ Use Composite Vector indexes when you want to perform searches of documents usin To learn how to use Composite Vector indexes, see xref:vector-index:composite-vector-index.adoc[]. -FTS Vector Index:: +Search Vector Index:: + -- * Combines a Couchbase {product-name} Search index with a single vector column @@ -67,7 +67,7 @@ FTS Vector Index:: Use this index type when you need to perform hybrid searches that combine vectors with full-text or geospatial searches. + -To learn how to use FTS Vector indexes, see xref:vector-search:vector-search.adoc[]. +To learn how to use Search Vector Indexes, see xref:vector-search:vector-search.adoc[]. == Choosing the Right Index Type @@ -82,7 +82,7 @@ The following table summarizes the differences between the three types of vector [%autowidth] |=== -| | Hyperscale Vector Index | Composite Vector Index | FTS Vector Index +| | Hyperscale Vector Index | Composite Vector Index | Search Vector Index | *First Available in Version* | 8.0 @@ -142,7 +142,7 @@ When choosing which type of index to use, consider the following: * In most cases, test using a Hyperscale Vector index. If you find that the performance is not what you need, you can try using one of the other index types. -* If your dataset will not grow beyond 100 million documents and you need to perform hybrid searches that combine vector searches with Full-Text Search or geospatial searches, use an FTS Vector index. +* If your dataset will not grow beyond 100 million documents and you need to perform hybrid searches that combine vector searches with Full-Text Search or geospatial searches, use an Search Vector Index. == Applications for Vector Indexes @@ -238,10 +238,10 @@ Finally, it sends the results of the similarity search back to the Query Service See xref:vector-index:composite-vector-index.adoc[] for more information about Composite Vector indexes. [#fts] -=== FTS Vector Index Applications +=== Search Vector Index Applications -FTS Vector indexes contain a single vector column in addition to a Full-Text Search index. -Some of the applications for FTS Vector indexes include: +Search Vector Indexes contain a single vector column in addition to a Full-Text Search index. +Some of the applications for Search Vector Indexes include: E-Commerce product recommendations:: E-Commerce applications can use scalar, text, and vector searches to find products that match a customer's search. @@ -256,16 +256,16 @@ Users often want to search for hotels using multiple criteria: * Semantic searches of descriptions and reviews for searches that do not rely on literal text matches, such as "modern beach resort with chic décor," which requires vector searches. + -An FTS vector index can combine geospatial, keyword, and semantic searches into a single index. +An Search Vector Index can combine geospatial, keyword, and semantic searches into a single index. Real estate searches:: -Real estate applications can use FTS Vector indexes to find properties within a search region and have floor plan similar to an uploaded image. +Real estate applications can use Search Vector Indexes to find properties within a search region and have floor plan similar to an uploaded image. -=== FTS Vector Index Application Workflow +=== Search Vector Index Application Workflow -After you create an FTS Vector index, your application follows the workflow shown in the following diagram: +After you create an Search Vector Index, your application follows the workflow shown in the following diagram: -.Application Workflow with FTS Vector Indexes +.Application Workflow with Search Vector Indexes [plantuml,fts-app-workflow,svg] .... include::vector-index:partial$fts-vector-app-workflow.puml[] @@ -275,10 +275,10 @@ The steps shown in the diagram are: . When your application loads data it wants to search semantically, it calls an embedding model to generate a vector for it. . It sends the data and the vector to Couchbase {product-name} for storage. -. The Data Service sends the embedded vector along with scalar fields to the Search Service for inclusion in the FTS Vector index. +. The Data Service sends the embedded vector along with scalar fields to the Search Service for inclusion in the Search Vector Index. . When your application needs to perform a search that includes a vector, it uses the same embedding model to generate a vector for the search value. . It sends the search vector and text, geospatial, and other search values as part of a search request to the Couchbase {product-name} Search Service. -. The Search Service performs an index scan in the FTS Vector index to find documents that match the text or geospatial portions of the query. +. The Search Service performs an index scan in the Search Vector Index to find documents that match the text or geospatial portions of the query. Then it performs a vector similarity search on the results using the search vector. . The Search Service returns results to your application. diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc index 868d2f5c9..eaeddd904 100644 --- a/modules/vector-index/pages/vectors-and-indexes-overview.adoc +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -127,7 +127,13 @@ Use this method when the actual distance of the vectors and their magnitudes are This method is useful if the distance between vectors represents a real-world value. image::euclidean-distance-example.svg["Three-dimensional plot showing two vectors with points along each vector joined by dotted lines, indicating the summing of corresponding points."] - + +NOTE: When you select Euclidean Distance or L2 as the metric for a vector index, Couchbase {product-name} internally uses the <<#euclidean-squared>> metric (explained in the next section) to perform vector comparisons. +This approach improves performance because it avoids performing a computationally expensive square root operation. +Vector searches using the Euclidean Squared metric return the same relevant vectors and ranking of results as Euclidean Distance. +If your query materializes or projects the actual distance between vectors, Couchbase {product-name} calculates the actual Euclidean Distance. +For example, if your query returns the distance between vectors as a column, Couchbase {product-name} calculates the square root of the Euclidean Squared distance to return the actual Euclidean Distance. + Euclidean Distance is useful for tasks such as: * 3D motion capture where you're detecting similar positions or trajectories of joints, objects, where finding real-world values for thresholds is important. @@ -135,13 +141,14 @@ Euclidean Distance is useful for tasks such as: * Other cases where you use the results as filters in calculations that require the actual distance between the vectors. NOTE: Only Hyperscale Vector and Composite Vector indexes support this metric. -FTS Vector indexes do not support it. +Search Vector Indexes do not support it. [#euclidean-squared] === Euclidean Squared Distance -Euclidean Squared Distance (also known as L2 Squared or L2^2^) is similar to Euclidean Distance, but it does not take the square root of the sum distances between the vectors: +Euclidean Squared Distance (also known as L2 Squared or L2^2^) is similar to Euclidean Distance. +However, it does not take the square root of the sum distances between the vectors: Euclidean Distance Formula:: @@ -169,7 +176,7 @@ For example: * Locating similar genomic and biological sequences in a dataset, such as related gene profiles. NOTE: Only Hyperscale Vector and Composite Vector indexes support this metric. -FTS Vector indexes do not support it. +Search Vector Indexes do not support it. [#dot] === Dot Product @@ -226,7 +233,7 @@ However, searching a flat index is inefficient. The search must compare every vector in the index to find matches. You should only use it for small data sets or for testing. -NOTE: FTS Vector indexes use a flat index when indexing datasets with 1000 or fewer vectors. +NOTE: Search Vector Indexes use a flat index when indexing datasets with 1000 or fewer vectors. Hyperscale Vector and Composite Vector indexes only support the next algorithm, IVF. [#IVF] @@ -256,7 +263,7 @@ This graph connects related centroids together so that a similarity search can q Hyperscale also adds other proprietary optimizations that allow it to scale to billions of vectors. -FTS Vector indexes automatically uses IVF when the indexing datasets larger than 1000 vectors. +Search Vector Indexes automatically uses IVF when the indexing datasets larger than 1000 vectors. [#quantization] == Quantization @@ -313,7 +320,7 @@ Use PQ quantization when: Hyoerscale Vector and Composite Vector indexes support PQ quantization. -FTS Vector indexes do not support it. +Search Vector Indexes do not support it. [#sq] === Scalar Quantization (SQ) @@ -359,11 +366,11 @@ All three types of vector indexes support SQ quantization. === Choosing a Quantization Method -You do not choose a quantization method for FTS vector indexes. +You do not choose a quantization method for Search Vector Indexes. Instead, they automatically choose whether to use quantization: -* FTS Vector indexes do not use quantization for datasets smaller than 10000 vectors. -* FTS Vector indexes automatically use 8-bit SQ quantization for datasets with 10000 vectors or larger. +* Search Vector Indexes do not use quantization for datasets smaller than 10000 vectors. +* Search Vector Indexes automatically use 8-bit SQ quantization for datasets with 10000 vectors or larger. When creating a Hyperscale Vector or Composite Index, you choose which quantization method to use when creating the index. When deciding, consider the following: diff --git a/modules/vector-index/partials/fts-vector-app-workflow.puml b/modules/vector-index/partials/fts-vector-app-workflow.puml index 2e5a3074d..800174fe4 100644 --- a/modules/vector-index/partials/fts-vector-app-workflow.puml +++ b/modules/vector-index/partials/fts-vector-app-workflow.puml @@ -15,7 +15,7 @@ sprite Couchbase d="m 82.1,57.6 c 0,2.9 -1.7,5.5 -5,6.1 -5.8,1 -17.9,1.6 -28.1,1.6 -10.2,0 -22.3,-0.7 -28.1,-1.6 -3.3,-0.6 -5,-3.2 -5,-6.1 V 38.4 c 0,-2.9 2.3,-5.7 5,-6.1 1.7,-0.3 5.6,-0.6 8.8,-0.6 1.2,0 2.2,0.9 2.2,2.3 V 47.3 C 37.8,47.3 43,47 49,47 c 6,0 11.2,0.3 17.2,0.3 V 34.1 c 0,-1.4 1,-2.3 2.2,-2.3 3.2,0 7.1,0.3 8.8,0.6 2.7,0.4 5,3.2 5,6.1 z M 49,0 C 21.9,0 0,21.9 0,49 0,76.1 21.9,98 49,98 76.1,98 98,76.1 98,49 98,21.9 76.1,0 49,0 Z" /> -'title: Application Workflow with FTS Vector Indexes +'title: Application Workflow with Search Vector Indexes skinparam defaultTextAlignment center From cb54e59bd705299d908744bd45fa3dd39eeda651 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Wed, 17 Sep 2025 12:18:11 +0100 Subject: [PATCH 63/80] NO ISSUE: Update workflow diagrams (#421) * Use sequence diagrams for clearer readability * Minor wording tweaks --- .../pages/use-vector-indexes.adoc | 6 +- .../composite-vector-app-workflow.puml | 141 ++++++++---------- .../partials/fts-vector-app-workflow.puml | 127 ++++++++-------- .../hyperscale-vector-app-workflow.puml | 140 ++++++++--------- 4 files changed, 193 insertions(+), 221 deletions(-) diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc index 970ab7926..a1a2cf769 100644 --- a/modules/vector-index/pages/use-vector-indexes.adoc +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -172,7 +172,7 @@ Hyperscale Vector indexes can handle the large datasets and perform these vector === Hyperscale Vector Index Application Workflow -After you create a Hyperscale Vector index, your application follows the workflow shown in the following diagram: +To create and use a Hyperscale Vector index, your application follows the workflow shown in the following diagram: .Application Workflow with Hyperscale Vector Indexes [plantuml,hyperscale-vector-app-workflow,svg] @@ -214,7 +214,7 @@ Vector similarity searches can be added to these searches to find similar demand === Composite Vector Index Application Workflow -After you create a Composite Vector index, your application follows the workflow shown in the following diagram: +To create and use a Composite Vector index, your application follows the workflow shown in the following diagram: .Application Workflow with Composite Vector Indexes [plantuml,composite-vector-app-workflow,svg] @@ -263,7 +263,7 @@ Real estate applications can use Search Vector Indexes to find properties within === Search Vector Index Application Workflow -After you create an Search Vector Index, your application follows the workflow shown in the following diagram: +To create and use an Search Vector Index, your application follows the workflow shown in the following diagram: .Application Workflow with Search Vector Indexes [plantuml,fts-app-workflow,svg] diff --git a/modules/vector-index/partials/composite-vector-app-workflow.puml b/modules/vector-index/partials/composite-vector-app-workflow.puml index e64ef1ce6..7c9aee1d9 100644 --- a/modules/vector-index/partials/composite-vector-app-workflow.puml +++ b/modules/vector-index/partials/composite-vector-app-workflow.puml @@ -1,83 +1,72 @@ @startuml ai-app-workflow -!pragma layout smetana -!include -!include -!include -!include -!include -!include -!include -!include -!include sprite Couchbase -'title: Application Workflow with Composite Vector Indexes - -skinparam defaultTextAlignment center - -skinparam linetype ortho - -top to bottom direction - - - frame "Your Application" as APP { - card DL [ - Data - Loading - ] - card EM [ - Embedding - Models - ] - card SE [ - Search & Query Logic - ] - - DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData - EM --> DL : Vectors - SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData - EM --> SE : Vectors - - } - - frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { - database DS [ - <$Couchbase{scale=0.15,color=red}> - .. - Data - .. - Service - .. - ] - rectangle " <$Couchbase{scale=0.15}> Index Service" as IS { - card COMPOSITE [ - Composite - Vector - Index - ] - } - - rectangle "<$Couchbase{scale=0.15}> Query Service" as QS { - - } - - } - - -DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors -DS --> COMPOSITE : <$ma_numeric_3_box{scale=0.4}> Scalars &\nVectors - -QS --> COMPOSITE : <$ma_numeric_6_box{scale=0.4}> Scan\nRequest - -QS <-- COMPOSITE : <$ma_numeric_7_box{scale=0.4}> Index Scan\nResults - -SE ----> QS : <$ma_numeric_5_box{scale=0.4}> Queries - -QS ----> SE :<$ma_numeric_8_box{scale=0.4}> Query Results - - -@enduml +skinparam maxMessageSize 60 +skinparam roundcorner 5 +skinparam responseMessageBelowArrow true +skinparam sequenceMessageAlign left +skinparam ParticipantPadding 10 +skinparam Padding 2 +skinparam BoxPadding 20 + +box Your Application #FloralWhite +queue "Data\nLoading" as Loading +queue "Search &\nQuery Logic" as Logic +collections "Embedding\nModels" as Models +end box + +box <$Couchbase{scale=0.15}> Couchbase Cluster #FloralWhite +participant "Query\nService" as Query +participant "Data\nService" as Data +participant "Index\nService" as Index +end box + +group Load +||| +?o-> Loading +activate Loading #Maroon +autonumber "(0)" +Loading -> Models: Complex data +activate Models #GoldenRod +autonumber stop +Models -> Loading: Vectors +deactivate Models +autonumber resume +Loading -> Data: Data & vectors +deactivate Loading +activate Data #midnightblue +Data -> Index: Scalars & vectors +deactivate Data +activate Index #deepskyblue +note left of Index: Composite\nVector\nIndex +end + +group Query +' blank message to align the group boxes +autonumber stop +Loading -[#transparent]> Loading +?o-> Logic +activate Logic #IndianRed +autonumber resume +Logic -> Models: Complex data +activate Models #GoldenRod +autonumber stop +Models -> Logic: Vector +deactivate Models +autonumber resume +Logic -> Query: Query +activate Query #teal +Query -> Index: Scan request +Index -> Query: Index scan result +deactivate Index +Query -> Logic: Query results +deactivate Query +deactivate Logic +||| +end + +@enduml \ No newline at end of file diff --git a/modules/vector-index/partials/fts-vector-app-workflow.puml b/modules/vector-index/partials/fts-vector-app-workflow.puml index 800174fe4..d7948cd4d 100644 --- a/modules/vector-index/partials/fts-vector-app-workflow.puml +++ b/modules/vector-index/partials/fts-vector-app-workflow.puml @@ -1,74 +1,67 @@ @startuml ai-app-workflow -!pragma layout smetana -!include -!include -!include -!include -!include -!include -!include -!include -!include sprite Couchbase -'title: Application Workflow with Search Vector Indexes - -skinparam defaultTextAlignment center - -skinparam linetype ortho - -top to bottom direction - - - frame "Your Application" as APP { - card DL [ - Data - Loading - ] - card EM [ - Embedding - Models - ] - card SE [ - Search & Query Logic - ] - - DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData - EM -d-> DL : Vectors - SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData - EM --> SE : Vectors - - } - - frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { - database DS [ - <$Couchbase{scale=0.15,color=red}> - .. - Data - .. - Service - .. - ] - - rectangle " <$Couchbase{scale=0.15}> Search Service" as SSERV { - card SI [ - FTS Vector - Index - ] - } - - } - - -DS ----> SI : Text &\nVectors -DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors - -SE ----> SSERV : <$ma_numeric_5_box{scale=0.4}>Searches - -SSERV ----> SE :<$ma_numeric_6_box{scale=0.4}> Results - -@enduml +skinparam maxMessageSize 60 +skinparam roundcorner 5 +skinparam responseMessageBelowArrow true +skinparam sequenceMessageAlign left +skinparam ParticipantPadding 10 +skinparam Padding 2 +skinparam BoxPadding 50 + +box Your Application #FloralWhite +queue "Data\nLoading" as Loading +queue "Search &\nQuery Logic" as Logic +collections "Embedding\nModels" as Models +end box + +box <$Couchbase{scale=0.15}> Couchbase Cluster #FloralWhite +participant "Data\nService" as Data +participant "Search\nService" as Search +end box + +group Load +||| +?o-> Loading +activate Loading #Maroon +autonumber "(0)" +Loading -> Models: Complex data +activate Models #GoldenRod +autonumber stop +Models -> Loading: Vectors +deactivate Models +autonumber resume +Loading -> Data: Data & vectors +deactivate Loading +activate Data #midnightblue +Data -> Search: Text & vectors +deactivate Data +activate Search #LightGreen +note left of Search: Search\nVector\nIndex +end + +group Search +' blank message to align the group boxes +autonumber stop +Loading -[#transparent]> Loading +?o-> Logic +activate Logic #IndianRed +autonumber resume +Logic -> Models: Complex data +activate Models #GoldenRod +autonumber stop +Models -> Logic: Vector +deactivate Models +autonumber resume +Logic -> Search: Search +Search -> Logic:Results +deactivate Search +deactivate Logic +||| +end + +@enduml \ No newline at end of file diff --git a/modules/vector-index/partials/hyperscale-vector-app-workflow.puml b/modules/vector-index/partials/hyperscale-vector-app-workflow.puml index 59bf46d23..cb216dcf7 100644 --- a/modules/vector-index/partials/hyperscale-vector-app-workflow.puml +++ b/modules/vector-index/partials/hyperscale-vector-app-workflow.puml @@ -1,82 +1,72 @@ @startuml ai-app-workflow -!pragma layout smetana -!include -!include -!include -!include -!include -!include -!include -!include -!include sprite Couchbase -'title: Application Workflow with Hyperscale Vector Indexes - -skinparam defaultTextAlignment center - -skinparam linetype ortho - -top to bottom direction - - - frame "Your Application" as APP { - card DL [ - Data - Loading - ] - card EM [ - Embedding - Models - ] - card SE [ - Search & Query Logic - ] - - DL --> EM : <$ma_numeric_1_box{scale=0.4}>Complex\nData - EM --> DL : Vectors - SE --> EM : <$ma_numeric_4_box{scale=0.4}>Complex\nData - EM --> SE : Vectors - - } - - frame "<$Couchbase{scale=0.15}> Couchbase Cluster" as CC { - database DS [ - <$Couchbase{scale=0.15,color=red}> - .. - Data - .. - Service - .. - ] - rectangle " <$Couchbase{scale=0.15}> Index Service" as IS { - card HVI [ - Hyperscale - Vector - Index - ] - } - - rectangle "<$Couchbase{scale=0.15}> Query Service" as QS { - - } - - } - - -DL ----> DS : <$ma_numeric_2_box{scale=0.4}> Data &\nVectors -DS --> HVI : <$ma_numeric_3_box{scale=0.4}> Vectors - -QS --> HVI : <$ma_numeric_6_box{scale=0.4}> Scan\nRequest -QS <-- HVI : <$ma_numeric_7_box{scale=0.4}> Index\nScan\nResult - -SE ----> QS : <$ma_numeric_5_box{scale=0.4}>Queries - -QS ----> SE :<$ma_numeric_8_box{scale=0.4}> Query\nResults - - -@enduml +skinparam maxMessageSize 50 +skinparam roundcorner 5 +skinparam responseMessageBelowArrow true +skinparam sequenceMessageAlign left +skinparam ParticipantPadding 10 +skinparam Padding 2 +skinparam BoxPadding 20 + +box Your Application #FloralWhite +queue "Data\nLoading" as Loading +queue "Search &\nQuery Logic" as Logic +collections "Embedding\nModels" as Models +end box + +box <$Couchbase{scale=0.15}> Couchbase Cluster #FloralWhite +participant "Query\nService" as Query +participant "Data\nService" as Data +participant "Index\nService" as Index +end box + +group Load +||| +?o-> Loading +activate Loading #Maroon +autonumber "(0)" +Loading -> Models: Complex data +activate Models #GoldenRod +autonumber stop +Models -> Loading: Vectors +deactivate Models +autonumber resume +Loading -> Data: Data & vectors +deactivate Loading +activate Data #midnightblue +Data -> Index: Vectors +deactivate Data +activate Index #deepskyblue +note left of Index: Hyperscale\nVector\nIndex +end + +group Query +' blank message to align the group boxes +autonumber stop +Loading -[#transparent]> Loading +?o-> Logic +activate Logic #IndianRed +autonumber resume +Logic -> Models: Complex data +activate Models #GoldenRod +autonumber stop +Models -> Logic: Vector +deactivate Models +autonumber resume +Logic -> Query: Query +activate Query #teal +Query -> Index: Scan request +Index -> Query: Index scan result +deactivate Index +Query -> Logic: Query results +deactivate Query +deactivate Logic +||| +end + +@enduml \ No newline at end of file From ad83d0ea2853ef589c4f5ce5f8f896b5d8d0726e Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Mon, 29 Sep 2025 16:47:31 +0100 Subject: [PATCH 64/80] NO ISSUE: Style fixes (#432) * Apply Vale suggestions for DDL and DML * Update Search Vector workflow diagram --- .../n1ql-language-reference/alterindex.adoc | 57 ++++++++++--------- .../altervectorindex.adoc | 6 +- .../n1ql-language-reference/createindex.adoc | 38 ++++++------- .../createprimaryindex.adoc | 26 +++++---- .../createvectorindex.adoc | 10 ++-- .../n1ql-language-reference/dropindex.adoc | 32 +++++------ .../dropprimaryindex.adoc | 20 +++---- .../dropvectorindex.adoc | 4 +- .../n1ql-language-reference/vectorfun.adoc | 20 +++---- .../partials/fts-vector-app-workflow.puml | 3 + 10 files changed, 111 insertions(+), 105 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc b/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc index 30e35b50a..0ded42173 100644 --- a/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc @@ -19,7 +19,7 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] {description} The {alter-vector-index}[ALTER VECTOR INDEX] statement is a synonym for the ALTER INDEX statement. -The two statements have the same functionality. +Both statements have the same functionality. //tag::purpose[] == Purpose @@ -41,9 +41,9 @@ NOTE: The {doctitle} move operation is asynchronous. As soon as the move alter index command is executed, the command returns. If there is no error in the input, the move operation can be tracked through the console UI and any error can be found in the Console logs and Indexer logs. -If a node goes down while an {doctitle} operation is in progress, then the index would rollback to its original node (not affecting queries) and a notification would appear. +If a node goes down while an {doctitle} operation is happening, then the index would rollback to its original node (not affecting queries) and a notification would appear. -IMPORTANT: It is not possible to move an index or index replica and change the number of index replicas at the same time. +IMPORTANT: It's not possible to move an index or index replica and change the number of index replicas at the same time. //end::purpose[] @@ -51,6 +51,7 @@ IMPORTANT: It is not possible to move an index or index replica and change the n == Prerequisites Only users with the RBAC role of `Administrator` are allowed to run the `{doctitle}` directive. +//end::prerequisites[] == Syntax @@ -59,10 +60,10 @@ Only users with the RBAC role of `Administrator` are allowed to run the `{doctit include::partial$grammar/ddl.ebnf[tag=alter-index] ---- -image::n1ql-language-reference/alter-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/alter-index.png["Syntax diagram: see source code listing", align=left] //tag::syntax-arguments[] -The {doctitle} statement provides two possible syntaxes for specifying the index and the keyspace where the index is located. +The {doctitle} statement provides 2 possible syntaxes for specifying the index and the keyspace where the index is located. // TODO: Automatic links in EBNF. // FIXME: Maybe try to make consistent with DROP INDEX @@ -92,7 +93,7 @@ See <>. include::partial$grammar/ddl.ebnf[tag=index-path] ---- -image::n1ql-language-reference/index-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-path.png["Syntax diagram: see source code listing", align=left] You can use a dotted notation to specify the index and the keyspace on which the index is built. This syntax provides compatibility with legacy versions of Couchbase Server. @@ -109,7 +110,7 @@ See the examples on this page. include::partial$grammar/ddl.ebnf[tag=keyspace-full] ---- -image::n1ql-language-reference/keyspace-full.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-full.png["Syntax diagram: see source code listing", align=left] If the index is built on a named collection, the index path may be a full keyspace path, including namespace, bucket, scope, and collection, followed by the index name. In this case, the {query-context}[query context] is ignored. @@ -140,7 +141,7 @@ For example, `default:{backtick}travel-sample{backtick}.inventory.airline.{backt include::partial$grammar/ddl.ebnf[tag=keyspace-prefix] ---- -image::n1ql-language-reference/keyspace-prefix.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-prefix.png["Syntax diagram: see source code listing", align=left] If the index is built on the default collection in the default scope within a bucket, the index path may be just an optional namespace and the bucket name, followed by the index name. In this case, the {query-context}[query context] should not be set. @@ -166,7 +167,7 @@ For example, `default:{backtick}travel-sample{backtick}.def_type` indicates the include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the index path may be just the collection name, followed by the index name. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -189,7 +190,7 @@ For example, `airline.{backtick}idx-name{backtick}` indicates the `idx-name` ind include::partial$grammar/dql.ebnf[tag=keyspace-ref] ---- -image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: see source code listing", align=left] You can use the index name with the `ON` keyword and a keyspace reference to specify the keyspace on which the index is built. The keyspace reference may be a <> or a <>. @@ -205,7 +206,7 @@ See the examples on this page. include::partial$grammar/dql.ebnf[tag=keyspace-path] ---- -image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: see source code listing", align=left] If the keyspace is a named collection, or the default collection in the default scope within a bucket, the keyspace reference may be a keyspace path. In this case, the {query-context}[query context] should not be set. @@ -241,7 +242,7 @@ Similarly, `{backtick}idx-name{backtick} ON default:{backtick}travel-sample{back include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the keyspace reference may be just the collection name. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -264,7 +265,7 @@ For example, `{backtick}idx-name{backtick} ON airline` indicates the `idx-name` include::partial$grammar/ddl.ebnf[tag=index-using] ---- -image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-using.png["Syntax diagram: see source code listing", align=left] The index type for a secondary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. @@ -279,7 +280,7 @@ The `USING GSI` keywords are optional and may be omitted. include::partial$grammar/ddl.ebnf[tag=index-with] ---- -image::n1ql-language-reference/index-with.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-with.png["Syntax diagram: see source code listing", align=left] Use the `WITH` clause to specify additional options. @@ -328,8 +329,8 @@ Optional if `action` is set to `replica_count`. An array of strings, specifying a list of nodes. If `action` is set to `move`, the node list determines the new destination nodes for the index and its replicas. -If `action` is set to `replica_count` and you are increasing the number of replicas, the node list restricts the set of nodes available for placement of the index and its replicas. -However, if `action` is set to `replica_count` and you are decreasing the number of replicas, the `nodes` property is ignored. +If `action` is set to `replica_count` and you're increasing the number of replicas, the node list restricts the set of nodes available for placement of the index and its replicas. +However, if `action` is set to `replica_count` and you're decreasing the number of replicas, the `nodes` property is ignored. NOTE: You cannot use this property in Couchbase Capella, as it defaults to file-based index rebalancing. See xref:server:learn:clusters-and-availability/rebalance.adoc#index-rebalance-methods[Index Rebalance Methods]. @@ -354,7 +355,7 @@ The statement will not work while the cluster is undergoing a rebalance. === Moving an Index or Index Replicas When moving an index or index replicas, the number of destination nodes must be the same as the number of nodes on which the index and any replicas are currently placed. -You must specify the full node list, even if only one replica needs to be moved. +You must specify the full node list, even if you only need to move a single replica. Likewise, when moving a partitioned index, the number of destination nodes must be the same as the number of nodes on which the index partitions and any replicas are currently placed. You cannot use this statement to repartition an index across a different number of nodes. @@ -368,12 +369,12 @@ If the specified number of replicas is greater than or equal to the number of in If you specify a node list when changing the number of replicas, the specified nodes must include all of the nodes on which the index or index partitions and any index replicas are currently placed. -When increasing the number of replicas, whether you specify a node list or not, no single index node will host more than one replica of the same index, or the same partition of the same index. +When increasing the number of replicas, whether you specify a node list or not, no single index node will host more than 1 replica of the same index, or the same partition of the same index. Replicas are distributed across the available server groups. When reducing the number of replicas, the index service will first drop unhealthy replicas, where an unhealthy replica is a replica with missing partitions. After all unhealthy replicas are dropped, the index service will if necessary drop replicas with the highest replica ID. -An unhealthy replica may not have the highest replica ID, so after an index reduction there may be "gaps" in the sequence of replica IDs -- for example, 1, 2, 4, where replica ID 3 was dropped. +An unhealthy replica may not have the highest replica ID, so after an index reduction there may be gaps in the sequence of replica IDs -- for example, 1, 2, 4, where replica ID 3 was dropped. === Dropping a Specific Replica @@ -381,17 +382,17 @@ When dropping a replica, the index topology does not change. The indexing service remembers the number of partitions and replicas specified for this index. Given sufficient capacity, the dropped replica is rebuilt after the next rebalance -- although it may be placed on a different index node, depending on the resource usage statistics of the available nodes. -To find the ID of an index replica and see which node it is placed on, you can use the {console-indexes}[Indexes screen in the Couchbase Web Console] or query the {querying-indexes}[system:indexes] catalog. +To find the ID of an index replica and see which node it's placed on, you can use the {console-indexes}[Indexes screen in the Couchbase Web Console] or query the {querying-indexes}[system:indexes] catalog. -When dropping a replica, it is possible to leave a server group with no replica. +When dropping a replica, it's possible to leave a server group with no replica. For a partitioned index, run a rebalance to move a replica into the vacant server group. ifdef::flag-devex-rest-api[] === Index Redistribution -Using this statement to move one index at a time may be cumbersome if there are a lot of indexes to be moved. -The _index redistribution_ setting enables you to specify how Couchbase Server redistributes indexes automatically on rebalance. -Refer to {rebalancing-the-index-service}[Rebalance] for more information. +Using this statement to move 1 index at a time may be cumbersome if there are a lot of indexes to be moved. +The index redistribution setting enables you to specify how Couchbase Capella redistributes indexes automatically on rebalance. +For more information, see {rebalancing-the-index-service}[Rebalance]. endif::flag-devex-rest-api[] //end::usage[] @@ -401,7 +402,7 @@ endif::flag-devex-rest-api[] If the statement succeeds, then: * The query returns an empty array. -* The index progress is visible in the Query tab. +* The index alteration is visible in the Query tab. * After the movement is complete, the new indexes begin to service query scans. * The command line displays the new index nodes. @@ -433,8 +434,8 @@ a| | `Unable to find Index service for destination xxx.xxx.xxx.xxx:8091 or destination is not part of the cluster` a| -* Address doesn't exist or was mistyped -* Node isn't running +* Address does not exist or was mistyped +* Node is not running * Node not properly added to the cluster | `Unsupported action value` @@ -552,7 +553,7 @@ WITH {"action": "replica_count", "num_replica": 1}; .Dropping a specific replica ==== -Create an index with two replicas, and specify that nodes 192.168.10.10, 192.168.10.11, 192.168.10.12, and 192.168.10.13 should be available for index and replica placement. +Create an index with 2 replicas, and specify that nodes 192.168.10.10, 192.168.10.11, 192.168.10.12, and 192.168.10.13 should be available for index and replica placement. Then delete replica 2. [source,sqlpp] diff --git a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc index ae793da71..1386211c0 100644 --- a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc @@ -21,7 +21,7 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] {description} The {alter-index}[ALTER INDEX] statement is a synonym for the ALTER VECTOR INDEX statement. -The two statements have the same functionality. +Both statements have the same functionality. include::alterindex.adoc[tags=purpose] @@ -34,7 +34,7 @@ include::alterindex.adoc[tags=prerequisites] include::partial$grammar/ddl.ebnf[tag=alter-vector-index] ---- -image::n1ql-language-reference/alter-vector-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/alter-vector-index.png["Syntax diagram: see source code listing", align=left] include::alterindex.adoc[tags=syntax-arguments] @@ -167,7 +167,7 @@ WITH {"action": "replica_count", "num_replica": 1}; .Drop a specific replica ==== -Create a hyperscale vector index with two replicas, and specify that nodes 172.19.0.2, 172.19.0.3, and 172.19.0.4 should be available for index and replica placement. +Create a hyperscale vector index with 2 replicas, and specify that nodes 172.19.0.2, 172.19.0.3, and 172.19.0.4 should be available for index and replica placement. Then delete replica 2. [source,sqlpp] diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index d3eaf2335..315c3cfad 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -69,8 +69,8 @@ If the data set changes dramatically, you must drop and rebuild the index to upd [discrete] ===== RBAC Privileges -To execute the {doctitle} statement, you must have the _Query Manage Index_ privilege granted on the keyspace. -For more details about user roles, see +To execute the {doctitle} statement, you must have the `Query Manage Index` privilege granted on the keyspace. +For more information about user roles, see {authorization-overview}[Authorization]. include::partial$n1ql-language-reference/vector-index-no-windows.adoc[] @@ -83,7 +83,7 @@ include::partial$n1ql-language-reference/vector-index-no-windows.adoc[] include::partial$grammar/ddl.ebnf[tag=create-index] ---- -image::n1ql-language-reference/create-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/create-index.png["Syntax diagram: see source code listing", align=left] // TODO: Automatic links in EBNF. @@ -133,7 +133,7 @@ If an index with the same name already exists within the specified keyspace, the include::partial$grammar/dql.ebnf[tag=keyspace-ref] ---- -image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: see source code listing", align=left] Specifies the keyspace for which the index needs to be created. The keyspace reference may be a <> or a <>. @@ -149,7 +149,7 @@ See the examples on this page. include::partial$grammar/dql.ebnf[tag=keyspace-path] ---- -image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: see source code listing", align=left] If the keyspace is a named collection, or the default collection in the default scope within a bucket, the keyspace reference may be a keyspace path. In this case, the {query-context}[query context] should not be set. @@ -185,7 +185,7 @@ Similarly, `default:{backtick}travel-sample{backtick}.inventory.airline` indicat include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the keyspace reference may be just the collection name with no path. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -207,7 +207,7 @@ For example, `airline` indicates the `airline` collection, assuming the query co include::partial$grammar/ddl.ebnf[tag=index-keys-and-attribs] ---- -image::n1ql-language-reference/index-keys-and-attribs.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-keys-and-attribs.png["Syntax diagram: see source code listing", align=left] Secondary indexes and composite vector indexes can have many keys. Each key may have index attributes, which define the behavior of the index key. @@ -230,7 +230,7 @@ See <>. include::partial$grammar/ddl.ebnf[tag=index-key] ---- -image::n1ql-language-reference/index-key.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-key.png["Syntax diagram: see source code listing", align=left] The index key is a {sqlpp} {expression}[expression] referring to a field in the document, or an ARRAY expression on the field. @@ -262,14 +262,14 @@ For details, see {indexing-arrays}[]. include::partial$grammar/ddl.ebnf[tag=lead-key-attribs] ---- -image::n1ql-language-reference/lead-key-attribs.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/lead-key-attribs.png["Syntax diagram: see source code listing", align=left] [source,ebnf] ---- include::partial$grammar/ddl.ebnf[tag=key-attribs] ---- -image::n1ql-language-reference/key-attribs.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/key-attribs.png["Syntax diagram: see source code listing", align=left] Specifies attributes for the index key. @@ -291,7 +291,7 @@ See <>. include::partial$grammar/ddl.ebnf[tag=index-order] ---- -image::n1ql-language-reference/index-order.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-order.png["Syntax diagram: see source code listing", align=left] Specifies the sort order of the index key. For non-vector fields only. @@ -313,7 +313,7 @@ This clause is optional; if omitted, the default is `ASC`. include::partial$grammar/ddl.ebnf[tag=include-missing] ---- -image::n1ql-language-reference/include-missing.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/include-missing.png["Syntax diagram: see source code listing", align=left] The optional `INCLUDE MISSING` clause ensures that documents which do not include the index key field are indexed regardless. If this clause is not present, then documents without the index key field are not indexed. @@ -329,7 +329,7 @@ The `INCLUDE MISSING` clause may be included before or after the `ASC` or `DESC` include::partial$grammar/ddl.ebnf[tag=index-vector] ---- -image::n1ql-language-reference/index-vector.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-vector.png["Syntax diagram: see source code listing", align=left] Indicates that the index key is a vector field. @@ -355,7 +355,7 @@ See {index-training}[The Importance of Index Training]. include::partial$grammar/dql.ebnf[tag=where-clause] ---- -image::n1ql-language-reference/where-clause.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/where-clause.png["Syntax diagram: see source code listing", align=left] [horizontal#where-clause-args] cond:: @@ -371,7 +371,7 @@ Specifies WHERE clause predicates to qualify the subset of documents to include include::partial$grammar/ddl.ebnf[tag=index-using] ---- -image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-using.png["Syntax diagram: see source code listing", align=left] The index type for a secondary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. @@ -386,7 +386,7 @@ The `USING GSI` keywords are optional and may be omitted. include::partial$grammar/ddl.ebnf[tag=index-with] ---- -image::n1ql-language-reference/index-with.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-with.png["Syntax diagram: see source code listing", align=left] Use the WITH clause to specify additional options. @@ -582,7 +582,7 @@ image::create-index-replica-id.png["The Indexes screen showing an index and inde If you select `view by server node` from the drop-down menu, you can see the server node where each index and index replica is placed. -You can also query the {querying-indexes}[system:indexes] catalog to find the ID of an index replica and see which node it is placed on. +You can also query the {querying-indexes}[system:indexes] catalog to find the ID of an index replica and see which node it's placed on. [NOTE] ==== @@ -666,7 +666,7 @@ include::example$n1ql-language-reference/check-idx-defer.n1ql[] include::example$n1ql-language-reference/check-idx-defer.jsonc[] ---- -<1> Note that the index is in the deferred state. +<1> The index is in the deferred state. ==== [[ex-build-idx-defer]] @@ -694,7 +694,7 @@ include::example$n1ql-language-reference/check-idx-online.n1ql[] include::example$n1ql-language-reference/check-idx-online.jsonc[] ---- -<1> Note that the index has now been created. +<1> The index has now been created. ==== [[ex-create-idx-missing]] diff --git a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc index 30d1835c3..80e10e769 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc @@ -20,7 +20,7 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] The `CREATE PRIMARY INDEX` statement allows you to create a primary index. Primary indexes contain a full set of keys in a given keyspace. -Primary indexes are optional -- they enable you to run ad hoc queries on a keyspace that is not supported by a secondary index. +Primary indexes are optional -- they enable you to run ad hoc queries on a keyspace that's not supported by a secondary index. == Purpose @@ -44,8 +44,8 @@ See <> for more details. [discrete] ===== RBAC Privileges -To execute the `CREATE PRIMARY INDEX` statement, you must have the _Query Manage Index_ privilege granted on the keyspace. -For more details about user roles, see +To execute the `CREATE PRIMARY INDEX` statement, you must have the `Query Manage Index` privilege granted on the keyspace. +For more information about user roles, see {authorization-overview}[Authorization]. == Syntax @@ -55,7 +55,7 @@ For more details about user roles, see include::partial$grammar/ddl.ebnf[tag=create-primary-index] ---- -image::n1ql-language-reference/create-primary-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/create-primary-index.png["Syntax diagram: see source code listing", align=left] // TODO: Automatic links in EBNF. @@ -95,7 +95,7 @@ If a primary index with the same name already exists within the specified keyspa include::partial$grammar/dql.ebnf[tag=keyspace-ref] ---- -image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: see source code listing", align=left] Specifies the keyspace for which the index needs to be created. The keyspace reference may be a <> or a <>. @@ -111,7 +111,7 @@ See the examples on this page. include::partial$grammar/dql.ebnf[tag=keyspace-path] ---- -image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: see source code listing", align=left] If the keyspace is a named collection, or the default collection in the default scope within a bucket, the keyspace reference may be a keyspace path. In this case, the {query-context}[query context] should not be set. @@ -147,7 +147,7 @@ Similarly, `default:{backtick}travel-sample{backtick}.inventory.airline` indicat include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the keyspace reference may be just the collection name with no path. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -168,7 +168,7 @@ For example, `airline` indicates the `airline` collection, assuming the query co include::partial$grammar/ddl.ebnf[tag=index-using] ---- -image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-using.png["Syntax diagram: see source code listing", align=left] The index type for a primary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. @@ -181,7 +181,7 @@ The `USING GSI` keywords are optional and may be omitted. include::partial$grammar/ddl.ebnf[tag=index-with] ---- -image::n1ql-language-reference/index-with.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-with.png["Syntax diagram: see source code listing", align=left] Use the WITH clause to specify additional options. @@ -202,7 +202,7 @@ include::partial$n1ql-language-reference/file-based-index-rebalance-note.adoc[] ''' You can specify multiple nodes to distribute replicas of an index across nodes running the indexing service: for example, `WITH {"nodes": ["node1:8091", "node2:8091", "node3:8091"]}`. -For details and examples, refer to {index-replication}[Index Replication]. +For details and examples, see {index-replication}[Index Replication]. If specifying both [.var]`nodes` and [.var]`num_replica`, the number of nodes in the array must be one greater than the specified number of replicas otherwise the index creation will fail. @@ -244,10 +244,12 @@ If the value of this property is not less than the number of index nodes in the == Usage +// Nothing + === Monitoring Primary Indexes Index metadata provides a state field. -This state field and other index metadata can be queried using {querying-indexes}[system:indexes]. +You can query this state field and other index metadata using {querying-indexes}[system:indexes]. The index state may be `scheduled for creation`, `deferred`, `building`, `pending`, `online`, `offline`, or `abridged`. You can also monitor the index state using the Couchbase Web Console. @@ -269,7 +271,7 @@ You must drop the failed index using the `DROP INDEX` command. For a primary index scan on any keyspace size, the query engine guarantees that the client is not exposed to scan timeout if the indexer throws a scan timeout after it has returned a greater than zero sized subset of primary keys. To complete the scan, the query engine performs successive scans of the primary index until all the primary keys have been returned. -It is possible that the indexer throws scan timeout without returning any primary keys, and in this event the query engine returns scan timeout to the client. +It's possible that the indexer may throw scan timeout without returning any primary keys, and in this event the query engine returns scan timeout to the client. For example, if the indexer cannot find a snapshot that satisfies the consistency guarantee of the query within the timeout limit, it will timeout without returning any primary keys. diff --git a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc index 6174e2db0..cb3d2e472 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc @@ -48,7 +48,7 @@ include::createindex.adoc[tags=prerequisites] include::partial$grammar/ddl.ebnf[tag=create-vector-index] ---- -image::n1ql-language-reference/create-vector-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/create-vector-index.png["Syntax diagram: see source code listing", align=left] // TODO: Automatic links in EBNF. @@ -92,7 +92,7 @@ include::createindex.adoc[tags=keyspace-ref] include::partial$grammar/ddl.ebnf[tags=index-key-and-attrib] ---- -image::n1ql-language-reference/index-key-and-attrib.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-key-and-attrib.png["Syntax diagram: see source code listing", align=left] Hyperscale vector indexes only have one key, which must be a vector field. The index key takes one attribute, the VECTOR keyword. @@ -112,7 +112,7 @@ See <>. include::partial$grammar/ddl.ebnf[tag=index-key] ---- -image::n1ql-language-reference/index-key.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-key.png["Syntax diagram: see source code listing", align=left] The index key is a {sqlpp} {expression}[expression] referring to a vector field, or an ARRAY expression on the vector field. @@ -135,7 +135,7 @@ For details, see {indexing-arrays}[]. include::partial$grammar/ddl.ebnf[tag=index-vector] ---- -image::n1ql-language-reference/index-vector.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-vector.png["Syntax diagram: see source code listing", align=left] Indicates that the index key is a vector field. @@ -147,7 +147,7 @@ Indicates that the index key is a vector field. include::partial$grammar/ddl.ebnf[tag=index-include] ---- -image::n1ql-language-reference/index-include.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-include.png["Syntax diagram: see source code listing", align=left] Used to include scalar fields in the index, which you can use to filter the vector search. The INCLUDE clause cannot include a vector field. diff --git a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc index 81dbb3ff9..2db0419e1 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc @@ -19,7 +19,7 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] Dropping an index that has replicas will drop all of the replica indexes too. The {drop-vector-index}[DROP VECTOR INDEX] statement is a synonym for the DROP INDEX statement. -The two statements have the same functionality. +Both statements have the same functionality. [NOTE] To drop a primary index, use the {drop-primary-index}[DROP PRIMARY INDEX] statement. @@ -31,8 +31,8 @@ For compatibility with legacy versions of Couchbase Server, you can also use DRO [discrete] ===== RBAC Privileges -To use the {doctitle} statement, you must have the _Query Manage Index_ privilege on the keyspace or bucket. -For more details about user roles, see +To use the {doctitle} statement, you must have the `Query Manage Index` privilege on the keyspace or bucket. +For more information about user roles, see {authorization-overview}[Authorization]. // end::prerequisites[] @@ -43,7 +43,7 @@ For more details about user roles, see include::partial$grammar/ddl.ebnf[tag=drop-index] ---- -image::n1ql-language-reference/drop-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/drop-index.png["Syntax diagram: see source code listing", align=left] //tag::syntax-arguments[] The {doctitle} statement provides two possible syntaxes for specifying the index and the keyspace where the index is located. @@ -70,7 +70,7 @@ See <>. include::partial$grammar/ddl.ebnf[tag=index-path-and-name] ---- -image::n1ql-language-reference/index-path-and-name.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-path-and-name.png["Syntax diagram: see source code listing", align=left] You can use a dotted notation to specify the index and the keyspace on which the index is built. This syntax provides compatibility with legacy versions of Couchbase Server. @@ -91,7 +91,7 @@ See the examples on this page. include::partial$grammar/ddl.ebnf[tag=index-path] ---- -image::n1ql-language-reference/index-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-path.png["Syntax diagram: see source code listing", align=left] The index path may be a <>, a <>, or a <>. @@ -103,7 +103,7 @@ The index path may be a <>, a <>, or include::partial$grammar/ddl.ebnf[tag=keyspace-full] ---- -image::n1ql-language-reference/keyspace-full.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-full.png["Syntax diagram: see source code listing", align=left] If the index is built on a named collection, the index path may be a full keyspace path, including namespace, bucket, scope, and collection, followed by the index name. In this case, the {query-context}[query context] is ignored. @@ -134,7 +134,7 @@ For example, `default:{backtick}travel-sample{backtick}.inventory.airline.{backt include::partial$grammar/ddl.ebnf[tag=keyspace-prefix] ---- -image::n1ql-language-reference/keyspace-prefix.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-prefix.png["Syntax diagram: see source code listing", align=left] If the index is built on the default collection in the default scope within a bucket, the index path may be just an optional namespace and the bucket name, followed by the index name. In this case, the {query-context}[query context] should not be set. @@ -160,7 +160,7 @@ For example, `default:{backtick}travel-sample{backtick}.def_type` indicates the include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the index path may be just the collection name, followed by the index name. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -181,7 +181,7 @@ For example, `airline.{backtick}idx-name{backtick}` indicates the `idx-name` ind include::partial$grammar/ddl.ebnf[tags=index-name-on-keyspace] ---- -image::n1ql-language-reference/index-name-on-keyspace.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-name-on-keyspace.png["Syntax diagram: see source code listing", align=left] You can use the index name with the `ON` keyword and a keyspace reference to specify the index and the keyspace on which the index is built. @@ -201,7 +201,7 @@ See the examples on this page. include::partial$grammar/dql.ebnf[tag=keyspace-ref] ---- -image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: see source code listing", align=left] The keyspace reference may be a <> or a <>. @@ -213,7 +213,7 @@ The keyspace reference may be a <> or a <>. include::partial$grammar/dql.ebnf[tag=keyspace-path] ---- -image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: see source code listing", align=left] If the keyspace is a named collection, or the default collection in the default scope within a bucket, the keyspace reference may be a keyspace path. In this case, the {query-context}[query context] should not be set. @@ -249,7 +249,7 @@ Similarly, `{backtick}idx-name{backtick} ON default:{backtick}travel-sample{back include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the keyspace reference may be just the collection name. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -267,7 +267,7 @@ For example, `{backtick}idx-name{backtick} ON airline` indicates the `idx-name` [[if-exists]] === IF EXISTS Clause -The optional `IF EXISTS` clause enables the statement to complete successfully when the specified index doesn't exist. +The optional `IF EXISTS` clause enables the statement to complete successfully when the specified index does not exist. If the index does not exist within the specified keyspace, then: * If this clause is not present, an error is generated. @@ -284,7 +284,7 @@ If the index does not exist within the specified keyspace, then: include::partial$grammar/ddl.ebnf[tag=index-using] ---- -image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-using.png["Syntax diagram: see source code listing", align=left] The index type for a secondary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. @@ -327,7 +327,7 @@ Once the index creation statement comes back, query `system:indexes` for the sta include::example$n1ql-language-reference/drop-idx-default.n1ql[tag=tmp] ---- -Subsequently, drop the index and check that it is no longer reported in the `system:indexes` output. +Subsequently, drop the index and check that it's no longer reported in the `system:indexes` output. [source,sqlpp] ---- diff --git a/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc index 4ef21a6ba..3fa919115 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropprimaryindex.adoc @@ -21,8 +21,8 @@ NOTE: For compatibility with legacy versions of Couchbase Server, you can also u [discrete] ===== RBAC Privileges -To execute the DROP PRIMARY INDEX statement, you must have the _Query Manage Index_ privilege granted on the keyspace. -For more details about user roles, see {roles}[Roles]. +To execute the DROP PRIMARY INDEX statement, you must have the `Query Manage Index` privilege granted on the keyspace. +For more information about user roles, see {roles}[Roles]. == Syntax @@ -31,13 +31,13 @@ For more details about user roles, see {roles}[Roles]. include::partial$grammar/ddl.ebnf[tag=drop-primary-index] ---- -image::n1ql-language-reference/drop-primary-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/drop-primary-index.png["Syntax diagram: see source code listing", align=left] // TODO: Automatic links in EBNF. [horizontal] index-name:: (Optional) A unique name that identifies the index. -If you don't specify a name, the index with the default name of `#primary` is deleted. +If you do not specify a name, the index with the default name of `#primary` is deleted. keyspace-ref:: (Required) Specifies the keyspace where the index is located. See <>. @@ -48,7 +48,7 @@ See <>. [[if-exists]] === IF EXISTS Clause -The optional `IF EXISTS` clause enables the statement to complete successfully when the specified primary index doesn't exist. +The optional `IF EXISTS` clause enables the statement to complete successfully when the specified primary index does not exist. If the primary index does not exist within the specified keyspace, then: * If this clause is not present, an error is generated. @@ -63,7 +63,7 @@ If the primary index does not exist within the specified keyspace, then: include::partial$grammar/dql.ebnf[tag=keyspace-ref] ---- -image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-ref.png["Syntax diagram: see source code listing", align=left] Specifies the keyspace for the primary index to drop. The keyspace reference may be a <> or a <>. @@ -79,7 +79,7 @@ See the examples on this page. include::partial$grammar/dql.ebnf[tag=keyspace-path] ---- -image::n1ql-language-reference/keyspace-path.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-path.png["Syntax diagram: see source code listing", align=left] If the keyspace is a named collection, or the default collection in the default scope within a bucket, the keyspace reference may be a keyspace path. In this case, the {query-context}[query context] should not be set. @@ -115,7 +115,7 @@ Similarly, `default:{backtick}travel-sample{backtick}.inventory.airline` indicat include::partial$grammar/dql.ebnf[tag=keyspace-partial] ---- -image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/keyspace-partial.png["Syntax diagram: see source code listing", align=left] Alternatively, if the keyspace is a named collection, the keyspace reference may be just the collection name with no path. In this case, you must set the {query-context}[query context] to indicate the required namespace, bucket, and scope. @@ -136,7 +136,7 @@ For example, `airline` indicates the `airline` collection, assuming the query co include::partial$grammar/ddl.ebnf[tag=index-using] ---- -image::n1ql-language-reference/index-using.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/index-using.png["Syntax diagram: see source code listing", align=left] The index type for a primary index must be Global Secondary Index (GSI). The `USING GSI` keywords are optional and may be omitted. @@ -155,7 +155,7 @@ Once the index creation statement comes back, query `system:indexes` for status include::example$n1ql-language-reference/create-pri-nameless.n1ql[tags=**] ---- -Subsequently, drop the unnamed primary index with the following statement so that it is no longer reported in the `system:indexes` output. +Subsequently, drop the unnamed primary index with the following statement so that it's no longer reported in the `system:indexes` output. [source,sqlpp] ---- diff --git a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc index ba3442aca..38cf96d94 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc @@ -20,7 +20,7 @@ include::partial$n1ql-language-reference/horizontal-style.adoc[] Dropping an index that has replicas will drop all of the replica indexes too. The {drop-index}[DROP INDEX] statement is a synonym for the DROP VECTOR INDEX statement. -The two statements have the same functionality. +Both statements have the same functionality. [NOTE] To drop a primary index, use the {drop-primary-index}[DROP PRIMARY INDEX] statement. @@ -35,7 +35,7 @@ include::dropindex.adoc[tags=prerequisites] include::partial$grammar/ddl.ebnf[tag=drop-vector-index] ---- -image::n1ql-language-reference/drop-vector-index.png["Syntax diagram: refer to source code listing", align=left] +image::n1ql-language-reference/drop-vector-index.png["Syntax diagram: see source code listing", align=left] include::dropindex.adoc[tags=syntax-arguments] diff --git a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc index c25d098b7..9f82a3d19 100644 --- a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc @@ -10,7 +10,7 @@ [abstract] {description} -Vector functions include similarity functions to find the distance between two vectors, functions that check for a vector value, and functions that transform vector values. +Vector functions include similarity functions to find the distance between two vectors, functions that check for a vector value, and functions that modify vector values. For more information about vectors and vector indexes, see xref:vector-index:vectors-and-indexes-overview.adoc[]. @@ -26,7 +26,7 @@ Finds the approximate distance between a provided vector and the content of a sp This function works best with a hyperscale vector index or composite vector index. If a query contains this function, and all of the following are true: -* There is a hyperscale vector index or a composite vector index with a vector index key which is the same as the vector field referenced by the function +* The cluster has a hyperscale vector index or a composite vector index with a vector index key which is the same as the vector field referenced by the function * The vector index key uses a similarity setting which is the same as the distance metric referenced by the function @@ -234,7 +234,7 @@ include::vector-index:example$hyperscale-idx-data.json[tag=exact-query-results] ---- Compare this with the result of <>. -In this case, the approximate vector distance does not give very accurate results. +In this case, the approximate vector distance does not give accurate results. ==== [#approx_vector_distance_ex_nprobe] @@ -284,7 +284,7 @@ The query returns 3 colors where the embedded vector associated with the color d include::vector-index:example$hyperscale-idx-data.json[tag=rerank-after] ---- -For more details and examples, see xref:vector-index:hyperscale-reranking.adoc[]. +For more information and examples, see xref:vector-index:hyperscale-reranking.adoc[]. ==== [[decode_vector,DECODE_VECTOR()]] @@ -301,8 +301,8 @@ Reverses the encoding done by the <> function. vector:: String, or any {sqlpp} expression that evaluates to a string, representing the base64 encoding of a vector value. byte_order:: [Optional] A boolean which determines the byte order of the vector value. -If `true`, it is big-endian. -If `false`, it is little-endian. +If `true`, it's big-endian. +If `false`, it's little-endian. The default is `false`. === Return Value @@ -359,8 +359,8 @@ Returns the https://en.wikipedia.org/wiki/Base64[base64] encoding of a vector va vector:: An array of floating point numbers, or any {sqlpp} expression that evaluates to an array of floating point numbers. byte_order:: [Optional] A boolean which determines the byte order of the vector value. -If `true`, it is big-endian. -If `false`, it is little-endian. +If `true`, it's big-endian. +If `false`, it's little-endian. The default is `false`. === Return Value @@ -402,7 +402,7 @@ SELECT ENCODE_VECTOR([1, 2, 3, 4]) AS little_endian, === Description Checks if the supplied expression is an array of floating point numbers with the specified number of dimensions. -This can be used to determine whether a field contains contains a vector value. +This can be used to determine whether a field contains a vector value. === Arguments @@ -656,7 +656,7 @@ The query returns 10 colors where the embedded vector associated with the color include::vector-index:example$hyperscale-idx-data.json[tag=exact-query-results] ---- -For more details and examples, see xref:vector-index:vector-index-best-practices.adoc#recall-accuracy[Determine Recall Rate]. +For more information and examples, see xref:vector-index:vector-index-best-practices.adoc#recall-accuracy[Determine Recall Rate]. ==== [#aliases] diff --git a/modules/vector-index/partials/fts-vector-app-workflow.puml b/modules/vector-index/partials/fts-vector-app-workflow.puml index d7948cd4d..e3c54567f 100644 --- a/modules/vector-index/partials/fts-vector-app-workflow.puml +++ b/modules/vector-index/partials/fts-vector-app-workflow.puml @@ -58,6 +58,9 @@ Models -> Logic: Vector deactivate Models autonumber resume Logic -> Search: Search +' It's actually a self call from the Search Service +' But this way the alignment is neater +Data -[#transparent]> Data: Index Scan Search -> Logic:Results deactivate Search deactivate Logic From 6ec601dfc892c2c42c93731dc33e5bb9de5f132f Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Tue, 7 Oct 2025 21:26:38 +0100 Subject: [PATCH 65/80] DOC-12464 Incorporate Vector Search in the Vector Index section (#443) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Rename Vector Indexes top-level topic * Rename Choose the Right Vector Index topic * An Search Vector → a Search Vector * Make vector index topic names consistent * Simplify xrefs in nav --- .../vector-index/pages/composite-vector-index.adoc | 2 +- .../pages/hyperscale-vector-index.adoc | 2 +- modules/vector-index/pages/use-vector-indexes.adoc | 8 ++++---- .../pages/vectors-and-indexes-overview.adoc | 2 +- modules/vector-index/partials/nav.adoc | 14 +++++++------- modules/vector-search/pages/vector-search.adoc | 2 +- 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/vector-index/pages/composite-vector-index.adoc b/modules/vector-index/pages/composite-vector-index.adoc index 5bf59cf0a..0755c0c27 100644 --- a/modules/vector-index/pages/composite-vector-index.adoc +++ b/modules/vector-index/pages/composite-vector-index.adoc @@ -1,4 +1,4 @@ -= Filtered Searches Using Composite Vector Index += Filtered Search Using Composite Vector Indexes :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc index 9ca86667a..7e2ba600f 100644 --- a/modules/vector-index/pages/hyperscale-vector-index.adoc +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -1,4 +1,4 @@ -= Vector Searches Using Hyperscale Vector Indexes += Vector Search Using Hyperscale Vector Indexes :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc index a1a2cf769..69d57a827 100644 --- a/modules/vector-index/pages/use-vector-indexes.adoc +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -1,4 +1,4 @@ -= Use Vector Indexes for AI Applications += Choose the Right Vector Index :page-topic-type: concept :page-ui-name: {ui-name} :page-product-name: {product-name} @@ -142,7 +142,7 @@ When choosing which type of index to use, consider the following: * In most cases, test using a Hyperscale Vector index. If you find that the performance is not what you need, you can try using one of the other index types. -* If your dataset will not grow beyond 100 million documents and you need to perform hybrid searches that combine vector searches with Full-Text Search or geospatial searches, use an Search Vector Index. +* If your dataset will not grow beyond 100 million documents and you need to perform hybrid searches that combine vector searches with other Search Service features, such as text or geospatial search, use a Search Vector Index. == Applications for Vector Indexes @@ -256,14 +256,14 @@ Users often want to search for hotels using multiple criteria: * Semantic searches of descriptions and reviews for searches that do not rely on literal text matches, such as "modern beach resort with chic décor," which requires vector searches. + -An Search Vector Index can combine geospatial, keyword, and semantic searches into a single index. +A Search Vector Index can combine geospatial, keyword, and semantic searches into a single index. Real estate searches:: Real estate applications can use Search Vector Indexes to find properties within a search region and have floor plan similar to an uploaded image. === Search Vector Index Application Workflow -To create and use an Search Vector Index, your application follows the workflow shown in the following diagram: +To create and use a Search Vector Index, your application follows the workflow shown in the following diagram: .Application Workflow with Search Vector Indexes [plantuml,fts-app-workflow,svg] diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc index eaeddd904..10a346721 100644 --- a/modules/vector-index/pages/vectors-and-indexes-overview.adoc +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -1,4 +1,4 @@ -= Vectors and Vector Indexes += Use Vector Indexes for AI Applications :page-topic-type: concept :page-ui-name: {ui-name} :stem: latexmath diff --git a/modules/vector-index/partials/nav.adoc b/modules/vector-index/partials/nav.adoc index eab2f8610..333f991de 100644 --- a/modules/vector-index/partials/nav.adoc +++ b/modules/vector-index/partials/nav.adoc @@ -1,12 +1,12 @@ -* xref:server:vector-index:vectors-and-indexes-overview.adoc[] +* xref:vector-index:vectors-and-indexes-overview.adoc[] + -- -** xref:server:vector-index:use-vector-indexes.adoc[] -** xref:server:vector-index:hyperscale-vector-index.adoc[] -*** xref:server:vector-index:hyperscale-filter.adoc[] -*** xref:server:vector-index:hyperscale-reranking.adoc[] -** xref:server:vector-index:composite-vector-index.adoc[] -** xref:server:vector-index:vector-index-best-practices.adoc[] +** xref:vector-index:use-vector-indexes.adoc[] +** xref:vector-index:hyperscale-vector-index.adoc[] +*** xref:vector-index:hyperscale-filter.adoc[] +*** xref:vector-index:hyperscale-reranking.adoc[] +** xref:vector-index:composite-vector-index.adoc[] +** xref:vector-index:vector-index-best-practices.adoc[] -- + -- diff --git a/modules/vector-search/pages/vector-search.adoc b/modules/vector-search/pages/vector-search.adoc index afebe509f..f8ceade7c 100644 --- a/modules/vector-search/pages/vector-search.adoc +++ b/modules/vector-search/pages/vector-search.adoc @@ -1,4 +1,4 @@ -= Use Vector Search for AI Applications += Vector Search Using Search Vector Indexes :page-topic-type: concept :page-ui-name: {ui-name} :page-product-name: {product-name} From d57b084b4c5e7edd7b47544c30b761d3b36f5563 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Mon, 13 Oct 2025 12:25:43 +0100 Subject: [PATCH 66/80] DOC-13622: Update GSI Vector Index docs after review (#447) * Explain how the appropriate index is selected * Explain all ANN_DISTANCE arguments in Hyperscale Vector index guide * Index Service not Query Service * ORDER BY not GROUP BY * Similarity is optional * Description is optional * Composite Vector index with leading scalar key * HVI and CVI are supported on Windows * Include persist_full_vector * Remove trailing spaces * Scan for typos * Capitalization of Hyperscale Vector and Composite Vector * Examples on this page * Remove feature branch preview config --- .../pages/indexing-and-query-perf.adoc | 4 +- .../altervectorindex.adoc | 12 +- .../n1ql-language-reference/build-index.adoc | 2 +- .../n1ql-language-reference/createindex.adoc | 60 ++++--- .../createvectorindex.adoc | 20 +-- .../n1ql-language-reference/dropindex.adoc | 4 +- .../dropvectorindex.adoc | 6 +- .../n1ql-language-reference/vectorfun.adoc | 24 +-- .../vector-index-no-windows.adoc | 5 - .../examples/gsi-vector-idx-examples.sqlpp | 6 + .../pages/composite-vector-index.adoc | 157 +++++++++++------- .../vector-index/pages/hyperscale-filter.adoc | 10 +- .../pages/hyperscale-vector-index.adoc | 111 +++++++------ .../pages/use-vector-indexes.adoc | 29 ++-- .../pages/vector-index-best-practices.adoc | 8 +- .../pages/vectors-and-indexes-overview.adoc | 131 ++++++++------- .../partials/index-algorithm-settings.adoc | 40 ++--- preview/DOC-12294-GSI-vector-index.yml | 5 - 18 files changed, 341 insertions(+), 293 deletions(-) delete mode 100644 modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc delete mode 100644 preview/DOC-12294-GSI-vector-index.yml diff --git a/modules/indexes/pages/indexing-and-query-perf.adoc b/modules/indexes/pages/indexing-and-query-perf.adoc index 6a4a187ca..58873efca 100644 --- a/modules/indexes/pages/indexing-and-query-perf.adoc +++ b/modules/indexes/pages/indexing-and-query-perf.adoc @@ -588,7 +588,7 @@ For further details and examples, see {covering-indexes}[]. [#hyperscale-vector-index] == Hyperscale Vector Index -Hyperscale vector indexes are a type of <> which contain a single vector field. +Hyperscale Vector indexes are a type of <> which contain a single vector field. They excel at indexing huge datasets that can scale into the billions of documents. They're optimized for pure vector searches, offering the highest performance of any index for your AI applications. @@ -597,7 +597,7 @@ For further details and examples, see {hyperscale-vector-index}[]. [#composite-vector-index] == Composite Vector Index -Composite vector indexes are a type of <> which contain a single vector field and one or more scalar fields. +Composite Vector indexes are a type of <> which contain a single vector field and one or more scalar fields. Your AI applications can use the index's scalar fields to filter the dataset before performing a vector similarity search. For further details and examples, see {composite-vector-index}[]. diff --git a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc index 1386211c0..2aecc2c00 100644 --- a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc @@ -66,7 +66,7 @@ For more information, see xref:n1ql:n1ql-intro/queriesandresults.adoc#query-cont .Create and move an index from one node to another ==== -Create a hyperscale vector index on node 172.19.0.2. +Create a Hyperscale Vector index on node 172.19.0.2. [source,sqlpp] ---- @@ -91,7 +91,7 @@ To check the node where the index is located, see xref:manage:manage-indexes/man .Create and move an index replica from one node to another ==== -Create a hyperscale vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then move its replica from node 172.19.0.*3* to 172.19.0.*4*. +Create a Hyperscale Vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then move its replica from node 172.19.0.*3* to 172.19.0.*4*. [source,sqlpp] ---- @@ -109,7 +109,7 @@ WITH {"action": "move", "nodes": ["172.19.0.2:8091", "172.19.0.4:8091"]}; .Increase the number of replicas ==== -Create a hyperscale vector index on node 172.19.0.2 with a replica on nodes 172.19.0.*3*, then increase the number of replicas to 2 and specify that new replicas may be placed on any available index nodes in the cluster. +Create a Hyperscale Vector index on node 172.19.0.2 with a replica on nodes 172.19.0.*3*, then increase the number of replicas to 2 and specify that new replicas may be placed on any available index nodes in the cluster. [source,sqlpp] ---- @@ -127,7 +127,7 @@ WITH {"action": "replica_count", "num_replica": 2}; .Increase the number of replicas and specify the nodes ==== -Create a hyperscale vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then increase the number of replicas to 2, and specify that replicas may be placed on nodes 172.19.0.*3* and 172.19.0.*4*. +Create a Hyperscale Vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then increase the number of replicas to 2, and specify that replicas may be placed on nodes 172.19.0.*3* and 172.19.0.*4*. [source,sqlpp] ---- @@ -149,7 +149,7 @@ WITH {"action": "replica_count", .Decrease the number of replicas ==== -Create a hyperscale vector index on node 172.19.0.2 with replicas on nodes 172.19.0.*3* and 172.19.0.*4*, then decrease the number of replicas to 1. +Create a Hyperscale Vector index on node 172.19.0.2 with replicas on nodes 172.19.0.*3* and 172.19.0.*4*, then decrease the number of replicas to 1. [source,sqlpp] ---- @@ -167,7 +167,7 @@ WITH {"action": "replica_count", "num_replica": 1}; .Drop a specific replica ==== -Create a hyperscale vector index with 2 replicas, and specify that nodes 172.19.0.2, 172.19.0.3, and 172.19.0.4 should be available for index and replica placement. +Create a Hyperscale Vector index with 2 replicas, and specify that nodes 172.19.0.2, 172.19.0.3, and 172.19.0.4 should be available for index and replica placement. Then delete replica 2. [source,sqlpp] diff --git a/modules/n1ql/pages/n1ql-language-reference/build-index.adoc b/modules/n1ql/pages/n1ql-language-reference/build-index.adoc index d54a5a3b6..2aa0eb4d6 100644 --- a/modules/n1ql/pages/n1ql-language-reference/build-index.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/build-index.adoc @@ -52,7 +52,7 @@ If any of the indexes specified by BUILD INDEX have already been built, BUILD IN When building an index which has automatic index replicas, all of the replicas are also built as part of the BUILD INDEX statement, without having to manually specify them. -Hyperscale vector indexes and composite vector indexes require a codebook for the vector field. +Hyperscale Vector indexes and Composite Vector indexes require a codebook for the vector field. The codebook is the result of sampling the dataset and is saved as part of the index metadata. The codebook is created as part of the BUILD INDEX process, and is not incrementally updated. diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index 315c3cfad..890ba404a 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -4,7 +4,7 @@ :page-toclevels: 2 :imagesdir: ../../assets/images :keywords: secondary, index, placement -:description: The CREATE INDEX statement allows you to create secondary indexes and composite vector indexes. +:description: The CREATE INDEX statement allows you to create secondary indexes and Composite Vector indexes. :authorization-overview: xref:server:learn:security/authorization-overview.adoc :index-replication: xref:indexes:index-replication.adoc#index-replication @@ -35,8 +35,8 @@ The `CREATE INDEX` statement allows you to create secondary indexes. Secondary indexes contain a filtered or a full set of keys in a given keyspace. Secondary indexes are optional but increase query efficiency on a keyspace. -In clusters running Couchbase Server 8.0 and later, the `CREATE INDEX` statement also allows you to create composite vector indexes. -To create hyperscale vector indexes, use the {create-vector-index}[CREATE VECTOR INDEX] statement. +In clusters running Couchbase Server 8.0 and later, the `CREATE INDEX` statement also allows you to create Composite Vector indexes. +To create Hyperscale Vector indexes, use the {create-vector-index}[CREATE VECTOR INDEX] statement. //tag::purpose[] == Purpose @@ -56,7 +56,7 @@ You can create multiple identical secondary indexes on a keyspace and place them The recommended way to do this is using the `num_replica` option. See <> for more details. -Hyperscale vector indexes and composite vector indexes require a codebook for the vector field. +Hyperscale Vector indexes and Composite Vector indexes require a codebook for the vector field. The codebook is the result of sampling the dataset and is saved as part of the index metadata. The codebook is created as part of the {build-index}[BUILD INDEX] process, and is not incrementally updated. @@ -72,8 +72,6 @@ If the data set changes dramatically, you must drop and rebuild the index to upd To execute the {doctitle} statement, you must have the `Query Manage Index` privilege granted on the keyspace. For more information about user roles, see {authorization-overview}[Authorization]. - -include::partial$n1ql-language-reference/vector-index-no-windows.adoc[] //end::prerequisites[] == Syntax @@ -209,7 +207,7 @@ include::partial$grammar/ddl.ebnf[tag=index-keys-and-attribs] image::n1ql-language-reference/index-keys-and-attribs.png["Syntax diagram: see source code listing", align=left] -Secondary indexes and composite vector indexes can have many keys. +Secondary indexes and Composite Vector indexes can have many keys. Each key may have index attributes, which define the behavior of the index key. [horizontal] @@ -234,7 +232,7 @@ image::n1ql-language-reference/index-key.png["Syntax diagram: see source code li The index key is a {sqlpp} {expression}[expression] referring to a field in the document, or an ARRAY expression on the field. -For a composite vector index, one index key must refer to a vector field in the document. +For a Composite Vector index, one index key must refer to a vector field in the document. The index key that refers to a vector field may be the only index key. If there are multiple index keys, the index key referring to the vector field may be any of the index keys, including the leading index key. @@ -280,7 +278,7 @@ See <>. include-missing:: (Optional) If the leading index key is a non-vector field, it may also include the `INCLUDE MISSING` clause. See <>. -include-vector:: (Optional) In a composite vector index, one index key must include the `VECTOR` keyword. +include-vector:: (Optional) In a Composite Vector index, one index key must include the `VECTOR` keyword. See <>. [[index-order]] @@ -341,7 +339,7 @@ Used to partition the index. Index partitioning helps increase the query performance by dividing and spreading a large index of documents across multiple nodes, horizontally scaling out an index as needed. For details, see {index-partitioning}[Index Partitioning]. -With hyperscale vector indexes and composite vector indexes, training is done for each index node independently, and the codebook is provided to all partitions on that node. +With Hyperscale Vector indexes and Composite Vector indexes, training is done for each index node independently, and the codebook is provided to all partitions on that node. If there are multiple partitions for an index on a node, training is only done once for all partitions. See {index-training}[The Importance of Index Training]. //end::index-partition[] @@ -394,7 +392,7 @@ Use the WITH clause to specify additional options. expr:: An object with the following properties. -[options="header", cols="1a,4a,1a"] +[options="header", cols="3a,8a,2a"] |=== |Name|Description|Schema @@ -446,9 +444,9 @@ If the value of this property is not less than the number of index nodes in the //end::index-with[] |=== -Composite vector indexes support the following additional options. +Composite Vector indexes support the following additional options. -[options="header", cols="1a,4a,1a"] +[options="header", cols="3a,8a,2a"] |=== |Name|Description|Schema //tag::index-with[] @@ -460,7 +458,7 @@ The embedded model you use to embed the vectors determines the number of dimensi |Integer |**similarity** + -__required__ +__optional__ | Sets the distance metric to use when comparing vectors during index creation. Couchbase {product-name} uses the following strings to represent the distance metrics: @@ -474,10 +472,12 @@ L2_SQUARED:: EUCLIDEAN_SQUARED:: xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean Squared Distance] For the greatest accuracy, use the distance metric you plan to use to query the data. + +**Default:** `L2_SQUARED` |String |**description** + -__required__ +__optional__ | The settings for the quantization and index algorithms. The string is made up of the following settings: @@ -488,7 +488,9 @@ PQ:: For product quantization -- the number of subquantizers, and the number of For more information, see {algo-settings}[Quantization and Centroid Settings]. +[%hardbreaks] **Pattern:** `^IVF[0-9]*,(SQ[468]|PQ[0-9]+x[0-9]+)$` +**Default:** `IVF,SQ8` |String |**scan_nprobes** + @@ -509,7 +511,7 @@ Otherwise, the default value is 10% of the index count, or 10{nbsp}× the n **Maximum:** `1000000` |Integer -ifeval::["{docname}" == "createvectorindex"] +ifeval::["{docname}" == "n1ql-language-reference/createvectorindex"] |**persist_full_vector** + __optional__ | If `true` (the default), the index stores the full vector value in addition to the quantized value. @@ -533,7 +535,7 @@ See {index-partitioning}[]. [IMPORTANT] .Attention ==== -Do not create (or drop) secondary indexes, composite vector indexes, or hyperscale vector indexes when any Index service node is down, as this may result in duplicate index names. +Do not create (or drop) secondary indexes, Composite Vector indexes, or Hyperscale Vector indexes when any Index service node is down, as this may result in duplicate index names. ==== //end::usage[] @@ -591,7 +593,7 @@ The system automatically load-balances an index scan across the index and all it Adding index replicas enables you to scale scan throughput, in addition to providing high availability. ==== -With hyperscale vector indexes and composite vector indexes, training is done by each replica index independently, and the codebook is stored as part of index metadata. +With Hyperscale Vector indexes and Composite Vector indexes, training is done by each replica index independently, and the codebook is stored as part of index metadata. See {index-training}[The Importance of Index Training]. //end::index-replicas[] @@ -720,12 +722,12 @@ For more examples of indexes where the leading key may be missing, see xref:n1ql ==== [[ex-create-rgb-idx]] -.Create a composite vector index +.Create a Composite Vector index ==== For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. The path to the required keyspace is specified by the query, so you do not need to set the query context. -Create a composite vector index that indexes the vector field named `colorvect_l2`, as well as the scalar `color` and `brightness` fields. +Create a Composite Vector index that indexes the vector field named `colorvect_l2`, as well as the scalar `color` and `brightness` fields. [source,sqlpp] ---- @@ -734,12 +736,12 @@ include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-rgb-idx] ==== [[ex-create-vectors-idx]] -.Create a composite vector index using embedded vectors +.Create a Composite Vector index using embedded vectors ==== For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. The path to the required keyspace is specified by the query, so you do not need to set the query context. -Create a composite vector index that indexes the vector field named `embedding-vector-dot`, as well as the scalar `color` and `brightness` fields. +Create a Composite Vector index that indexes the vector field named `embedding-vector-dot`, as well as the scalar `color` and `brightness` fields. [source,sqlpp] ---- @@ -747,6 +749,20 @@ include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-i ---- ==== +[[ex-create-colors-idx]] +.Create a Composite Vector index with a scalar leading key +==== +For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +The path to the required keyspace is specified by the query, so you do not need to set the query context. + +Create a Composite Vector index that indexes the scalar `color` and `brightness` fields, as well as the vector field named `embedding-vector-dot`. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-colors-idx] +---- +==== + == Related Links * xref:indexes:indexing-overview.adoc[] diff --git a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc index cb3d2e472..babcd9665 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc @@ -4,7 +4,7 @@ :page-toclevels: 2 :imagesdir: ../../assets/images :keywords: secondary, index, placement -:description: The CREATE VECTOR INDEX statement allows you to create hyperscale vector indexes. +:description: The CREATE VECTOR INDEX statement allows you to create Hyperscale Vector indexes. :authorization-overview: xref:learn:security/authorization-overview.adoc :index-replication: xref:indexes:index-replication.adoc#index-replication @@ -33,9 +33,9 @@ // TEMP include::partial$n1ql-language-reference/horizontal-style.adoc[] -The `CREATE VECTOR INDEX` statement allows you to create hyperscale vector indexes. +The `CREATE VECTOR INDEX` statement allows you to create Hyperscale Vector indexes. -To create secondary indexes or composite vector indexes, use the {create-index}[CREATE INDEX] statement. +To create secondary indexes or Composite Vector indexes, use the {create-index}[CREATE INDEX] statement. include::createindex.adoc[tags=purpose] @@ -94,7 +94,7 @@ include::partial$grammar/ddl.ebnf[tags=index-key-and-attrib] image::n1ql-language-reference/index-key-and-attrib.png["Syntax diagram: see source code listing", align=left] -Hyperscale vector indexes only have one key, which must be a vector field. +Hyperscale Vector indexes only have one key, which must be a vector field. The index key takes one attribute, the VECTOR keyword. [horizontal] @@ -178,11 +178,11 @@ include::createindex.adoc[tags=defer-index-builds-by-default] To try the examples in this section, you must install the vector sample data as described in {prerequisites}[Prerequisites]. [[ex-create-rgb-idx]] -.Create a hyperscale vector index +.Create a Hyperscale Vector index ==== For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. -Create a hyperscale vector index for the vector column named `embedding-vector-dot`. +Create a Hyperscale Vector index for the vector column named `embedding-vector-dot`. [source,sqlpp] ---- @@ -191,11 +191,11 @@ include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-rgb-idx] ==== [[ex-create-idx-brightness]] -.Create a hyperscale vector index with included scalar values +.Create a Hyperscale Vector index with included scalar values ==== For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. -Create a hyperscale vector index for the vector column named `embedding-vector-dot`, including the scalar `brightness` field. +Create a Hyperscale Vector index for the vector column named `embedding-vector-dot`, including the scalar `brightness` field. [source,sqlpp] ---- @@ -204,11 +204,11 @@ include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-idx-brigh ==== [[ex-create-rgb-no-persist]] -.Create a hyperscale vector index with no reranking +.Create a Hyperscale Vector index with no reranking ==== For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. -Create a hyperscale vector index from the example RGB dataset that does not persist the full vector value. +Create a Hyperscale Vector index from the example RGB dataset that does not persist the full vector value. [source,sqlpp] ---- diff --git a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc index 2db0419e1..faead2943 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropindex.adoc @@ -1,5 +1,5 @@ = DROP INDEX -:description: The DROP INDEX statement allows you to drop a secondary index, a composite vector index, or a hyperscale vector index. +:description: The DROP INDEX statement allows you to drop a secondary index, a Composite Vector index, or a Hyperscale Vector index. :page-topic-type: reference :page-partial: :page-toclevels: 2 @@ -305,7 +305,7 @@ If you drop an index which is scheduled for background creation, a warning messa [IMPORTANT] .Attention ==== -Do not drop (or create) secondary indexes, composite vector indexes, or hyperscale vector indexes when any Index service node is down, as this may result in duplicate index names. +Do not drop (or create) secondary indexes, Composite Vector indexes, or Hyperscale Vector indexes when any Index service node is down, as this may result in duplicate index names. ==== //end::usage[] diff --git a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc index 38cf96d94..56673a954 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc @@ -1,5 +1,5 @@ = DROP VECTOR INDEX -:description: The DROP VECTOR INDEX statement allows you to drop a hyperscale vector index, a composite vector index, or a secondary index. +:description: The DROP VECTOR INDEX statement allows you to drop a Hyperscale Vector index, a Composite Vector index, or a secondary index. :page-topic-type: reference :page-status: Couchbase Server 8.0 :page-toclevels: 2 @@ -52,11 +52,11 @@ include::dropindex.adoc[tags=usage] To try the examples in this section, you must install the vector sample data as described in {prerequisites}[Prerequisites]. [[ex-1]] -.Drop a hyperscale vector index +.Drop a Hyperscale Vector index ==== For this example, the path to the required keyspace is specified by the query, so you do not need to set the query context. -Drop the hyperscale vector index called `color_desc_hyperscale`, if it exists. +Drop the Hyperscale Vector index called `color_desc_hyperscale`, if it exists. [source,sqlpp] ---- diff --git a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc index 9f82a3d19..7d62cc8ba 100644 --- a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc @@ -23,16 +23,16 @@ This function has an alias <>. Finds the approximate distance between a provided vector and the content of a specified field that contains vector embeddings. -This function works best with a hyperscale vector index or composite vector index. +This function works best with a Hyperscale Vector index or Composite Vector index. If a query contains this function, and all of the following are true: -* The cluster has a hyperscale vector index or a composite vector index with a vector index key which is the same as the vector field referenced by the function +* The cluster has a Hyperscale Vector index or a Composite Vector index with a vector index key which is the same as the vector field referenced by the function * The vector index key uses a similarity setting which is the same as the distance metric referenced by the function * The vector index key has the same dimension as the vector provided by the function -… then the Query optimizer selects that hyperscale vector index or composite vector index for use with the query containing this function. +… then the Query optimizer selects that Hyperscale Vector index or Composite Vector index for use with the query containing this function. This function is faster, but less precise than <>. You should use this function in your production queries. @@ -45,7 +45,7 @@ The field must contain an array of floating point numbers, or a base64 encoded s queryvec:: An array of floating point numbers, or a base64 encoded string, representing the vector value to search for in the vector field. metric:: A string representing the distance metric to use when comparing the vectors. -To select a hyperscale vector index or composite vector index for the query, the distance metric should match the `similarity` setting that you used when you created the index. +To select a Hyperscale Vector index or Composite Vector index for the query, the distance metric should match the `similarity` setting that you used when you created the index. + [horizontal.compact] COSINE;; xref:vector-index:vectors-and-indexes-overview.adoc#cosine[Cosine Similarity] @@ -56,17 +56,17 @@ L2_SQUARED;; EUCLIDEAN_SQUARED;; xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean Squared Distance] nprobes:: [Optional] An integer representing the number of centroids to probe for matching vectors. -If the Query Service selects a hyperscale vector index or composite vector index for the query, this option defaults to the `scan_nprobes` setting that you used when you created the index. +If the Query Service selects a Hyperscale Vector index or Composite Vector index for the query, this option defaults to the `scan_nprobes` setting that you used when you created the index. If an invalid value is provided, defaults to `1`. rerank:: [Optional; can only be used when `nprobes` is specified] -A boolean. +A Boolean. If `false`, the function uses quantized vectors. -It `true`, the function uses full vectors to reorder the results. +If `true`, the function uses full vectors to reorder the results. The default is `false`. topNScan:: [Optional; can only be used when `nprobes` and `rerank` are specified] -This option only applies if using a hyperscale vector index. +This option only applies if using a Hyperscale Vector index. A positive integer representing the number of records to scan. The default is `0`, meaning the function uses the indexer default. @@ -80,9 +80,9 @@ To try the examples in this section, you must do the following: * Install the `rgb` and `rgb-questions` collections from the supplied vector sample, as described in xref:vector-index:hyperscale-vector-index.adoc#prerequisites[Prerequisites]. -* Create a composite vector index in the `rbg` collection on the field named `colorvect_l2`, as described in xref:n1ql:n1ql-language-reference/createindex.adoc#ex-create-rgb-idx[CREATE INDEX Example 6]. +* Create a Composite Vector index in the `rbg` collection on the field named `colorvect_l2`, as described in xref:n1ql:n1ql-language-reference/createindex.adoc#ex-create-rgb-idx[CREATE INDEX Example 6]. -* Create a hyperscale vector index in the `rbg` collection on the field named `embedding-vector-dot`, as described in xref:n1ql:n1ql-language-reference/createvectorindex.adoc#ex-create-rgb-idx[CREATE VECTOR INDEX Example 1]. +* Create a Hyperscale Vector index in the `rbg` collection on the field named `embedding-vector-dot`, as described in xref:n1ql:n1ql-language-reference/createvectorindex.adoc#ex-create-rgb-idx[CREATE VECTOR INDEX Example 1]. [#approx_vector_distance_ex_simple] .APPROX_VECTOR_DISTANCE() Example 1 @@ -137,7 +137,7 @@ The results show how the distance changes as the similarity decreases. ---- Compare this with the result of <>. -In this case, the results are identical because the query is not using a hyperscale vector index or composite vector index. +In this case, the results are identical because the query is not using a Hyperscale Vector index or Composite Vector index. ==== [#approx_vector_distance_ex_rbg] @@ -544,7 +544,7 @@ This function has an alias <>. Finds the exact distance between a provided vector and the content of a specified field that contains vector embeddings. -This function does not use a hyperscale vector index or composite vector index to perform the comparison. +This function does not use a Hyperscale Vector index or Composite Vector index to perform the comparison. Instead, it performs a brute-force search for similar vectors. This function is slower, but more precise than <>. diff --git a/modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc b/modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc deleted file mode 100644 index bf7ee376e..000000000 --- a/modules/n1ql/partials/n1ql-language-reference/vector-index-no-windows.adoc +++ /dev/null @@ -1,5 +0,0 @@ -[IMPORTANT] --- -You cannot use Hyperscale Vector Indexes or Composite Vector Indexes on Windows platforms. -You can use Hyperscale Vector Indexes and Composite Vector Indexes in Couchbase Server version 8.0 and later on Linux and macOS. --- \ No newline at end of file diff --git a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp index aae249659..700aedccf 100644 --- a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp +++ b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp @@ -32,6 +32,12 @@ CREATE INDEX `color_desc_idx` ON `vector-sample`.`color`.`rgb` WITH { "dimension":1536, "similarity":"DOT", "description":" IVF,SQ8" } /* end::create-vectors-idx[] */ +/* tag::create-colors-idx[] */ +CREATE INDEX `color_name_idx` ON `vector-sample`.`color`.`rgb` + (color, brightness, `embedding_vector_dot` VECTOR) + WITH { "dimension":1536, "similarity":"DOT", "description":" IVF,SQ8" } +/* end::create-colors-idx[] */ + /* tag::query-rgb-idx[] */ SELECT b.color, b.colorvect_l2, b.brightness from `rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.colorvect_l2,[128,128,128],"L2") diff --git a/modules/vector-index/pages/composite-vector-index.adoc b/modules/vector-index/pages/composite-vector-index.adoc index 0755c0c27..667de7633 100644 --- a/modules/vector-index/pages/composite-vector-index.adoc +++ b/modules/vector-index/pages/composite-vector-index.adoc @@ -3,29 +3,30 @@ :page-ui-name: {ui-name} :page-product-name: {product-name} :description: A Composite Vector index is a Global Secondary Index (GSI) with a single vector column that combines scalar queries with semantic search. -:stem: +:stem: :page-toclevels: 3 :index-name: Composite Vector index :index-name-plural: Composite Vector indexes +[abstract] {description} -The added vector column lets your application perform a query using both the index's scalar, array, and object index entries to pre-filter the dataset before performing a vector similarity search. +The added vector column lets your application perform a query using both the index's scalar, array, and object index entries to pre-filter the dataset before performing a vector similarity search. -== How the Composite Vector Index's Vector Column Works +== How the Composite Vector Index's Vector Column Works The Composite Vector index's single vector column enables semantic and similarity searches within your {sqlpp} queries. When creating the index, you use a `VECTOR` key attribute to identify the key that contains the embedded vectors. -When your query contains an embedded vector, the Query Service uses any non-vector predicates in the query to filter index entries. -Then it performs a vector similarity search to locate semantically related vectors. -Handling the non-vector predicates first reduces the number of vector similarity comparisons the Query Service must do to find similar vectors. +When your query contains an embedded vector, the Index Service uses any non-vector predicates in the query to filter index entries. +Then it performs a vector similarity search to locate semantically related vectors. +Handling the non-vector predicates first reduces the number of vector similarity comparisons the Index Service must do to find similar vectors. == Prerequisites -* You must have the Index Service enabled on at least one node in your cluster. +* You must have the Index Service enabled on at least one node in your cluster. For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. -* You must have a bucket with scopes and collections in your database. +* You must have a bucket with scopes and collections in your database. For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. * Your account must have the xref:learn:security/roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. @@ -35,38 +36,39 @@ You can add a single vector to a Composite Vector index. If your documents contain multiple embedded vectors, you can create multiple indexes -- one for each vector attribute. + Embeddings can be an array of floating point numbers or a base64 encoded string. -Couchbase {product-name} does not embed vectors itself. +Couchbase {product-name} does not embed vectors itself. You must use an external embedding model to embed vectors into your data and add them to your documents. -+ -[TIP] --- -include::vector-search:partial$download-sample-partial.adoc[] --- -* You must know the number of dimensions the vector contains. +* You must know the number of dimensions the vector contains. The embedding model you use to embed the vectors may determine this value for you. For example, OpenAI API's `text-embedding-ada-002` embedding model that embedded the sample data demonstrated later in this page creates vectors that have 1536 dimensions. -* You must decide what distance metric and quantization you want your index to use. -The metrics affect how the index compares vectors. -The quantization determines how much memory your index uses and the amount of processing Couchbase {product-name} must perform to train and search them. +* You must decide what distance metric and quantization you want your index to use. +The metrics affect how the index compares vectors. +The quantization determines how much memory your index uses and the amount of processing Couchbase {product-name} must perform to train and search them. See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity Metrics] and xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization] for more information. +=== Examples on this Page + +include::vector-search:partial$download-sample-partial.adoc[] [#create-index] // TODO: For uptake in Couchbase Capella //// include::vector-index:partial$create-composite-index-capella-ui.adoc[opts=optional] -== Create a Composite Vector Index Using SQL++ +== Create a Composite Vector Index Using {sqlpp} //// == Create a Composite Vector Index Creating a Composite Vector index is similar to creating a non-vector GSI index. See xref:guides:create-index.adoc[] for an overview of creating indexes. -In the `CREATE INDEX` statement to create the Composite Vector index, add the `VECTOR` lead key attribute after the vector's key name to declare it as an embedded vector. +In the `CREATE INDEX` statement to create the Composite Vector index, add the `VECTOR` key attribute after the vector's key name to declare it as an embedded vector. -You must also use the xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[WITH] clause to specify some additional information for the vector column. +The index key that refers to a vector field may be the only index key. +If there are multiple index keys, the index key referring to the vector field may be any of the index keys, including the leading index key. + +You must also use the xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[WITH] clause to specify some additional information for the vector column. The format for this clause with the most commonly used parameters is: [source,sqlpp] @@ -78,7 +80,7 @@ WITH {"dimension": , ---- NOTE: The `WITH` clause can contain other parameters that affect how the index processes vectors. -For a full list of these parameters, see xref:n1ql:n1ql-language-reference/createindex.adoc#index-with[WITH Clause] in the {sqlpp} for Query Reference. +For a full list of the parameters that affect a Composite Vector index, see xref:n1ql:n1ql-language-reference/createindex.adoc[] in the {sqlpp} for Query Reference. * `dimensions` is an integer value that sets the number of dimensions in the vector. This value is set by the embedded model you used to embed the vectors. @@ -88,18 +90,16 @@ include::partial$distance-metric-list.adoc[] + For the greatest accuracy, use the distance function you plan to use when querying vector data. -* `centroids_and_quantization` is a string containing the settings for the quantization and index algorithms. +* `centroids_and_quantization` is a string containing the settings for the quantization and index algorithms. See <<#algo_settings>> in the next section for more information. -For a full list of the parameters that affect a Composite Vector index, see xref:n1ql:n1ql-language-reference/createindex.adoc[]. - include::partial$index-algorithm-settings.adoc[] [#examples] === Examples The following examples show you how to create two Composite Vector index with a vector column using sample data. -They both use the data from the `color_data_2vectors.zip` file mentioned earlier. +They both use the data from the `color_data_2vectors.zip` file mentioned earlier. The following query gets a single document from the `rgb` collection in the `vector-sample` bucket's `color` scope. It truncates the `embedding_vector_dot` attribute to the first four values to improve readability. @@ -118,8 +118,8 @@ include::vector-index:example$composite-vector-data.json[tag=sample-doc] ==== Index the RGB Values -The `rgb.json` file's `colorvect_l2` attribute defines an array containing the RGB values for the entry's color. -While this technically is not an embedded vector, you can still create a vector index column for this array. +The `rgb.json` file's `colorvect_l2` attribute defines an array containing the RGB values for the entry's color. +While this technically is not an embedded vector, you can still create a vector index column for this array. The following example creates a Composite Vector index for this attribute as an embedded vector as well as the color's name and brightness. [source,sqlpp] @@ -130,14 +130,14 @@ include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-rgb-idx] In this example: * The number of dimensions is 3, because there are three values in the array containing the RGB value. -* The similarity function is `L2`. +* The similarity function is `L2`. This function works well to find related vectors which are close by the search vector. In this example, finding similar colors depends more on proximity than the magnitude or alignment of the vectors. See xref:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity] for a comparison of similarity functions. * The `description` lets Couchbase {product-name} decide the number of centroids for the IVF algorithm. It also chooses to use Scalar Quantization with an 8-bit index, splitting each dimension into 256 bins. -This setting does not actually save any space in the index, as each of the RGB dimensions are already 8-bit values. -However, in this example, memory use is not a concern as the dataset is small. +This setting does not actually save any space in the index, as each of the RGB dimensions are already 8-bit values. +However, in this example, memory use is not a concern as the dataset is small. The result of running example is: @@ -158,16 +158,16 @@ The `embedding_vector_dot` attribute contains the embedded vectors for the text The data sample shown in <<#examples>> truncated this attribute to several values. The embedded vector contains 1536 dimensions. -The following example creates a Composite Vector index that indexes the embedded vectors in the `embedding_vector_dot` as well as indexing the scalar `color` that contains the color's name and `brightness.` - +The following example creates a Composite Vector index that indexes the embedded vectors in the `embedding_vector_dot` as well as indexing the scalar `color` that contains the color's name and `brightness`. + [source,sqlpp] ---- include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-idx] ---- -This example uses the Dot Product similarity function. -This function works better with the embedded text content than the Euclidean function used in the previous example. -It also uses the same algorithms as the previous example--Couchbase {product-name} chooses the number of centroids, and uses SQ quantization with 256 bins. +This example uses the Dot Product similarity function. +This function works better with the embedded text content than the Euclidean function used in the previous example. +It also uses the same algorithms as the previous example -- Couchbase {product-name} chooses the number of centroids, and uses SQ quantization with 256 bins. If successful, Couchbase {product-name} responds with: @@ -182,21 +182,56 @@ If successful, Couchbase {product-name} responds with: ] ---- -After Couchbase {product-name} creates the index, it begins training it. +After Couchbase {product-name} creates the index, it begins training it. Depending on your system, this training can take several seconds. -== Query with a Composite Vector Index Column +==== Create a Composite Vector Index with a Scalar Leading Key + +If a Composite Vector index has multiple index keys, the leading index key may be a scalar field, rather than the vector field. +This enables the Index Service to pre-filter using a scalar field. +This is a key advantage that a Composite Vector index has over a Hyperscale Vector index with included scalar fields. + +The following example creates a Composite Vector index that indexes the scalar `color` and brightness fields, as well as the embedded vectors in the `embedding_vector_dot` field. + +[source,sqlpp] +---- +include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-colors-idx] +---- + +If successful, Couchbase {product-name} responds with: -You query embedded vector attributes that you have indexed in a Composite Vector index to find similar vectors and therefore similar semantic content. -To find the most similar vectors, use a `GROUP BY` clause in your query to return the most relevant vectors first. +[source, json] +---- +[ + { + "id": "45222612ffac4e98", + "name": "color_name_idx", + "state": "online" + } +] +---- + +After Couchbase {product-name} creates the index, it begins training it. +Depending on your system, this training can take several seconds. + +== Query with a Composite Vector Index + +You query embedded vector attributes to find similar vectors, and therefore similar semantic content. +To find the most similar vectors, use an `ORDER BY` clause in your query to return the most relevant vectors first. In this clause, call one of two functions that actually performs the vector comparisons: `APPROX_VECTOR_DISTANCE` or `VECTOR_DISTANCE`. The first of these functions is faster, but less precise. The second is more precise, but slower. Which you choose depends on your use case. -You should also use a `LIMIT` clause to return just the number of vectors you need. +To use your Composite Vector index, use the `SELECT` statement with an `ORDER BY` clause containing a call to the `APPROX_VECTOR_DISTANCE` function. +This function selects the Composite Vector index when you query the vector key that the index covers. + +You should use a `LIMIT` clause to return just the number of vectors you need. The query pushes the `LIMIT` clause down into the index scan so that the scan ends after finding the required number of matches. +You can also perform vector comparisons using the VECTOR_DISTANCE function. +This function does not select a Hyperscale Vector index or a Composite Vector Index, but performs a brute-force comparison. + === Query RGB Values Querying the RGB values in `rgb.colorvect_l2` requires a vector with only three values. @@ -208,13 +243,13 @@ The following example finds colors that are similar to gray, which has an RGB va include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-rgb-idx] ---- -The query uses the `APPROX_VECTOR_DISTANCE` function to sort the results. +The query uses the `APPROX_VECTOR_DISTANCE` function to sort the results. You pass it the vector column to search, the vector to search for (in this case, the array `128, 128, 128`) and the distance function. For the best accuracy, use the same distance function you specified when creating the Composite Vector index (in this case, `L2`). The query pushes the `LIMIT` clause down into the index scan, so once it finds the 5 entries that satisfy the query, it exits. -The top result is the entry for gray. +The top result is the entry for gray. The other results are all shades of gray: [source,json] @@ -333,7 +368,7 @@ To query the `color_desc_idx` Composite Vector index containing the embedded vec In a production environment, your application calls the same embedding model it called to generate the embedded vectors in your documents to generate a vector for the query value. For this example, you can use embedded vectors in the `rgb_questions.json` file that's in the `color_data_2vectors.zip` file. -This file contains a `question` attribute containing a search prompt for a particular color. +This file contains a `question` attribute containing a search prompt for a particular color. The following query gets a single document from the `rgb_questions` collection in the `vector-sample` bucket's `color` scope. It truncates the `couchbase_search_query.knn.vector` attribute to the first four values to improve readability. @@ -352,7 +387,7 @@ include::vector-index:example$composite-vector-data.json[tag=sample-doc-question The `couchbase_search_query.knn.vector` attribute contains the embedded vector for the `question` attribute. -This example queries the `embedding_vector_dot` column. +This example queries the `embedding_vector_dot` column. It appears here with most of the 1536 vectors omitted: [source,sqlpp] @@ -360,7 +395,7 @@ It appears here with most of the 1536 vectors omitted: include::vector-index:example$query-vectors-idx-whole.sqlpp[tags=!query-vectors-idx-truncated] ---- -You can click the btn:[View] button to see and copy the entire query with all the vectors. +Click btn:[icon:github[\] View] to see and copy the entire query with all the vectors. Another option is to import the `rgb_questions.json` file into another collection in the `vector-sample` bucket's `color` scope named `rgb-questions`. Then you can use a subquery to get the vectors for the question and use it in your query of the `rgb` collection's `embedding_vector_dot` attribute: @@ -377,37 +412,37 @@ In either case, the results of the query are the same: [ { "color": "cantalope", - "description": "The color cantaloupe is a soft and soothing shade that evokes feelings of calmness - and relaxation. It is a refreshing hue that brings to mind the juicy and sweet fruit it is named - after. This delicate color is a pale orange with hints of pink, giving it a subtle and gentle + "description": "The color cantaloupe is a soft and soothing shade that evokes feelings of calmness + and relaxation. It is a refreshing hue that brings to mind the juicy and sweet fruit it is named + after. This delicate color is a pale orange with hints of pink, giving it a subtle and gentle appearance. It is a perfect color for creating a peaceful and tranquil atmosphere." }, { "color": "papaya whip", - "description": "Papaya whip is a soft and mellow color that can be described as a light shade of - peach or coral. It has a calming and soothing effect, similar to the tropical fruit it is named - after. This color is perfect for creating a warm and inviting atmosphere, and it pairs well with - other pastel shades or neutral tones. Papaya whip is a versatile color that can be used in both + "description": "Papaya whip is a soft and mellow color that can be described as a light shade of + peach or coral. It has a calming and soothing effect, similar to the tropical fruit it is named + after. This color is perfect for creating a warm and inviting atmosphere, and it pairs well with + other pastel shades or neutral tones. Papaya whip is a versatile color that can be used in both fashion and interior design, adding a touch of elegance and sophistication to any space." }, { "color": "apricot", - "description": "Apricot is a warm and inviting color, reminiscent of the soft glow of a sunset. It - has the ability to soften the harshness of other colors and enliven any space it is used in. It is a + "description": "Apricot is a warm and inviting color, reminiscent of the soft glow of a sunset. It + has the ability to soften the harshness of other colors and enliven any space it is used in. It is a delicate and soothing hue, perfect for creating a cozy and welcoming atmosphere." } ] ---- -The second result, the color papaya whip, matches the `rgb_questions` collection's `wanted_similar_color_from_search` attribute. +The second result, the color papaya whip, matches the `rgb_questions` collection's `wanted_similar_color_from_search` attribute. === Adding a Scalar Using additional scalar fields in your search can improve your results and reduce the overhead of performing a vector search. -For example, filtering on an additional scalar field reduces the number of vectors an index scan has to compare. +For example, filtering on an additional scalar field reduces the number of vectors an index scan has to compare. Searching for scalar values requires less resources than vector searches. -The example that created the `color_desc_idx` index added fields in addition to the `embedding_vector_dot` vector field. +The example that created the `color_desc_idx` index added fields in addition to the `embedding_vector_dot` vector field. The following example adds a filter based on the `brightness` field to reduce the number of vectors that get compared and also improve the results. The version of the query that performs a subquery of the `rgb-questions` to get the vector value is: @@ -417,16 +452,16 @@ The version of the query that performs a subquery of the `rgb-questions` to get include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=query-vectors-idx-subquery-filtered] ---- -The truncated version of the query is: +The truncated version of the query is: [source,sqlpp] ---- include::vector-index:example$query-vectors-idx-filtered-whole.sqlpp[tags=!query-vectors-idx-filtered-truncated] ---- -You can click the btn:[View] button to see and copy the entire query with all the vectors. +Click btn:[icon:github[\] View] to see and copy the entire query with all the vectors. -The results of this query moves the papaya whip entry to the top. +The results show that this query moves the papaya whip entry to the top. [source,json] ---- diff --git a/modules/vector-index/pages/hyperscale-filter.adoc b/modules/vector-index/pages/hyperscale-filter.adoc index 554bde79d..a2a752e2b 100644 --- a/modules/vector-index/pages/hyperscale-filter.adoc +++ b/modules/vector-index/pages/hyperscale-filter.adoc @@ -3,18 +3,18 @@ :page-ui-name: {ui-name} :page-product-name: {product-name} :description: You can reduce the number of vectors a query that uses a Hyperscale Vector index by adding scalar values. -:stem: +:stem: :page-toclevels: 3 :index-name: Hyperscale Vector index :index-name-plural: Hyperscale Vector indexes [abstract] {description} -A Hyperscale Vector index has a single column that indexes the vector. +A Hyperscale Vector index has a single column that indexes the vector. However, you can include scalar values in the index that you can use to filter the vector search. The index stores these included values along with the vector, but they're not indexed. -In your queries that use a Hypserscale Vector index, you add the included scalar values as predicates in the `WHERE` clause. +In your queries that use a Hyperscale Vector index, you add the included scalar values as predicates in the `WHERE` clause. During the index scan, Couchbase {product-name} uses the included scalar values to filter out vectors that do not meet the filter restriction. If the filter matches the entry, Couchbase {product-name} performs the more expensive vector comparison operation to determine the distance between the vector value and the search vector. @@ -52,6 +52,6 @@ The result of running the query is: include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-brightness] ---- -Querying with the `brightness` attribute changes makes `sky blue` the top result compared to the results from the example in xref:vector-index:hyperscale-vector-index.adoc#query-with-a-hyperscale-vector-index[Query with a Hyperscale Vector Index]. +Querying with the `brightness` attribute changes makes `sky blue` the top result compared to the results from the example in xref:vector-index:hyperscale-vector-index.adoc#query-with-a-hyperscale-vector-index[Query with a Hyperscale Vector Index]. The restriction can also make the query faster. -On a laptop running a three-node cluster in Docker containers, the query ran in (43{nbsp}ms verses 219{nbsp}ms for the query without the filter. +On a laptop running a three-node cluster in Docker containers, the query ran in 43{nbsp}ms versus 219{nbsp}ms for the query without the filter. diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc index 7e2ba600f..aa8f52018 100644 --- a/modules/vector-index/pages/hyperscale-vector-index.adoc +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -3,7 +3,7 @@ :page-ui-name: {ui-name} :page-product-name: {product-name} :description: Hyperscale Vector Indexes are optimized to index a single vector column. They offer the highest performance of any index when it comes to vector data. -:stem: +:stem: :page-toclevels: 3 :index-name: Hyperscale Vector index :index-name-plural: Hyperscale Vector indexes @@ -13,29 +13,28 @@ They can scale up to a billion documents containing vectors with a large number of dimensions. Because they provide the best performance, consider testing a Hyperscale Vector index for your application before resorting to the other types of indexes. -If you find theirs performance does not meet your needs, then test using a Composite Vector Index or a Search Vector Index. +If you find their performance does not meet your needs, then test using a Composite Vector Index or a Search Vector Index. +== How the Hyperscale Vector Index Works -== How the Hyperscale Vector Index Works +The Hyperscale Vector Index primarily relies on data stored in an optimized format on disk. +By relying on disk storage, they have lower memory requirements than other index types. -The Hyperscale Vector Index primarily relies on data stored in an optimized format on disk. -By relying on disk storage, they have lower memory requirements than other index types. - -You add a single vector column to a Hyperscale Vector Index. +You add a single vector column to a Hyperscale Vector Index. The vector value can be an array of floating point values. -You can nest the array in another array as long as you use an xref:n1ql:n1ql-language-reference/unnest.adoc[UNNEST clause] to extract the it from the containing array. -You can also store the vector in a BASE64 string. +You can nest the array in another array as long as you use an xref:n1ql:n1ql-language-reference/unnest.adoc[UNNEST clause] to extract it from the containing array. +You can also store the vector in a BASE64 string. == Prerequisites Hyperscale Vector Indexes have the following requirements: -* You must have the Index Service enabled on at least one node in your cluster. +* You must have the Index Service enabled on at least one node in your cluster. For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. * Your account must have the xref:learn:security/roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. -* You must have a bucket your database. +* You must have a bucket your database. For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. * You have documents in a collection that contain one or more vector embeddings. @@ -43,28 +42,27 @@ You can add a single vector to a Hyperscale Vector Index. If your documents contain multiple embedded vectors, you can create multiple indexes -- one for each vector attribute. + Embeddings can be an array of floating point numbers or a base64 encoded string. -Couchbase {product-name} does not embed vectors itself. +Couchbase {product-name} does not embed vectors itself. You must use an external embedding model to embed vectors into your data and add them to your documents. -+ -[TIP] --- -include::vector-search:partial$download-sample-partial.adoc[] --- -* The vectors you add to an index must contain the same number of dimensions. +* The vectors you add to an index must contain the same number of dimensions. Also the values in the vector must be 32-bit floating point numbers. -If a vector does not meet both of these requirements, the vector index treats it as a NULL value and the document is not added to the index. +If a vector does not meet both of these requirements, the vector index treats it as a NULL value and the document is not added to the index. -* You must know the number of dimensions the vector contains. -The embedding model you use to embed the vectors may determine this value for you. +* You must know the number of dimensions the vector contains. +The embedding model you use to embed the vectors may determine this value for you. For example, OpenAI API's `text-embedding-ada-002` embedding model creates vectors that have 1536 dimensions. * You must decide whether you want to use the default distance metric and quantization for your index. -By default, a Hyperscale Vector index uses the xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean distance squared] metric and xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization (SQ)] with 8 bits per vector dimension (`SQ8`). -The metrics affect how the index compares vectors. +By default, a Hyperscale Vector index uses the xref:vector-index:vectors-and-indexes-overview.adoc#euclidean-squared[Euclidean distance squared] metric and xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization (SQ)] with 8 bits per vector dimension (`SQ8`). +The metrics affect how the index compares vectors. The quantization determines how much memory your index uses and the amount of processing Couchbase {product-name} must perform to train and search them. See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity Metrics] and xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization] for more information. +=== Examples on this Page + +include::vector-search:partial$download-sample-partial.adoc[] + [#create-index] // TODO: For uptake in Couchbase Capella //// @@ -75,9 +73,9 @@ include::vector-index:partial$create-hyperscale-index-capella-ui.adoc[opts=optio == Create a Hyperscale Vector Index Use the `CREATE VECTOR INDEX` statement to create a Hyperscale Vector Index. -This statement is similar to the `CREATE INDEX` statement that you use to create Global Secondary Indexes (GSI). +This statement is similar to the `CREATE INDEX` statement that you use to create Global Secondary Indexes (GSI). See xref:guides:create-index.adoc[] for an overview of creating indexes. -You must also supply a `WITH` clause to set some additional information about the vector column that the Hyperscale index needs. +You must also supply a `WITH` clause to set some additional information about the vector column that the Hyperscale index needs. The following syntax shows the minimum required parameters to create a Hyperscale Vector index: @@ -91,7 +89,7 @@ CREATE VECTOR INDEX `` }; ---- -NOTE: This syntax for the `CREATE VECTOR INDEX` shows the minimum required parameters to get you started. +NOTE: This syntax for the `CREATE VECTOR INDEX` shows the minimum required parameters to get you started. For the full syntax, see xref:n1ql:n1ql-language-reference/createvectorindex.adoc[] in the SQL++ for Query Reference. The parameters in this statement are: @@ -99,7 +97,7 @@ The parameters in this statement are: * `index_name` is a string that sets the name of the index. * `collection` is the path of the collection to index. * `key_name` is the name of the key containing the vector that you want to index. -The key value must be an array of floating point numbers or a base64 encoded string. +The key value must be an array of floating point numbers or a base64 encoded string. * `dimensions` The number of dimensions in the vector as an integer. The embedded model you use to embed the vectors determines the number of dimensions in the vector. * `similarity_metric` is a string that sets the distance metric to use when comparing vectors during index creation. @@ -108,7 +106,7 @@ include::partial$distance-metric-list.adoc[] + For the greatest accuracy, use the distance metric you plan to use to query the data. -* `centroids_and_quantization` is a string containing the settings for the quantization and index algorithms. +* `centroids_and_quantization` is a string containing the settings for the quantization and index algorithms. See <<#algo_settings>> in the next section for more information. include::partial$index-algorithm-settings.adoc[] @@ -146,60 +144,63 @@ include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=create-rgb-idx] The key pieces of this example are: -* The `CREATE VECTOR INDEX` statement creates a Hyperscale Vector index. +* The `CREATE VECTOR INDEX` statement creates a Hyperscale Vector index. This differs from the `CREATE INDEX` statement used to create a Global Secondary Index (GSI). * The `WITH` clause defines several settings specific to Hyperscale Vector indexes: ** It uses the Euclidean distance (`l2`) similarity function when locating centroids. This function has high accuracy, which matters in a dataset with only 153 documents. ** Also, because the dataset is so small, the example sets the `description` to `IVF8,SQ4`. This value has the xref:vector-index:vectors-and-indexes-overview.adoc#IVF[inverted file algorithm] use just 8 centroids. -It also uses 4-bit xref:vector-index:vectors-and-indexes-overview.adoc#sq[scalar quantization]. +It also uses 4-bit xref:vector-index:vectors-and-indexes-overview.adoc#sq[scalar quantization]. These settings limit the fragmentation of the small dataset. In most cases, you'll not use these settings in a production environment. == Query with a Hyperscale Vector Index -To use your Hyperscale Vector index, use the `SELECT` statement with a `ORDER BY` clause containing a call to the `APPROX_VECTOR_DISTANCE` function. -This function uses the Hyperscale Vector index when you query the vector key the index covers. +To use your Hyperscale Vector index, use the `SELECT` statement with an `ORDER BY` clause containing a call to the xref:n1ql:n1ql-language-reference/vectorfun.adoc#approx_vector_distance[APPROX_VECTOR_DISTANCE()] function. +The query selects the Hyperscale Vector index when this function includes the vector key that the index covers. A typical query looks like this: [source,sqlpp] ---- -SELECT - FROM > +SELECT + FROM ORDER BY APPROX_VECTOR_DISTANCE( - , - , - , - ] + , + , + , + , + , + ) LIMIT ; ---- -NOTE: The previous query example shows just a subset of the most common parameters for the `APPROX_VECTOR_DISTANCE` function. -See xref:n1ql:n1ql-language-reference/vectorfun.adoc#approx_vector_distance[APPROX_VECTOR_DISTANCE()] for the full set of parameters available in this function. - The `APPROX_VECTOR_DISTANCE` parameters shown in the example are: * `collection-vector-column` is the name of the key containing the vector in the collection. * `search-vector-value` is the vector value to search for in the collection column. It can be an array of floating point numbers or a base64 encoded string. -* `distance-metric` is the distance metric to use when comparing the vectors. +* `distance-metric` is the distance metric to use when comparing the vectors. This value should match the distance metric you used when you created the index. * `centroids-to-probe` is an optional integer value that sets the number of centroids to probe for matching vectors. By default, the vector search only probes a single centroid. +* `rerank` is an optional Boolean that can only be used when `centroids-to-probe` is specified. +It specifies whether the function should use full vectors to achieve better results. +For more information, see xref:vector-index:hyperscale-reranking.adoc[]. +* `topNScan` is an optional positive integer that can only be used when `centroids-to-probe` and `rerank` are specified. +If specified, it sets the number of records to scan. +Also use a `LIMIT` clause to return just the number of results you need. +The query pushes the `LIMIT` clause down into the index scan so that the scan ends after finding the number of matches you need. -NOTE: You can also call the function xref:n1ql:n1ql-language-reference/vectorfun.adoc#vector_distance[VECTOR_DISTANCE()] to find similar vectors. -However, this function does not use the Hyperscale Vector index to perform the vector search. +NOTE: You can also call the function xref:n1ql:n1ql-language-reference/vectorfun.adoc#vector_distance[VECTOR_DISTANCE()] to find similar vectors. +However, this function does not use the Hyperscale Vector index to perform the vector search. Instead, it performs a brute-force search for similar vectors. -It's useful to measure the recall of your Hyperscale Vector index. +It's useful to measure the recall of your Hyperscale Vector index. See xref:vector-index:vector-index-best-practices.adoc#recall-accuracy[Determine Recall Rate] for more information about measuring recall. -Also use a `LIMIT` clause to return just the number of results you need. -The query pushes the `LIMIT` clause down into the index scan so that the scan ends after finding the number of matches you need. - [#query-example] === Hyperscale Vector Index Query Example @@ -208,7 +209,7 @@ In actual use, your application generates a vector for the query value using the To avoid the complication of calling an embedding model, this example uses embedded vectors in the `rgb_questions.json` file that's included in `color_data_2vectors.zip`. For this example, the contents of this file are loaded into a collection named `vector-sample.color.rgb-questions`. -This collection contains a `question` attribute which is a search prompt for a particular color. +This collection contains a `question` attribute which is a search prompt for a particular color. The `couchbase_search_query.knn.vector` attribute contains the embedded vector for the `question` attribute. The following query lists several attributes from a document in the collection. It truncates the `couchbase_search_query.knn.vector` attribute to just the first 4 dimensions of the vector for readability: @@ -225,9 +226,9 @@ The output of the query looks like this: include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-questions-output] ---- -To use the embedded vector, you need to include the `couchbase_search_query.knn.vector` attribute in your query's the `SELECT` statement. -You can either directly cut & paste the entire array into your query or use a subquery to retrieve it from the `vector-sample.color.rgb-questions` collection. -The following example uses a subquery to get the vector, and also includes the `wanted_similar_color_from_search` attribute in the output which shows you the color that the query should return. +To use the embedded vector, you need to include the `couchbase_search_query.knn.vector` attribute in your query's `SELECT` statement. +You can either directly copy and paste the entire array into your query or use a subquery to retrieve it from the `vector-sample.color.rgb-questions` collection. +The following example uses a subquery to get the vector, and also includes the `wanted_similar_color_from_search` attribute in the output which shows you the color that the query should return. [source,sqlpp] ---- @@ -241,10 +242,10 @@ The parameters the example passes to this function are: * The `couchbase_search_query.knn[0].vector` is the vector search value to compare to the vectors in the index. This value is the result of the subquery that gets the vector from the `rgb-questions` collection. * `l2` is the distance metric to use. -* `4` is the number of centroids to probe for matching vectors. +* `4` is the number of centroids to probe for matching vectors. This value defaults to `1`. This example sets this value to `4` because the dataset is small. -In a small dataset, it's more likely that relevant vectors are not associated with the same centroid. +In a small dataset, it's more likely that relevant vectors are not associated with the same centroid. This parameter broadens the search beyond a single centroid to find more relevant vectors. If you re-run the query with the default value of `1`, you'll see that the results are less relevant. @@ -255,7 +256,7 @@ The result of running the query is: include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-color] ---- -The second result, `sky blue`, matches the `wanted_similar_color_from_search` attribute as the most relevant color to the question posed in the `question` attribute. +The second result, `sky blue`, matches the `wanted_similar_color_from_search` attribute as the most relevant color to the question posed in the `question` attribute. All of the results are still relevant to the question. === Getting the Vector Distance diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc index 69d57a827..6a591e1da 100644 --- a/modules/vector-index/pages/use-vector-indexes.adoc +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -5,6 +5,7 @@ :description: Use Couchbase {page-product-name}'s vector indexes to find documents based on content similarity or semantic meaning. :page-toclevels: 3 +[abstract] {description} Couchbase {product-name} supports three types of vector indexes. @@ -23,12 +24,12 @@ The three types of Couchbase {product-name} vector indexes are: Hyperscale Vector Indexes:: + -- -* Specifically designed for vector searches -* Perform vector similarity and semantic searches faster than the other types of indexes -* Designed to scale to billions of vectors -* Most of the index resides in a highly optimized format on disk -* High accuracy even for vectors with a large number of dimensions -* Supports concurrent searches and inserts for datasets that are constantly changing +* Specifically designed for vector searches. +* Perform vector similarity and semantic searches faster than the other types of indexes. +* Designed to scale to billions of vectors. +* Most of the index resides in a highly optimized format on disk. +* High accuracy even for vectors with a large number of dimensions. +* Supports concurrent searches and inserts for datasets that are constantly changing. -- + @@ -41,11 +42,11 @@ See xref:vector-index:hyperscale-vector-index.adoc[] for more information. Composite Vector Indexes:: + -- -* Combines a standard xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc#secondary-index[Global Secondary index (GSI)] with a single vector column +* Combine a standard xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc#secondary-index[Global Secondary index (GSI)] with a single vector column. * Designed for searches using a single vector value along with standard scalar values that filter out large portions of the dataset. The scalar attributes in a query reduce the number of vectors the Couchbase {product-name} has to compare when performing a vector search to find similar vectors. * Consume a moderate amount of memory and can index billions of documents. -* Work well for cases where your queries are highly selective -- returning a small number of results from a large dataset +* Work well for cases where your queries are highly selective -- returning a small number of results from a large dataset. -- + @@ -55,12 +56,12 @@ Use Composite Vector indexes when you want to perform searches of documents usin To learn how to use Composite Vector indexes, see xref:vector-index:composite-vector-index.adoc[]. -Search Vector Index:: +Search Vector Indexes:: + -- -* Combines a Couchbase {product-name} Search index with a single vector column -* Allows hybrid searches that combine vector searches with Full-Text Search (FTS) and geospatial searches. -* Can index millions of documents +* Combine a Couchbase {product-name} Search index with a single vector column. +* Allow hybrid searches that combine vector searches with Full-Text Search (FTS) and geospatial searches. +* Can index millions of documents. -- + @@ -200,11 +201,11 @@ They apply scalar filters before performing a vector similarity search. This is ideal for workflows where you want to exclude large portions of the dataset to reduce the number of vectors that the vector search has to compare. Composite Vector indexes work well for applications such as: -Content Recommendations:: +Content recommendations:: Viewers often want hard constraints on their searches, such as genre, language, or favorites actors or directors. Composite Vector indexes can filter using these constraints before performing a vector similarity search on fields such as the plot description or reviews. -Job Searches:: +Job searches:: Job seekers often want to filter jobs based on location, salary, or job title. Composite Vector indexes can filter using these constraints before performing a vector similarity search on fields such as the job description or required skills. diff --git a/modules/vector-index/pages/vector-index-best-practices.adoc b/modules/vector-index/pages/vector-index-best-practices.adoc index 79ed31ef8..84b93e85a 100644 --- a/modules/vector-index/pages/vector-index-best-practices.adoc +++ b/modules/vector-index/pages/vector-index-best-practices.adoc @@ -38,9 +38,9 @@ However, it does improve the queries per second (QPS) that the index can handle. It also lowers the latency of queries that use the index. Hyperscale Vector indexes tend to perform better with larger centroids (smaller `nList` values). -This performance gain has to be balanced against tyhe possibility of increased disk I/O due to centroids having more vectors associated with them. +This performance gain has to be balanced against the possibility of increased disk I/O due to centroids having more vectors associated with them. -*Recommendation:* The best practice for the `nList` depend on your vector index type: +*Recommendation:* The best practice for the `nList` depends on your vector index type: * If you find that your Composite Vector index query throughput and latency is not meeting your needs, you can try rebuilding the index with a larger `nList` value. @@ -84,8 +84,8 @@ These changes do not affect the QPS or latency of queries that use the index. The number of replicas you set affects the fault tolerance, query throughput, and memory footprint of the index. You set this value using the `num_replicas` key in the `WITH` clause when you create or alter your index. -Tests show that increasing the number of replicas learly increases the QPS and linerly reduces the latency of queries that use the index. -However, it also linearly increased the memory footprint of the index. +Tests show that increasing the number of replicas linearly increases the QPS and linearly reduces the latency of queries that use the index. +However, it also linearly increases the memory footprint of the index. Adding replicas does not affect the time it takes to build the index. *Recommendation:* if you find that your query throughput or latency is not meeting your needs, you can try increasing the number of replicas for the index if you can afford the additional memory usage. diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc index 10a346721..47e35666d 100644 --- a/modules/vector-index/pages/vectors-and-indexes-overview.adoc +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -6,19 +6,18 @@ :description: This page is a high-level overview of vectors and how they work in indexes. :page-toclevels: 3 -[abstract] +[abstract] {description} Couchbase {product-name} supports several types of vector indexes. These indexes let you add similarity searches to your applications without relying on external services. -This page provides an overview of vectors. If you're already familiar with vectors, you can skip to the next page, xref:vector-index:use-vector-indexes.adoc[] for information about how to use vector indexes in your application. == About Vectors Vectors are a numerical representation of complex unstructured data such as text, images, or audio. They distill this complex data into an array of floating-point values called dimensions. -The dimensions in vectors capture features of the data in a way that makes them easy to compare mathematically. -Similar data, such as text about the same topic or images of a similar subject, have similar vectors. +The dimensions in vectors capture features of the data in a way that makes them easy to compare mathematically. +Similar data, such as text about the same topic or images of a similar subject, have similar vectors. Similar vectors are close together the multi-dimensional space formed by all of the vectors in the dataset. Vectors for dissimilar data (articles discussing two different topics for example) have vectors that are further apart in this multi-dimensional space. @@ -29,27 +28,27 @@ This similarity goes beyond just finding parts of the data that's identical (for The vectors represent features such as the meaning of text rather than just superficial similarities. When two pieces of data have similar vectors, they have semantically related (having similar meanings or subjects). -For example, suppose you have three text articles. +For example, suppose you have three text articles. The first is about feral cats, the second about domestic cats, and the third is about the UNIX/Linux `cat` command. A text search for the term "cat" could return all three articles at the top of its search results due to their frequent use of the search term. -However, that does not mean that the articles are all semantically related. -By generating vectors for the articles and comparing them, you can determine any semantic relationship between them. +However, that does not mean that the articles are all semantically related. +By generating vectors for the articles and comparing them, you can determine any semantic relationship between them. -Vectors can be similar in a variety of ways. +Vectors can be similar in a variety of ways. They may: * Point in similar directions. -* Be close to each other in the vector space made up of all the dimensions in the vectors. -* Have a similar magnitude (length). +* Be close to each other in the vector space made up of all the dimensions in the vectors. +* Have a similar magnitude (length). image::vector-space-example.svg["Three-dimensional plot showing two vectors that are close by and parallel and a third vector that's away and points in another direction"] -Because the first two articles are about cats, their vectors point in a similar direction and are in a similar location in space. +Because the first two articles are about cats, their vectors point in a similar direction and are in a similar location in space. The third article, despite using the word "cat" as frequently as the two other articles, has a vector that has significant differences from the other two. -NOTE: Some diagrams in this document (and in other discussions available on the web) show vectors in three dimensions. -These diagrams are a simplification. -The vectors used in AI applications have hundreds to thousands of dimensions. +NOTE: Some diagrams in this document (and in other discussions available on the web) show vectors in three dimensions. +These diagrams are a simplification. +The vectors used in AI applications have hundreds to thousands of dimensions. They're easy for computers to handle but are rather difficult for humans to visualize. In addition, the vector dimension values in the diagrams show only 4 decimal places to conserve space. The floating point dimensional values of actual vectors often use 6 or 7 decimal places. @@ -58,7 +57,7 @@ When viewing these diagrams, remember that they only scratch the surface of the === Using Vectors to Find Similar Complex Data Vectors let you search for similarity in data that's hard to search using traditional techniques. -Image data, for example, is just a string of raw binary values. +Image data, for example, is just a string of raw binary values. Matching portions of this data within two image files does not mean they're of the same subject, or even have any resemblance. Also, comparing megabytes of raw image data is computationally expensive. Generating vectors of the images distills features of the image into a smaller, more manageable amount of data. @@ -70,11 +69,11 @@ Comparing the vectors is more manageable and actually results in finding similar Embedding is the process of generating vectors that represent a piece of complex unstructured data. You use an embedding model that's specific to the data's type to generate a vector to represent it. -For example, to generate vectors from text, you can use a use models such as https://en.wikipedia.org/wiki/Word2vec[Word2Vec^], https://en.wikipedia.org/wiki/GloVe[Global Vectors for Word Representation (GloVe)^], or https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2[all-MiniLM-L6-v2^]. -These models take into account the context around each potion of the text when generating a vector. -This context is what captures the semantic meaning of the text and embeds it in the vector's dimensions. +For example, to generate vectors from text, you can use models such as https://en.wikipedia.org/wiki/Word2vec[Word2Vec^], https://en.wikipedia.org/wiki/GloVe[Global Vectors for Word Representation (GloVe)^], or https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2[all-MiniLM-L6-v2^]. +These models take into account the context around each portion of the text when generating a vector. +This context is what captures the semantic meaning of the text and embeds it in the vector's dimensions. -To generate vectors from images, you use different embedding models such as a https://en.wikipedia.org/wiki/Residual_neural_network[Residual Neural Network (ResNet)^]. +To generate vectors from images, you use different embedding models such as a https://en.wikipedia.org/wiki/Residual_neural_network[Residual Neural Network (ResNet)^]. You can embed audio using a model such as OpenL3. image::embedding-vectors.svg["Diagram showing text, image, and audio data being transformed by embedding models into a string of floating point numbers that represent vectors."] @@ -87,7 +86,7 @@ Beyond choosing an embedding model that's appropriate for your data, you general === Embedding Model Compatibility -You can only compare the similarity of vectors generated by the same embedding model. +You can only compare the similarity of vectors generated by the same embedding model. For example, you cannot find the similarity of a vector generated by Word2Vec and one generated by GloVe. You also cannot compare a vector for a piece of text generated by Word2Vec with the vector for an image generated by ResNet. @@ -110,7 +109,7 @@ You can use external embedding models or https://www.couchbase.com/products/ai-s [#vector_similarity] == Vector Similarity Metrics -Once you have embedded vectors in your database, you find documents with a similar meaning by finding similar vectors. +Once you have embedded vectors in your database, you find documents with a similar meaning by finding similar vectors. You use metrics to (also referred to as distance functions) to find similar vectors. When you create an index or perform a vector search, you must specify which metric to use to compare vectors. Each metric works best for certain applications and types of data. @@ -118,17 +117,17 @@ Each metric works best for certain applications and types of data. Couchbase {product-name} supports four metrics: [#euclidean] -=== Euclidean Distance +=== Euclidean Distance Euclidean Distance (also known as L2) calculates the geometric distance between two vectors by finding the distance between the individual dimensions in the vectors. -This method is most sensitive to the distance between the vectors in space, rather than their alignment. -It's also sensitive to the scale of the vectors, where the length of one vector verses the other affects the relationship between the vectors. +This method is most sensitive to the distance between the vectors in space, rather than their alignment. +It's also sensitive to the scale of the vectors, where the length of one vector versus the other affects the relationship between the vectors. Use this method when the actual distance of the vectors and their magnitudes are important. This method is useful if the distance between vectors represents a real-world value. - + image::euclidean-distance-example.svg["Three-dimensional plot showing two vectors with points along each vector joined by dotted lines, indicating the summing of corresponding points."] -NOTE: When you select Euclidean Distance or L2 as the metric for a vector index, Couchbase {product-name} internally uses the <<#euclidean-squared>> metric (explained in the next section) to perform vector comparisons. +NOTE: When you select Euclidean Distance or L2 as the metric for a vector index, Couchbase {product-name} internally uses the <<#euclidean-squared>> metric (explained in the next section) to perform vector comparisons. This approach improves performance because it avoids performing a computationally expensive square root operation. Vector searches using the Euclidean Squared metric return the same relevant vectors and ranking of results as Euclidean Distance. If your query materializes or projects the actual distance between vectors, Couchbase {product-name} calculates the actual Euclidean Distance. @@ -136,7 +135,7 @@ For example, if your query returns the distance between vectors as a column, Cou Euclidean Distance is useful for tasks such as: -* 3D motion capture where you're detecting similar positions or trajectories of joints, objects, where finding real-world values for thresholds is important. +* 3D motion capture where you're detecting similar positions or trajectories of joints, objects, where finding real-world values for thresholds is important. * Geographic or spatial searches where you care about exact (and often real-world) distances. * Other cases where you use the results as filters in calculations that require the actual distance between the vectors. @@ -144,7 +143,7 @@ NOTE: Only Hyperscale Vector and Composite Vector indexes support this metric. Search Vector Indexes do not support it. [#euclidean-squared] -=== Euclidean Squared Distance +=== Euclidean Squared Distance Euclidean Squared Distance (also known as L2 Squared or L2^2^) is similar to Euclidean Distance. @@ -155,17 +154,17 @@ Euclidean Distance Formula:: latexmath:[L2(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2}] -Euclidean Squared Distance Formula:: +Euclidean Squared Distance Formula:: latexmath:[L2^2(x, y) = \sum_{i=1}^n (x_i - y_i)^2] Because it does not take the square root of the sums, Euclidean Squared Distance is faster to calculate than Euclidean Distance. -However, it does not represent the actual distance between the vectors. -The results of a vector search using L2 Squared as a metric always returns the same rankings that an L2 search returns. +However, it does not represent the actual distance between the vectors. +The results of a vector search using L2 Squared as a metric always returns the same rankings that an L2 search returns. In cases where the dimensions of the vectors represent real-world values, L2 is more intuitive to use because it returns the actual distance between the vectors. -Use this method when you need higher performance than Euclidean Distance. -It's better in cases when comparing literal distances is less important than performance and where having the ranking of search results is sufficient. +Use this method when you need higher performance than Euclidean Distance. +It's better in cases when comparing literal distances is less important than performance and where having the ranking of search results is sufficient. For example: @@ -181,14 +180,14 @@ Search Vector Indexes do not support it. [#dot] === Dot Product -This metric finds related vectors by comparing the magnitude (length) and alignment of the vectors. +This metric finds related vectors by comparing the magnitude (length) and alignment of the vectors. Here, the proximity of the vectors in space is less important than whether they point in a similar direction and have the a similar magnitude. Vectors that point in similar directions (have a low angle between them) and have similar magnitude are strongly associated with each other. This method uses the similarity of the vectors' magnitudes to rank their relation. - + image::dot-product-example.svg["Three-dimensional plot showing two vectors labeled with their magnitudes and the angle between them labeled with the theta symbol."] - -Use this method for tasks where ranking confidence is key. + +Use this method for tasks where ranking confidence is key. The magnitude of the vectors is important when determining the strength of the relationship. For example: @@ -199,9 +198,9 @@ For example: [#cosine] === Cosine Similarity -This metric is similar to the dot product. +This metric is similar to the dot product. However, it normalizes the vectors (making them the same length) during comparison. -Normalization means their magnitudes are not taken into account, just their alignment. +Normalization means their magnitudes are not taken into account, just their alignment. This normalization makes this method better for comparing textual data because it's less sensitive to the length of the data. The magnitude of a vector generated by some text embedding models depend on the length of the source text. Normalizing vector magnitudes emphasizes the semantic meaning when performing comparisons. @@ -219,19 +218,19 @@ Use this method when you're performing searches that rely on semantic meaning, s [#index-algorithms] == Index Formats -Couchbase {product-name} supports two formats that the Vector indexes use when storing their data. +Couchbase {product-name} supports two formats that the Vector indexes use when storing their data. These formats control how the index stores the vectors. Couchbase {product-name} automatically chooses which algorithm to use, based on the type of the index and the size of the dataset. However, you can set parameters when you create the index that affect how the algorithm organizes data. === Flat Index -This algorithm just stores the full vector value in the index without performing any sort of optimization. +This algorithm just stores the full vector value in the index without performing any sort of optimization. Searches using this index use a brute-force method to find similar vectors. Adding new vectors to a flat index is fast and the index does not need training. -It also offers high precision because search compares the full vector values. +It also offers high precision because search compares the full vector values. However, searching a flat index is inefficient. The search must compare every vector in the index to find matches. -You should only use it for small data sets or for testing. +You should only use it for small data sets or for testing. NOTE: Search Vector Indexes use a flat index when indexing datasets with 1000 or fewer vectors. Hyperscale Vector and Composite Vector indexes only support the next algorithm, IVF. @@ -241,7 +240,7 @@ Hyperscale Vector and Composite Vector indexes only support the next algorithm, This algorithm partitions the vector space to limit the number of vectors that a search must compare. An IVF index trains itself during creation using a set of parameters you pass to it: -. It samples vectors in the dataset to locate clusters of similar vectors. +. It samples vectors in the dataset to locate clusters of similar vectors. . For each cluster it finds, it chooses a representative vector (called a centroid). . It creates a data structure called an inverted list that associates all vectors with their closest centroid. @@ -270,7 +269,7 @@ Search Vector Indexes automatically uses IVF when the indexing datasets larger t Quantization simplifies vector data so it consumes less space in memory and on disk. Reducing the amount of data in a vector also makes vector comparison faster. -However, quantization does reduce the accuracy of a vector. +However, quantization does reduce the accuracy of a vector. It's similar to using a lossy image compression format, such as JPEG, on an picture to reduce its data size. It trades off some detail and accuracy for a smaller, more manageable data size. @@ -290,18 +289,18 @@ PQ processes vectors by following these steps: For example, suppose the vectors contain 1024 dimensions. Then PQ may break the vectors into 128 subspaces, each containing 8 dimensions. . It finds groups of centroids in each subspace and adds them to a data structure called a codebook. -The codebook assigns each centroid an index number. +The codebook assigns each centroid an index number. . PQ then reduces the size of the vectors by replacing each subspace's dimensions with the index of the closest centroid in the codebook. image::pq-diagram.svg["Three-dimensional plot showing two vectors that are of equal length, with the angle between them labeled as theta."] PQ could quantize the vector in the previous example from 1024 64-bit floating point values to 128 8 bit or 16 bit integer values. -This data size reduction improves performance because integer operations are less computationally expensive than floating point operations. -It also reduces memory use because each vector requires less data to store (for example, from 64KB to 128 bytes). +This data size reduction improves performance because integer operations are less computationally expensive than floating point operations. +It also reduces memory use because each vector requires less data to store (for example, from 64KB to 128 bytes). A search of the PQ index performs the same steps on the vector you're searching for: - + . It breaks the search vector into subspaces and quantizes it using the codebook. . It then locates closest centroids to the quantized query vector. . It searches the vectors related to the matching centroids for vectors that relate to the search vector. @@ -320,11 +319,11 @@ Use PQ quantization when: Hyoerscale Vector and Composite Vector indexes support PQ quantization. -Search Vector Indexes do not support it. +Search Vector Indexes do not support it. [#sq] === Scalar Quantization (SQ) -Scalar Quantization is a simpler form of quantization than PQ. +Scalar Quantization is a simpler form of quantization than PQ. Instead of breaking the vector into subspaces, it quantizes each dimension of the vector independently. Its quantized vectors are larger, but are a more precise represenation than than those quantized using PQ. @@ -335,8 +334,8 @@ SQ follows these steps to process vectors: . It then partitions each dimension in the vector into equal segments (called bins) over the range of the dimension's values. For example, in the diagram, the first dimension's values range from 0 to 1, while the second dimension's range from 0.1 to 0.9. This means the second dimension's bins will only cover the range from 0.1 to 0.9. -. SQ assigns each bin an index value that's from 4 to 8 bits in length. -. It find a centroid within the range associated with the bin. +. SQ assigns each bin an index value that's from 4 to 8 bits in length. +. It finds a centroid within the range associated with the bin. It saves the centroid as a 16 or 32 bit floating point number. . SQ then quantizes the vectors by replacing their dimensional values with the index value of the bin the dimensional value falls into. @@ -345,12 +344,12 @@ image::sq-diagram.svg["Diagram showing each floating point dimension of a vector This quantization reduces the dimensions from 32 or 64 bit floating point values to 8 or less bit integers, reducing the memory needed for search. It also makes search faster because integer operations are computationally less expensive than floating point operations. -A search on an SQ index reassembles vectors before comparing them. +A search on an SQ index reassembles vectors before comparing them. For each of the vector's dimensions, SQ replaces the integer bin number with the floating point centroid associated with the bin. -This recreation is an approximation of the original vector, because each dimension in the vector is the bin's centroid value instead of the original dimensional value. +This recreation is an approximation of the original vector, because each dimension in the vector is the bin's centroid value instead of the original dimensional value. Because this method quantizes the vectors, it loses precision. -It's less precise than the PQ method (which also quantizes vectors) because it assumes that each dimension can be evenly divided. +It's less precise than the PQ method (which also quantizes vectors) because it assumes that each dimension can be evenly divided. Its accuracy suffers if your data has clusters. It's best suited for data that's more evenly distributed and does not have high correlations. For example, SQ may be a good fit for an IoT sensor dataset where the measured values (such as temperature) are evenly distributed over the range of measurements. @@ -358,7 +357,7 @@ For example, SQ may be a good fit for an IoT sensor dataset where the measured v SQ has a lower training overhead compared to PQ because it does not search for clusters of vectors. Its training just determines the range of values for each dimension. -Use SQ if you do not want the processing overhead of training a PQ index. +Use SQ if you do not want the processing overhead of training a PQ index. You can also use it if you have a smaller dataset (hundreds of thousands to millions of vectors). All three types of vector indexes support SQ quantization. @@ -372,7 +371,7 @@ Instead, they automatically choose whether to use quantization: * Search Vector Indexes do not use quantization for datasets smaller than 10000 vectors. * Search Vector Indexes automatically use 8-bit SQ quantization for datasets with 10000 vectors or larger. -When creating a Hyperscale Vector or Composite Index, you choose which quantization method to use when creating the index. +When creating a Hyperscale Vector or Composite Index, you choose which quantization method to use when creating the index. When deciding, consider the following: * Use SQ when you want higher accuracy than PQ, at the cost of lower compression and therefore more memory use. @@ -388,30 +387,30 @@ See xref:vector-index:vector-index-best-practices.adoc[] for more information ab [#index-training] == The Importance of Index Training -The IVF indexing algorithm and the PQ ans SQ quantizations rely on training the index on existing data. +The IVF indexing algorithm and the PQ and SQ quantizations rely on training the index on existing data. Both PQ and IVF locate centroids that represent clusters of vectors in vector space. The SQ quantization samples vectors to determine the range of values in each dimension. These training techniques reflect the content of dataset at the time you create the index. For this training to give you accurate search results, the data in your dataset must represent the full range of data you expect to search. If the dataset is not representative, the centroids that the PQ quantization or IVF indexing method selects may not accurately represent clusters of data in the dataset. -Having accurate centroids are key to these indexing methods returning accurate results. +Having accurate centroids are key to these indexing methods returning accurate results. For indexes using SQ quantization, the range of values in the dimensions may not accurately represent the data in the dataset. -If one or more dimensional values fall outside the range that SQ assign bins to, they get assigned closest bin which may not properly represent the value. +If one or more dimensional values fall outside the range that SQ assigns bins to, they get assigned to the closest bin, which may not properly represent the value. As your dataset changes, these inaccuracies can build, skewing results. -Over time, may find your vector search's recall (percentage of the nearest neighbors of the search vector returned by a query) decreases. +Over time, may find your vector search's recall (percentage of the nearest neighbors of the search vector returned by a query) decreases. Searches for similar vectors may miss relevant results or may rank less-related vectors higher than more relevant results. These inaccuracies can occur because the data in the dataset changes over time as you add and remove documents. The centroids identified by PQ and IVF may no longer adequately reflect the data in your database. New clusters of vectors may have developed, and old ones may have dissipated. For indexes using SQ quantization, the range of values in the dimensions may have changed. -To resolve these accuracy issues, you can retrain your indexes when you notice poor recall. +To resolve these accuracy issues, you can retrain your indexes when you notice poor recall. You can also choose to retrain indexes periodically or after you make significant changes to your dataset. -To retrain an index, you create a new index with the same (or tweaked) settings as the existing index, but with a different name. +To retrain an index, you create a new index with the same (or tweaked) settings as the existing index, but with a different name. After Couchbase {product-name} builds and trains the new index, you can drop the old index. -You should consider the need to retrain your indexes when choosing which quantization to use. -For example, the PQ quantization requires more resources to train than SQ. +You should consider the need to retrain your indexes when choosing which quantization to use. +For example, the PQ quantization requires more resources to train than SQ. If your dataset evolves rapidly, you may choose to not use PQ because you'll need to perform more frequent retraining. diff --git a/modules/vector-index/partials/index-algorithm-settings.adoc b/modules/vector-index/partials/index-algorithm-settings.adoc index 22771ff84..7bedc5df5 100644 --- a/modules/vector-index/partials/index-algorithm-settings.adoc +++ b/modules/vector-index/partials/index-algorithm-settings.adoc @@ -1,7 +1,7 @@ [#algo_settings] -=== Quantization and Centroid settings +=== Quantization and Centroid Settings -When creating an index that includes a vector field, you choose settings that affect how the index processes vectors. +When creating an index that includes a vector field, you choose settings that affect how the index processes vectors. The parameter named `description` is the primary setting that controls the quantization and the number of centroids Couchbase {product-name} to create the index. Using it, you control how the index subdivides the dataset to improve performance and how it quantizes vectors to reduce memory and processing requirements. @@ -16,15 +16,15 @@ The following sections describe the settings for centroids and quantization. ==== Number of Centroids -{index-name} uses several algorithms to organize its data to improve its performance. +{index-name} uses several algorithms to organize its data to improve its performance. One of these algorithms, xref:vector-index:vectors-and-indexes-overview.adoc#IVF[Inverted File (IVF)], has a setting you can adjust to control how it subdivides the dataset. The other algorithms that {index-name} uses do not have settings you can adjust. -The key setting for IVF is the number of centroids it allocates for the index. +The key setting for IVF is the number of centroids it allocates for the index. This setting controls how large the centroids are. Larger centroids have more vectors associated with them. -You can have Couchbase {product-name} choose a number of centroids for you by not providing a value after the `IVF` in your `description` parameter. +You can have Couchbase {product-name} choose a number of centroids for you by not providing a value after the `IVF` in your `description` parameter. It sets the number of centroids to the number of vectors in the dataset divided by 1000. You can manually set the number of centroids for the index by adding an integer value after the `IVF` in the `description` parameter. @@ -38,24 +38,24 @@ In this case, a vector search has to perform more comparisons, making the search However, having fewer centroids decreases the processing required to train the index. * A greater number of centroids results in a greater processing cost for training. -This increase is due to the training process having to search for more data cluster to identify more centroids. +This increase is due to the training process having to search for more data cluster to identify more centroids. However, it reduces the number of vectors associated with each centroid. This reduction makes search faster by limiting the number of vector comparisons during a search. endif::[] ifeval::['{index-name}' == 'Hyperscale Vector index'] -{index-name-plural} perform better with larger centroids (fewer centroids in the index). +{index-name-plural} perform better with larger centroids (fewer centroids in the index). They use algorithms to skip vectors that are far away from the search vector, making searches faster even with more vectors per centroid. Having fewer centroids can also speed up the index training process because Couchbase {product-name} has to identify fewer data clusters. However, having more vectors per centroid can result in more disk I/O during searches because each centroid has more data associated with it. When choosing the number of centroids for your index, consider the following guidelines: -* If the majority of your working data set fits into the bucket's memory quota, choose a smaller number of centroids for the index. +* If the majority of your working data set fits into the bucket's memory quota, choose a smaller number of centroids for the index. Having more of the working data set in memory reduces disk I/O during searches, making searches faster. Another option is to have the fastest possible storage such as a fast NVME connected to a high-speed PCIe interface. -* If your working data set is much larger than the bucket's memory quota, choose a larger number of centroids for the index. +* If your working data set is much larger than the bucket's memory quota, choose a larger number of centroids for the index. This setting reduces the number of vectors associated with each centroid, which can reduce disk I/O during searches. endif::[] @@ -65,7 +65,7 @@ See xref:vector-index:vector-index-best-practices.adoc#nlist[nList] for more gui ==== Quantization Setting -{index-name} always uses quantization to reduce the size of vectors stored in the index. +{index-name} always uses quantization to reduce the size of vectors stored in the index. You must choose whether the index uses xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization (SQ)] or xref:vector-index:vectors-and-indexes-overview.adoc#pq[Product Quantization (PQ)]. See xref:vector-index:vector-index-best-practices.adoc#quantization[Quantization] for guidance on choosing the quantization method for the index. @@ -75,7 +75,7 @@ Each quantization method has additional settings explained in the following sect ===== SQ Settings -For SQ, you set the number of bits the SQ algorithm uses for the bin index value or the number of bits it uses to store the centroid for each bin. +For SQ, you set the number of bits the SQ algorithm uses for the bin index value, or the number of bits it uses to store the centroid for each bin. The values for SQ that Couchbase {product-name} supports are: [%autowidth] @@ -92,9 +92,9 @@ The values for SQ that Couchbase {product-name} supports are: | SQ uses an 8-bit index value splitting each vector dimension into 256 subspaces. // | `SQfp16` -// | SQ uses an 8-bit index value splitting each vector dimension into 256 subspaces. +// | SQ uses an 8-bit index value splitting each vector dimension into 256 subspaces. // However, it stores the centroid value as a 16-bit floating point number instead of a 32-bit floating point number. -// This cuts the memory used to store the centroids in half. +// This cuts the memory used to store the centroids in half. |=== @@ -105,12 +105,12 @@ See xref:vector-index:vectors-and-indexes-overview.adoc#sq[Scalar Quantization] If you choose to use PQ in your index, you must set two values: -* The number of subquantizers (number of subspaces PQ splits the vector's dimensions into) to use. +* The number of subquantizers (number of subspaces PQ splits the vector's dimensions into) to use. This value must be a divisor of the number of dimensions in the vector. -For example, if your vector has 99 dimensions, you can only use the values 3, 9, 11, 33, and 99 for the subquantizers. -Using any other value returns an error. +For example, if your vector has 99 dimensions, you can only use the values 3, 9, 11, 33, and 99 for the subquantizers. +Using any other value returns an error. -* The number of bits in the centroid's index value. +* The number of bits in the centroid's index value. This value sets the number centroids to find in each subspace. For example, setting this value to 8 has PQ store the index for the centroids in a byte. This results in SQ using 256 centroids per subspace. @@ -129,7 +129,7 @@ The format for the PQ settings is: pq-settings ::= 'PQ' subquantizers 'x' number-of-bits ---- -For example, `PQ32x8` has PQ break the vector's dimensions into 32 subspaces, each of which has 256 centroids. +For example, `PQ32x8` has PQ break the vector's dimensions into 32 subspaces, each of which has 256 centroids. See xref:vector-index:vectors-and-indexes-overview.adoc#pq[Product Quantization] for more information about how PQ works. ==== Algorithm Settings Examples @@ -141,11 +141,11 @@ The following table shows several `description` values along with an explanation | Setting | Effect | `IVF,SQ8` -| Couchbase {product-name} chooses the number of centroids the IVF algorithm uses. +| Couchbase {product-name} chooses the number of centroids the IVF algorithm uses. The index uses Scalar Quantization with an 8-bit index, meaning it breaks each of the vector's dimensions into 256 bins. | `IVF1024,PQ8x8` -| IVF uses 1024 centroids to divide the dataset. +| IVF uses 1024 centroids to divide the dataset. The index uses Product Quantization. PQ breaks the vector space into 8 subspaces, each of which uses 8-bits to represent centroids in the subspace. This settings means each subspace has 256 centroids. diff --git a/preview/DOC-12294-GSI-vector-index.yml b/preview/DOC-12294-GSI-vector-index.yml deleted file mode 100644 index c28497293..000000000 --- a/preview/DOC-12294-GSI-vector-index.yml +++ /dev/null @@ -1,5 +0,0 @@ -sources: - docs-server: - branches: [DOC-12565_vector_search_concepts] -override: - startPage: server:introduction:intro.adoc From ca2f3451ab194f09726f167c27229aabed8695c3 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Tue, 14 Oct 2025 12:35:05 +0100 Subject: [PATCH 67/80] NO ISSUE: Capella-specific GSI fixes (#449) * Update links to Capella * Hide service-level settings * Update replica examples * Remove page edition --- .../alter-idx-move.n1ql | 2 +- .../n1ql-language-reference/alterindex.adoc | 78 +++++---- .../altervectorindex.adoc | 50 +++--- .../auto-update-statistics.adoc | 151 +++++++++--------- .../n1ql-language-reference/createindex.adoc | 8 +- .../createprimaryindex.adoc | 7 +- .../index-partitioning.adoc | 6 +- 7 files changed, 160 insertions(+), 142 deletions(-) diff --git a/modules/n1ql/examples/n1ql-language-reference/alter-idx-move.n1ql b/modules/n1ql/examples/n1ql-language-reference/alter-idx-move.n1ql index 327e2cfda..ff5856448 100644 --- a/modules/n1ql/examples/n1ql-language-reference/alter-idx-move.n1ql +++ b/modules/n1ql/examples/n1ql-language-reference/alter-idx-move.n1ql @@ -1,2 +1,2 @@ ALTER INDEX def_inventory_airport_faa ON airport -WITH {"action": "move", "nodes": ["192.168.10.11:8091"]}; \ No newline at end of file +WITH {"action": "move", "nodes": ["svc-dqi-node-002:18091"]}; \ No newline at end of file diff --git a/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc b/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc index 0ded42173..ddbcb9932 100644 --- a/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc @@ -4,8 +4,8 @@ :page-toclevels: 2 :imagesdir: ../../assets/images -:rebalancing-the-index-service: xref:server:learn:clusters-and-availability/rebalance.adoc#rebalancing-the-index-service -:console-indexes: xref:server:manage:manage-ui/manage-ui.adoc#console-indexes +:rebalancing-the-index-service: xref:clusters:scale-database.adoc#rebalance +:console-indexes: xref:clusters:index-service/manage-indexes.adoc :query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context :identifiers: xref:n1ql-language-reference/identifiers.adoc :logical-hierarchy: xref:n1ql:n1ql-intro/queriesandresults.adoc#logical-hierarchy @@ -382,18 +382,19 @@ When dropping a replica, the index topology does not change. The indexing service remembers the number of partitions and replicas specified for this index. Given sufficient capacity, the dropped replica is rebuilt after the next rebalance -- although it may be placed on a different index node, depending on the resource usage statistics of the available nodes. -To find the ID of an index replica and see which node it's placed on, you can use the {console-indexes}[Indexes screen in the Couchbase Web Console] or query the {querying-indexes}[system:indexes] catalog. +To find the ID of an index replica and see which node it's placed on, you can use the {console-indexes}[Indexes page in the Couchbase Capella UI] or query the {querying-indexes}[system:indexes] catalog. When dropping a replica, it's possible to leave a server group with no replica. For a partitioned index, run a rebalance to move a replica into the vacant server group. -ifdef::flag-devex-rest-api[] === Index Redistribution Using this statement to move 1 index at a time may be cumbersome if there are a lot of indexes to be moved. -The index redistribution setting enables you to specify how Couchbase Capella redistributes indexes automatically on rebalance. -For more information, see {rebalancing-the-index-service}[Rebalance]. +ifdef::flag-devex-rest-api[] +The index redistribution setting enables you to specify how endif::flag-devex-rest-api[] +Couchbase Capella redistributes indexes automatically on rebalance. +For more information, see {rebalancing-the-index-service}[Rebalance]. //end::usage[] //tag::return-value[] @@ -451,12 +452,10 @@ include::ROOT:partial$query-context.adoc[tag=section] .Move the `def_inventory_airport_faa` index from one node to another ==== -Create a cluster of 3 nodes and then go to menu:Settings[Sample buckets] to install the `travel-sample` bucket. +Create a cluster of 3 nodes and install the `travel-sample` bucket. The indexes are then installed in a round-robin fashion and distributed over the 3 nodes. -image::alter-index_servers_step1.png["The Indexes tab showing def_inventory_airport_faa on 192.168.10.10"] - -Then move the `def_inventory_airport_faa` index from its original node (192.168.10.*10* in this example) to a new node (192.168.10.*11* in this example). +Then move the `def_inventory_airport_faa` index from its original node (`svc-dqi-node-001` in this example) to a new node (`svc-dqi-node-002` in this example). [source,sqlpp] ---- @@ -469,48 +468,55 @@ You should see: ---- include::example$n1ql-language-reference/alter-idx-move.jsonc[] ---- - -image::alter-index_servers_step2.png["The Indexes tab showing def_inventory_airport_faa on 192.168.10.11"] ==== .Create and move an index replica from one node to another ==== -Create an index on node 192.168.10.10 with a replica on node 192.168.10.11, then move its replica from node 192.168.10.*11* to 192.168.10.*12*. +Create an index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then move its replica from node `svc-dqi-node-002` to `svc-dqi-node-003`. [source,sqlpp] ---- CREATE INDEX country_idx ON airport(country, city) USING GSI - WITH {"nodes": ["192.168.10.10:8091", "192.168.10.11:8091"]}; + WITH {"nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091"]}; ALTER INDEX country_idx ON airport -WITH {"action": "move", "nodes": ["192.168.10.10:8091", "192.168.10.12:8091"]}; +WITH {"action": "move", + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-003:18091"]}; ---- ==== .Moving multiple replicas ==== -Create an index on node 192.168.10.10 with replicas on nodes 192.168.10.*11* and 192.168.10.*12*, then move the replicas to nodes 192.168.10.*13* and 192.168.10.*14*. +Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then move the replicas to nodes `svc-dqi-node-004` and `svc-dqi-node-005`. [source,sqlpp] ---- CREATE INDEX country_idx ON airport(country, city) -WITH {"nodes": ["192.168.10.10:8091", "192.168.10.11:8091", "192.168.10.12:8091"]}; +WITH {"nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ALTER INDEX country_idx ON airport WITH {"action": "move", - "nodes": ["192.168.10.10:8091", "192.168.10.13:8091", "192.168.10.14:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-004:18091", + "svc-dqi-node-005:18091"]}; ---- ==== .Increasing the number of replicas ==== -Create an index on node 192.168.10.10 with replicas on nodes 192.168.10.*11* and 192.168.10.*12*, then increase the number of replicas to 4 and specify that new replicas may be placed on any available index nodes in the cluster. +Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then increase the number of replicas to 4 and specify that new replicas may be placed on any available index nodes in the cluster. [source,sqlpp] ---- CREATE INDEX country_idx ON airport(country, city) -WITH {"nodes": ["192.168.10.10:8091", "192.168.10.11:8091", "192.168.10.12:8091"]}; +WITH {"nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ALTER INDEX country_idx ON airport WITH {"action": "replica_count", "num_replica": 4}; @@ -519,32 +525,36 @@ WITH {"action": "replica_count", "num_replica": 4}; .Increasing the number of replicas and restricting the nodes ==== -Create an index on node 192.168.10.10 with replicas on nodes 192.168.10.*11* and 192.168.10.*12*, then increase the number of replicas to 4, and specify that replicas may now also be placed on nodes 192.168.10.*13* and 192.168.10.*14*. +Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then increase the number of replicas to 4, and specify that replicas may now also be placed on nodes `svc-dqi-node-004` and `svc-dqi-node-005`. [source,sqlpp] ---- CREATE INDEX country_idx ON airport(country, city) -WITH {"nodes": ["192.168.10.10:8091", "192.168.10.11:8091", "192.168.10.12:8091"]}; +WITH {"nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ALTER INDEX country_idx ON airport WITH {"action": "replica_count", "num_replica": 4, - "nodes": ["192.168.10.10:8091", - "192.168.10.11:8091", - "192.168.10.12:8091", - "192.168.10.13:8091", - "192.168.10.14:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091", + "svc-dqi-node-004:18091", + "svc-dqi-node-005:18091"]}; ---- ==== .Decreasing the number of replicas ==== -Create an index on node 192.168.10.10 with replicas on nodes 192.168.10.*11* and 192.168.10.*12*, then decrease the number of replicas to 1. +Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then decrease the number of replicas to 1. [source,sqlpp] ---- CREATE INDEX country_idx ON airport(country, city) -WITH {"nodes": ["192.168.10.10:8091", "192.168.10.11:8091", "192.168.10.12:8091"]}; +WITH {"nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ALTER INDEX country_idx ON airport WITH {"action": "replica_count", "num_replica": 1}; @@ -553,7 +563,7 @@ WITH {"action": "replica_count", "num_replica": 1}; .Dropping a specific replica ==== -Create an index with 2 replicas, and specify that nodes 192.168.10.10, 192.168.10.11, 192.168.10.12, and 192.168.10.13 should be available for index and replica placement. +Create an index with 2 replicas, and specify that nodes `svc-dqi-node-001`, `svc-dqi-node-002`, `svc-dqi-node-003`, and `svc-dqi-node-004` should be available for index and replica placement. Then delete replica 2. [source,sqlpp] @@ -561,10 +571,10 @@ Then delete replica 2. CREATE INDEX country_idx ON airport(country, city) USING GSI WITH {"num_replica": 2, - "nodes": ["192.168.10.10:8091", - "192.168.10.11:8091", - "192.168.10.12:8091", - "192.168.10.13:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091", + "svc-dqi-node-004:18091"]}; ALTER INDEX country_idx ON airport WITH {"action": "drop_replica", "replicaId": 2}; diff --git a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc index 2aecc2c00..3e88a6132 100644 --- a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc @@ -1,6 +1,5 @@ = ALTER VECTOR INDEX :description: The ALTER VECTOR INDEX statement moves the placement of an existing index or replica among different GSI nodes. -:page-edition: Enterprise Edition :page-status: Couchbase Server 8.0 :page-toclevels: 2 :imagesdir: ../../assets/images @@ -56,7 +55,7 @@ include::alterindex.adoc[tags=return-value] To try the examples in this section, you must do the following: . Create a cluster of 3 nodes. -The examples in this section assume that the 3 nodes have the IP addresses 172.19.0.2, 172.19.0.3, and 172.19.0.4. +The examples in this section assume that the 3 nodes have the names `svc-dqi-node-001`, `svc-dqi-node-002`, and `svc-dqi-node-003`. The nodes in your cluster may have different names or IP addresses. . Install the vector sample data as described in {prerequisites}[Prerequisites]. @@ -66,7 +65,7 @@ For more information, see xref:n1ql:n1ql-intro/queriesandresults.adoc#query-cont .Create and move an index from one node to another ==== -Create a Hyperscale Vector index on node 172.19.0.2. +Create a Hyperscale Vector index on node `svc-dqi-node-001`. [source,sqlpp] ---- @@ -75,15 +74,15 @@ CREATE VECTOR INDEX hyperscale_idx_move WITH {"dimension": 1536, "similarity": "L2", "description": "IVF8,SQ4", - "nodes": "172.19.0.2:8091"} + "nodes": "svc-dqi-node-001:18091"} ---- -Then move the index from its original node (172.19.0.*2* in this example) to a new node (172.19.0.*3* in this example). +Then move the index from its original node (`svc-dqi-node-001` in this example) to a new node (`svc-dqi-node-002` in this example). [source,sqlpp] ---- ALTER VECTOR INDEX hyperscale_idx_move ON rgb -WITH {"action": "move", "nodes": ["172.19.0.3:8091"]}; +WITH {"action": "move", "nodes": ["svc-dqi-node-002:18091"]}; ---- To check the node where the index is located, see xref:manage:manage-indexes/manage-indexes.adoc[]. @@ -91,7 +90,7 @@ To check the node where the index is located, see xref:manage:manage-indexes/man .Create and move an index replica from one node to another ==== -Create a Hyperscale Vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then move its replica from node 172.19.0.*3* to 172.19.0.*4*. +Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then move its replica from node `svc-dqi-node-002` to `svc-dqi-node-003`. [source,sqlpp] ---- @@ -100,16 +99,19 @@ CREATE VECTOR INDEX hyperscale_rep_move WITH {"dimension": 1536, "similarity": "L2", "description": "IVF8,SQ4", - "nodes": ["172.19.0.2:8091", "172.19.0.3:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091"]}; ALTER VECTOR INDEX hyperscale_rep_move ON rgb -WITH {"action": "move", "nodes": ["172.19.0.2:8091", "172.19.0.4:8091"]}; +WITH {"action": "move", + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-003:18091"]}; ---- ==== .Increase the number of replicas ==== -Create a Hyperscale Vector index on node 172.19.0.2 with a replica on nodes 172.19.0.*3*, then increase the number of replicas to 2 and specify that new replicas may be placed on any available index nodes in the cluster. +Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on nodes `svc-dqi-node-002`, then increase the number of replicas to 2 and specify that new replicas may be placed on any available index nodes in the cluster. [source,sqlpp] ---- @@ -118,7 +120,8 @@ CREATE VECTOR INDEX hyperscale_rep_multi WITH {"dimension": 1536, "similarity": "L2", "description": "IVF8,SQ4", - "nodes": ["172.19.0.2:8091", "172.19.0.3:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091"]}; ALTER VECTOR INDEX hyperscale_rep_multi ON rgb WITH {"action": "replica_count", "num_replica": 2}; @@ -127,7 +130,7 @@ WITH {"action": "replica_count", "num_replica": 2}; .Increase the number of replicas and specify the nodes ==== -Create a Hyperscale Vector index on node 172.19.0.2 with a replica on node 172.19.0.3, then increase the number of replicas to 2, and specify that replicas may be placed on nodes 172.19.0.*3* and 172.19.0.*4*. +Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then increase the number of replicas to 2, and specify that replicas may be placed on nodes `svc-dqi-node-002` and `svc-dqi-node-003`. [source,sqlpp] ---- @@ -136,20 +139,21 @@ CREATE VECTOR INDEX hyperscale_rep_increase WITH {"dimension": 1536, "similarity": "L2", "description": "IVF8,SQ4", - "nodes": ["172.19.0.2:8091", "172.19.0.3:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091"]}; ALTER VECTOR INDEX hyperscale_rep_increase ON rgb WITH {"action": "replica_count", "num_replica": 2, - "nodes": ["172.19.0.2:8091", - "172.19.0.3:8091", - "172.19.0.4:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ---- ==== .Decrease the number of replicas ==== -Create a Hyperscale Vector index on node 172.19.0.2 with replicas on nodes 172.19.0.*3* and 172.19.0.*4*, then decrease the number of replicas to 1. +Create a Hyperscale Vector index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then decrease the number of replicas to 1. [source,sqlpp] ---- @@ -158,7 +162,9 @@ CREATE VECTOR INDEX hyperscale_rep_decrease WITH {"dimension": 1536, "similarity": "L2", "description": "IVF8,SQ4", - "nodes": ["172.19.0.2:8091", "172.19.0.3:8091", "172.19.0.4:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ALTER VECTOR INDEX hyperscale_rep_decrease ON rgb WITH {"action": "replica_count", "num_replica": 1}; @@ -167,7 +173,7 @@ WITH {"action": "replica_count", "num_replica": 1}; .Drop a specific replica ==== -Create a Hyperscale Vector index with 2 replicas, and specify that nodes 172.19.0.2, 172.19.0.3, and 172.19.0.4 should be available for index and replica placement. +Create a Hyperscale Vector index with 2 replicas, and specify that nodes `svc-dqi-node-001`, `svc-dqi-node-002`, and `svc-dqi-node-003` should be available for index and replica placement. Then delete replica 2. [source,sqlpp] @@ -178,9 +184,9 @@ CREATE VECTOR INDEX hyperscale_rep_drop "similarity": "L2", "description": "IVF8,SQ4", "num_replica": 2, - "nodes": ["172.19.0.2:8091", - "172.19.0.3:8091", - "172.19.0.4:8091"]}; + "nodes": ["svc-dqi-node-001:18091", + "svc-dqi-node-002:18091", + "svc-dqi-node-003:18091"]}; ALTER VECTOR INDEX hyperscale_rep_drop ON rgb WITH {"action": "drop_replica", "replicaId": 2}; diff --git a/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc b/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc index ee718b729..fb40c0386 100644 --- a/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/auto-update-statistics.adoc @@ -1,6 +1,5 @@ = Auto Update Statistics :page-status: Couchbase Server 8.0 -:page-edition: Enterprise Edition :page-toclevels: 2 :description: Auto Update Statistics (AUS) automatically refreshes optimizer statistics, ensuring accurate and cost-effective query plans. @@ -9,43 +8,43 @@ == Overview -Auto Update Statistics (AUS) is a feature that keeps the optimizer statistics up to date by automatically identifying and refreshing outdated statistics. +Auto Update Statistics (AUS) is a feature that keeps the optimizer statistics up to date by automatically identifying and refreshing outdated statistics. Optimizer statistics are crucial as they help the xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc[Cost Based Optimizer] generate optimal query plans. -These statistics are initially created when you run the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement or build an index (available from 7.6.0 onwards). +These statistics are initially created when you run the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement or build an index (available from 7.6.0 onward). However, as data changes over time, the statistics can become stale, leading to sub-optimal query plans and reduced query performance. -To handle this, AUS executes a scheduled task on each query node in the cluster. +To handle this, AUS executes a scheduled task on each query node in the cluster. This task evaluates statistics based on expiration policies to identify outdated ones and then refreshes them by running the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement. -AUS can also optionally generate statistics for indexed expressions that do not already have them. +AUS can also optionally generate statistics for indexed expressions that do not already have them. NOTE: AUS maintains statistics only for expressions on index keys, and only for those indexed using the Plasma storage engine. -It does not support Memory-Optimized indexes. -For more information about these index storage types, see xref:indexes:storage-modes.adoc[]. +It does not support Memory-Optimized indexes. +For more information about these index storage types, see xref:indexes:storage-modes.adoc[]. [#availability] == Availability -AUS is available only in the Couchbase Enterprise Edition and on query nodes running version 8.0 or later. +AUS is available only in clusters running Couchbase Server version 8.0 or later. -* You can enable AUS in a cluster that has been fully migrated to 8.0, or in a cluster that includes both 7.6.x and 8.0 query nodes. -In such mixed clusters, the 7.6.x query nodes will not perform any AUS tasks. +* You can enable AUS in a cluster that has been fully migrated to 8.0, or in a cluster that includes both 7.6.x and 8.0 query nodes. +In such mixed clusters, the 7.6.x query nodes will not perform any AUS tasks. -* For clusters migrating from pre-7.6.x versions (to a configuration described above), the AUS task can only be enabled once the automatic migration of optimizer statistics to the `_query` collection in the `_system` scope of the buckets has been completed. +* For clusters migrating from pre-7.6.x versions (to a configuration described above), the AUS task can only be enabled once the automatic migration of optimizer statistics to the `_query` collection in the `_system` scope of the buckets has been completed. == How AUS Works -AUS is an opt-in feature that you must explicitly enable and schedule. -Once it is enabled and a schedule is set, all query nodes in the cluster participate in AUS, according to the same schedule. +AUS is an opt-in feature that you must explicitly enable and schedule. +Once it's enabled and a schedule is set, all query nodes in the cluster participate in AUS, according to the same schedule. === AUS Task Execution Each node receives its own AUS task, which performs the following actions during its scheduled window: -* The query node first selects specific collections for AUS processing, ensuring that no other query node updates the same collection during this period. +* The query node first selects specific collections for AUS processing, ensuring that no other query node updates the same collection during this period. -* Each selected collection then goes through two phases: <> and <>. -These phases process statistics gathered from expressions based on fields within that collection. +* Each selected collection then goes through two phases: <> and <>. +These phases process statistics gathered from expressions based on fields within that collection. * After AUS completes processing all statistics in all buckets, the query node schedules the next AUS run. @@ -75,9 +74,9 @@ database "Optimizer\nStatistics" as OptimizerStatistics start ..r..> AusEnabled : "Start \nAUS Process" AusEnabled -> ScheduledTask : "Yes" ScheduledTask -> CollectionSelection -CollectionSelection -> EvaluationPhase +CollectionSelection -> EvaluationPhase EvaluationPhase -> UpdatePhase -EvaluationPhase --> OptimizerStatistics +EvaluationPhase --> OptimizerStatistics UpdatePhase --> OptimizerStatistics UpdatePhase ..r..> end @@ -86,29 +85,29 @@ UpdatePhase ..r..> end === Evaluation Phase -In this phase, AUS evaluates whether existing statistics are stale based on the <>. +In this phase, AUS evaluates whether existing statistics are stale based on the <>. For each index, AUS assess how much data has changed since the last update of the optimizer statistics for the index's key expressions. If the percentage of change exceeds the defined threshold in the <>, the statistics are marked as stale. -Additionally, if configured to do so, this phase also identifies any indexed expressions that currently lack statistics and flags them for creation. +Additionally, if configured to do so, this phase also identifies any indexed expressions that currently lack statistics and flags them for creation. You can control this setting using the `create_missing_statistics` attribute in the <> catalog. === Update Phase -After the evaluation, AUS executes xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statements to refresh the statistics identified as stale. +After the evaluation, AUS executes xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statements to refresh the statistics identified as stale. When updating the existing statistics, AUS ensures that the refreshed statistics maintain the original xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution] at which they were collected. Also, if the `create_missing_statistics` option is set to `true`, AUS creates new optimizer statistics for indexed expressions that were flagged as missing during the evaluation phase. -The new statistics are created with the default xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution]. +The new statistics are created with the default xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution]. IMPORTANT: When AUS is first enabled, the initial task run might update all existing optimizer statistics, regardless of the expiration policy evaluation. -This is because the index change information might not have been recorded prior to this first run. +This is because the index change information might not have been recorded prior to this first run. [#expiration_policy] === Expiration Policy AUS uses expiration policies to determine when statistics are outdated and require an update. -The policy is based on the percentage of changes to data within an index. +The policy is based on the percentage of changes to data within an index. You can configure this value using the `change_percentage` attribute in the <> or <> catalogs. It defines how much data in an index must change before the statistics are considered outdated. @@ -120,7 +119,7 @@ The subsequent AUS operation then updates these statistics. To start using AUS for your cluster, you need to enable it and configure a schedule. You can configure AUS to run during off-peak hours or at specific times that align with your workload patterns. -AUS maintains its global configurations in the <> catalog. +AUS maintains its global configurations in the <> catalog. You can enable AUS and set its schedule by modifying the relevant configurations within this catalog. If you need more granular control, use the <> catalog to customize certain AUS configurations at the bucket, scope, and collection levels. @@ -132,17 +131,17 @@ For more information, see <>. === system:aus The `system:aus` catalog contains a single document that holds all the global configurations of AUS. -You can update this document to modify the settings. +You can update this document to modify the settings. [NOTE] ==== * Only SELECT and UPDATE DMLs are allowed on this keyspace. * To execute SELECT on `system:aus`, you need the `query_system_catalog` role. -* To execute UPDATE on `system:aus`, you need the `query_manage_system_catalog` role. +* To execute UPDATE on `system:aus`, you need the `query_manage_system_catalog` role. ==== -Each attribute in the document represents a particular global configuration. -The following are the attribute names and the configurations they represent: +Each attribute in the document represents a particular global configuration. +The following are the attribute names and the configurations they represent: [cols="1a,4a,1a"] |=== @@ -171,7 +170,7 @@ This attribute is required only if `enable` is set to `true`. | **change_percentage** + __required__ -| The percentage of change to items within an index that must be exceeded for the statistics to be refreshed. +| The percentage of change to items within an index that must be exceeded for the statistics to be refreshed. This is the threshold for determining whether the statistics are stale or not. The value must be an integer between `0` and `100`. @@ -180,9 +179,9 @@ For example, a value of `30` means that if 30% or more of the items in an index *Default:* `10` -| Integer +| Integer -| **all_buckets** + +| **all_buckets** + __required__ | Indicates whether AUS should be performed on all buckets or only those buckets whose metadata information is loaded on the query node. @@ -194,7 +193,7 @@ __required__ | **create_missing_statistics** + __required__ -| Indicates whether AUS should create statistics that are missing. +| Indicates whether AUS should create statistics that are missing. If set to `true`, AUS creates statistics for indexed expressions that do not have any existing statistics. The statistics will be created using the default value for the xref:n1ql:n1ql-language-reference/cost-based-optimizer.adoc#resolution[resolution] property. @@ -207,7 +206,7 @@ The statistics will be created using the default value for the xref:n1ql:n1ql-la [[aus_schedule]] -==== Schedule +==== Schedule [cols="1a,4a,1a"] |=== | Name | Description | Schema @@ -225,7 +224,7 @@ The `start_time` must be at least 30 minutes earlier than the `end_time`. | **end_time** + __required__ -| The end time of the AUS schedule in "HH:MM" format. +| The end time of the AUS schedule in "HH:MM" format. The `end_time` must be at least 30 minutes later than the `start_time`. @@ -235,9 +234,9 @@ The `end_time` must be at least 30 minutes later than the `start_time`. | **days** + __required__ -| An array of strings specifying the days on which the AUS schedule runs. +| An array of strings specifying the days on which the AUS schedule runs. -Valid values include: `Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday`, `Saturday`, `Sunday`. +Valid values include: `Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday`, `Saturday`, `Sunday`. *Example:* `["Saturday", "Sunday"]` @@ -246,7 +245,7 @@ Valid values include: `Monday`, `Tuesday`, `Wednesday`, `Thursday`, `Friday`, `S | **timezone** + __optional__ -| The timezone that applies to the schedule's start and end times. +| The timezone that applies to the schedule's start and end times. The value must be a valid IANA timezone string. *Default:* `"UTC"` @@ -257,7 +256,7 @@ The value must be a valid IANA timezone string. |=== -When changing the global configurations, it is important to consider the following: +When changing the global configurations, it is important to consider the following: * *Enabling AUS*: If AUS was previously disabled and is now enabled, the next AUS task will be scheduled immediately. * *Rescheduling AUS*: Currently scheduled AUS task will be cancelled, and a new AUS task will be scheduled according to the updated schedule. @@ -272,10 +271,10 @@ A sample UPDATE statement to enable AUS and set a schedule with some customizati [source,sqlpp] ---- UPDATE system:aus SET enable = true, change_percentage = 20, -schedule = { "start_time": "01:30", - "end_time": "04:30", - "timezone": "Asia/Calcutta", - "days": ["Monday", "Friday"] +schedule = { "start_time": "01:30", + "end_time": "04:30", + "timezone": "Asia/Calcutta", + "days": ["Monday", "Friday"] }; ---- ==== @@ -283,17 +282,17 @@ schedule = { "start_time": "01:30", [#system_aus_settings] === system:aus_settings -The `system:aus_settings` catalog stores granular configuration settings for AUS. +The `system:aus_settings` catalog stores granular configuration settings for AUS. These settings can be applied at the bucket, scope, and collection levels. -By default, this catalog has no documents, and the AUS settings for all keyspaces inherit the configurations defined at the global level. +By default, this catalog has no documents, and the AUS settings for all keyspaces inherit the configurations defined at the global level. In other words, unless you explicitly configure AUS for a specific keyspace, it will use the global AUS settings defined in <>. To customize AUS for a specific keyspace, you must insert a settings document into the `system:aus_settings` catalog. -The document ID of a document in this keyspace must be the full path of the bucket, scope, and collection. +The document ID of a document in this keyspace must be the full path of the bucket, scope, and collection. -Each attribute in the document represents a particular granular configuration. -The following are the attribute names and the configurations they represent: +Each attribute in the document represents a particular granular configuration. +The following are the attribute names and the configurations they represent: [cols="1a,4a,1a"] |=== @@ -302,15 +301,15 @@ The following are the attribute names and the configurations they represent: | **enable** + __optional__ | Indicates whether AUS is enabled for the bucket, scope, collection. + -Set it to `true` to enable AUS for the keyspace. +Set it to `true` to enable AUS for the keyspace. AUS settings are hierarchical and follow the order: cluster > bucket > scope > collection. + -If AUS is disabled at higher level, it cannot be enabled at a more granular level. +If AUS is disabled at higher level, it cannot be enabled at a more granular level. However, if AUS is enabled at a higher level, it can be disabled at a more granular level. For example, -- -* If AUS is disabled for a bucket, it is automatically disabled for all scopes and collections within it. +* If AUS is disabled for a bucket, it is automatically disabled for all scopes and collections within it. The setting cannot be overridden at the scope or collection level. * If AUS is enabled for a bucket, it can be overridden at the scope and collection level. -- @@ -320,11 +319,11 @@ The setting cannot be overridden at the scope or collection level. | **change_percentage** + __optional__ -| The percentage of change to items within an index that must be exceeded for the statistics to be refreshed. +| The percentage of change to items within an index that must be exceeded for the statistics to be refreshed. The value must be an integer between `0` and `100`. -If set at a bucket level, this value applies to all scopes and collections within the bucket, unless overridden at a lower level. +If set at a bucket level, this value applies to all scopes and collections within the bucket, unless overridden at a lower level. If set at a scope level, this value applies to all collections within the scope, unless overridden at a lower level. @@ -335,13 +334,13 @@ If set at a scope level, this value applies to all collections within the scope, | **update_statistics_timeout** + __optional__ -| The timeout period for the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] command. -It is a number representing a duration in seconds. +| The timeout period for the xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] command. +It's a number representing a duration in seconds. -If the command does not complete within this duration, it times out. +If the command does not complete within this duration, it times out. If omitted, a default timeout value is calculated based on the number of samples used. -If set for a keyspace, this timeout applies to every xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement that AUS executes for that keyspace. +If set for a keyspace, this timeout applies to every xref:n1ql:n1ql-language-reference/updatestatistics.adoc[] statement that AUS executes for that keyspace. If set at a bucket level, this timeout applies to all scopes and collections within the bucket, unless a different value is set at a lower level. @@ -353,14 +352,14 @@ If set at a scope level, this timeout applies to all collections within the scop [NOTE] ==== -* All SQL++ DMLs are allowed on this keyspace. +* All SQL++ DMLs are allowed on this keyspace. * To execute SELECT on `system:aus_settings`, you need the `query_system_catalog` role. * To execute UPDATE, DELETE, INSERT, and UPSERT on `system:aus_settings`, you need the `query_manage_system_catalog` role. ==== ==== Example -==== -A sample query to add a scope level setting that applies to all collections within the scope. +==== +A sample query to add a scope level setting that applies to all collections within the scope. .Query [source,sqlpp] @@ -387,7 +386,7 @@ To view all recent AUS tasks, use the following query: SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics"; ---- -This query returns all AUS entries regardless of their state (scheduled, running, completed, etc.). +This query returns all AUS entries regardless of their state (scheduled, running, completed, etc.). To get the details of completed tasks, see <>. === Find Scheduled AUS Tasks @@ -400,13 +399,13 @@ SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics" AND stat ---- === View AUS Tasks on a Particular Node - -To view recent AUS tasks on a particular node, filter by the `node` attribute. + +To view recent AUS tasks on a particular node, filter by the `node` attribute. [source,sqlpp] ---- -SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics" - AND state = "scheduled" +SELECT * FROM system:tasks_cache WHERE class = "auto_update_statistics" + AND state = "scheduled" AND node = "127.0.0.1:8091"; // Replace with the actual node address ---- @@ -469,14 +468,14 @@ You can cancel AUS tasks that are currently running or scheduled to run. * <> * <> -CAUTION: When cancelling AUS tasks, it is important to include appropriate WHERE clauses to specify exactly which tasks you want to cancel. +CAUTION: When cancelling AUS tasks, it's important to include appropriate WHERE clauses to specify exactly which tasks you want to cancel. Make sure your filters target only the intended tasks, otherwise they might inadvertently cancel other tasks or delete task history. [#cancel_running_aus_tasks] === Cancel Running AUS Tasks To cancel a running AUS task, delete its entry from the `system:tasks_cache` catalog. -When you delete a task that is in the `scheduled` or `running` state, AUS cancels the task and schedules the next one automatically. +When you delete a task that's in the `scheduled` or `running` state, AUS cancels the task and schedules the next one automatically. To cancel all running AUS tasks, use the following DELETE statement: @@ -489,16 +488,16 @@ To cancel a running AUS task on a specific node, include the node's address in t [source,sqlpp] ---- -DELETE FROM system:tasks_cache - WHERE class = "auto_update_statistics" - AND state = "running" +DELETE FROM system:tasks_cache + WHERE class = "auto_update_statistics" + AND state = "running" AND node = "127.0.0.1:8091"; // Replace with the actual node address ---- [#cancel_next_scheduled_aus_tasks] === Cancel Next Scheduled AUS Tasks -To cancel an upcoming scheduled AUS task, you need to temporarily modify its schedule in the `system:aus` catalog. +To cancel an upcoming scheduled AUS task, you need to temporarily modify its schedule in the `system:aus` catalog. After the scheduled time has passed, you can revert it to its original schedule. ==== Temporarily Update the Schedule @@ -506,7 +505,7 @@ After the scheduled time has passed, you can revert it to its original schedule. First, identify the specific AUS task you want to skip or cancel. Then, use an UPDATE statement to exclude the day or time from its schedule. -For example, if your AUS tasks run on Monday, Wednesday, and Friday, and you want to cancel the upcoming Monday run: +For example, if your AUS tasks run on Monday, Wednesday, and Friday, and you want to cancel the upcoming Monday run: [source,sqlpp] ---- @@ -515,10 +514,10 @@ UPDATE system:aus SET schedule.days = ["Wednesday", "Friday"]; ==== Revert the Schedule -After the day and time for the cancelled task have passed, you can revert the schedule to its original settings. +After the day and time for the cancelled task have passed, you can revert the schedule to its original settings. This allows your AUS tasks to resume their regular schedule for all subsequent runs. -For example, to restore the Monday, Wednesday, and Friday schedule after skipping the Monday run: +For example, to restore the Monday, Wednesday, and Friday schedule after skipping the Monday run: [source,sqlpp] ---- @@ -528,10 +527,10 @@ UPDATE system:aus SET schedule.days = ["Monday", "Wednesday", "Friday"]; == Manage AUS Load When an AUS task runs, it can increase the load on the query node as it evaluates and updates statistics. -Therefore, to minimize performance impact, it is important to schedule AUS to best suit the workloads of your cluster. +Therefore, to minimize performance impact, it's important to schedule AUS to best suit the workloads of your cluster. To prevent excessive load, the AUS task will not start if the query node's load is too high during the scheduled window. -In such cases, the task is skipped, and the next AUS task is scheduled. +In such cases, the task is skipped, and the next AUS task is scheduled. == Related Links diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index 890ba404a..9a073ddc1 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -8,7 +8,7 @@ :authorization-overview: xref:server:learn:security/authorization-overview.adoc :index-replication: xref:indexes:index-replication.adoc#index-replication -:console-indexes: xref:server:manage:manage-ui/manage-ui.adoc#console-indexes +:console-indexes: xref:clusters:index-service/manage-indexes.adoc :query-context: xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context :build-index: xref:n1ql-language-reference/build-index.adoc :identifiers: xref:n1ql-language-reference/identifiers.adoc @@ -578,11 +578,9 @@ For details and examples, see {operator-pushdowns}[Operator Pushdowns]. [[index-replicas]] === Index Replicas -In the {console-indexes}[Indexes screen in the Couchbase Web Console], index replicas are marked with their replica ID. +In the {console-indexes}[Indexes page in the Couchbase Capella UI], index replicas are marked with their replica ID. -image::create-index-replica-id.png["The Indexes screen showing an index and index replica with replica ID"] - -If you select `view by server node` from the drop-down menu, you can see the server node where each index and index replica is placed. +To see the nodes where an index and its replicas are placed, click the name of an index or index replica to display the index definition. You can also query the {querying-indexes}[system:indexes] catalog to find the ID of an index replica and see which node it's placed on. diff --git a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc index 80e10e769..cad85ae6f 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createprimaryindex.adoc @@ -276,8 +276,11 @@ It's possible that the indexer may throw scan timeout without returning any prim For example, if the indexer cannot find a snapshot that satisfies the consistency guarantee of the query within the timeout limit, it will timeout without returning any primary keys. For secondary index scans, the query engine does not handle scan timeout, and returns index scan timeout error to the client. -You can handle scan timeout on a secondary index by increasing the indexer timeout setting (see -{query-settings}[Query Settings]) or preferably by defining and using a more selective index. +You can handle scan timeout on a secondary index by +ifdef::flag-devex-rest-api[] +increasing the indexer timeout setting (see {query-settings}[Query Settings]), or preferably by +endif::flag-devex-rest-api[] +defining and using a more selective index. == Examples diff --git a/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc b/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc index 8d2fdb0a3..991c3b414 100644 --- a/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/index-partitioning.adoc @@ -598,8 +598,10 @@ For example: * A cluster has a mix of non-partitioned indexes and partitioned indexes. * There is data skew in the partitions. -In Couchbase Capella, the [def]_index redistribution_ setting enables you to specify how Couchbase Capella redistributes indexes on rebalance. -For further details, refer to {rebalancing-the-index-service}[Rebalancing the Index Service]. +ifdef::flag-devex-rest-api[] +The index redistribution setting enables you to specify how Couchbase Capella redistributes indexes automatically on rebalance. +endif::flag-devex-rest-api[] +For more information, see {rebalancing-the-index-service}[Rebalance]. == Repairing Failed Partitions From 2c0570f65c9ca9761a48435d6f72e59ad884485b Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Tue, 14 Oct 2025 13:46:56 +0100 Subject: [PATCH 68/80] DOC-13634: Fix Developer Intro page (#451) * Add Vector Indexes to Developer Intro page * Add Migration Tutorial to server Developer Intro page * Fix Migration Tutorial: no empty headings in navigation --- modules/develop/pages/intro.adoc | 24 +++++++++---------- .../sql-migration-tutorial-capella.adoc | 6 ++--- modules/tutorials/partials/nav.adoc | 4 +--- 3 files changed, 15 insertions(+), 19 deletions(-) diff --git a/modules/develop/pages/intro.adoc b/modules/develop/pages/intro.adoc index eef28f590..122f743b5 100644 --- a/modules/develop/pages/intro.adoc +++ b/modules/develop/pages/intro.adoc @@ -31,6 +31,12 @@ This tutorial provides an introductory worked example for developers, showing ho * xref:tutorials:couchbase-tutorial-student-records.adoc[] +== Migration Tutorial + +This tutorial demonstrates how to migrate your data from a MySQL server over to Couchbase Capella. + +* xref:tutorials:migration-tutorial-capella/sql-migration-tutorial-capella.adoc[] + == Connect Choose how you want to connect your app to Couchbase Capella. @@ -49,17 +55,17 @@ Use the Query Service and the Index Service to issue {sqlpp} queries to extract * xref:n1ql:query.adoc[] -== Vector Search +== Vector Indexes -Vector Search builds on the Search Service to provide support for vector indexes. +The Query Service, the Index Service, and the Search Service provide support for vector indexes. You can use vector indexes with existing Large Language Models to develop AI applications. -* xref:vector-search:vector-search.adoc[] +* xref:vector-index:vectors-and-indexes-overview.adoc[] == Search -Use the Search Service for full-text search with natural language processing across multiple data types and languages. -Use custom text analysis, Geospatial search, and more. +Use the Search Service for Full-Text Search with natural language processing across multiple data types and languages. +Use custom text analysis, geospatial search, and more. * xref:search:search.adoc[] @@ -93,10 +99,4 @@ Couchbase offers numerous software development kits (SDKs) that provide programm Integrations that Couchbase or partners have developed to enhance Couchbase, Capella, and partner services -- a vital tool for many larger development projects. -* xref:third-party:integrations.adoc[] - -== Migration - -A tutorial exercise demonstrating how to migrate your data from a MySQL server over to Couchbase Capella. - -* xref:tutorials:migration-tutorial-capella/sql-migration-tutorial-capella.adoc[] +* xref:third-party:integrations.adoc[] \ No newline at end of file diff --git a/modules/tutorials/pages/migration-tutorial-capella/sql-migration-tutorial-capella.adoc b/modules/tutorials/pages/migration-tutorial-capella/sql-migration-tutorial-capella.adoc index 651a7a319..be382c7ed 100644 --- a/modules/tutorials/pages/migration-tutorial-capella/sql-migration-tutorial-capella.adoc +++ b/modules/tutorials/pages/migration-tutorial-capella/sql-migration-tutorial-capella.adoc @@ -1,8 +1,6 @@ -= Migrating your Data from MySQL to Capella -:description: Using MySQL as a starting point, this guide demonstrates \ -how to migrate your existing data from SQL tables to a Couchbase Capella instance. += Migration Tutorial: Migrate your Data from MySQL to Couchbase Capella +:description: Using MySQL as a starting point, this guide demonstrates how to migrate your existing data from SQL tables to a Couchbase Capella instance. :page-topic-type: tutorial -:page-pagination: full [abstract] {description} diff --git a/modules/tutorials/partials/nav.adoc b/modules/tutorials/partials/nav.adoc index 44dd6f91b..8ea2d0747 100644 --- a/modules/tutorials/partials/nav.adoc +++ b/modules/tutorials/partials/nav.adoc @@ -5,6 +5,4 @@ ** xref:tutorials:java-tutorial/retrieving-documents.adoc[] ** xref:tutorials:java-tutorial/adding-course-enrollments.adoc[] ** xref:tutorials:java-tutorial/tutorial-troubleshooting.adoc[] -* Migration Tutorial - ** xref:tutorials:migration-tutorial-capella/sql-migration-tutorial-capella.adoc[] - \ No newline at end of file +* xref:tutorials:migration-tutorial-capella/sql-migration-tutorial-capella.adoc[Migration Tutorial] \ No newline at end of file From e039398f0905da2ae678c117c9fdce197d944224 Mon Sep 17 00:00:00 2001 From: rao-shwe Date: Tue, 14 Oct 2025 19:56:06 +0530 Subject: [PATCH 69/80] GSI Vector Index-Hyperscale indexes doc changes (#450) --- modules/vector-index/pages/hyperscale-filter.adoc | 2 +- modules/vector-index/pages/hyperscale-reranking.adoc | 2 +- .../vector-index/pages/vectors-and-indexes-overview.adoc | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/vector-index/pages/hyperscale-filter.adoc b/modules/vector-index/pages/hyperscale-filter.adoc index a2a752e2b..273eaf924 100644 --- a/modules/vector-index/pages/hyperscale-filter.adoc +++ b/modules/vector-index/pages/hyperscale-filter.adoc @@ -2,7 +2,7 @@ :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} -:description: You can reduce the number of vectors a query that uses a Hyperscale Vector index by adding scalar values. +:description: You can reduce the number of vectors for a query that uses a Hyperscale Vector index by adding scalar values. :stem: :page-toclevels: 3 :index-name: Hyperscale Vector index diff --git a/modules/vector-index/pages/hyperscale-reranking.adoc b/modules/vector-index/pages/hyperscale-reranking.adoc index 56c1d77fb..a245ed001 100644 --- a/modules/vector-index/pages/hyperscale-reranking.adoc +++ b/modules/vector-index/pages/hyperscale-reranking.adoc @@ -17,7 +17,7 @@ This reranking can make the most relevant vectors to the search vector appear hi == Enabling Reranking -To enable reranking, your index must have a copy the full vector value in addition to the quantized value. +To enable reranking, your index must have a copy of the full vector value in addition to the quantized value. The `CREATE VECTOR INDEX` statement adds this copy of the full vector value to the index by default. Queries do not perform reranking by default. diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc index 47e35666d..f25d1cfeb 100644 --- a/modules/vector-index/pages/vectors-and-indexes-overview.adoc +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -24,9 +24,9 @@ Vectors for dissimilar data (articles discussing two different topics for exampl === Finding Semantically Similar Text Data By comparing two vectors, you can find the similarity between the two pieces of data they represent. -This similarity goes beyond just finding parts of the data that's identical (for example, finding similar words in two pieces of text). +This similarity goes beyond just finding parts of the data that are identical (for example, finding similar words in two pieces of text). The vectors represent features such as the meaning of text rather than just superficial similarities. -When two pieces of data have similar vectors, they have semantically related (having similar meanings or subjects). +When two pieces of data have similar vectors, they are semantically related (having similar meanings or subjects). For example, suppose you have three text articles. The first is about feral cats, the second about domestic cats, and the third is about the UNIX/Linux `cat` command. @@ -67,7 +67,7 @@ Comparing the vectors is more manageable and actually results in finding similar == Embedding Vectors Embedding is the process of generating vectors that represent a piece of complex unstructured data. -You use an embedding model that's specific to the data's type to generate a vector to represent it. +You use an embedding model that's specific to the type of data to generate a vector to represent it. For example, to generate vectors from text, you can use models such as https://en.wikipedia.org/wiki/Word2vec[Word2Vec^], https://en.wikipedia.org/wiki/GloVe[Global Vectors for Word Representation (GloVe)^], or https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2[all-MiniLM-L6-v2^]. These models take into account the context around each portion of the text when generating a vector. @@ -399,7 +399,7 @@ For indexes using SQ quantization, the range of values in the dimensions may not If one or more dimensional values fall outside the range that SQ assigns bins to, they get assigned to the closest bin, which may not properly represent the value. As your dataset changes, these inaccuracies can build, skewing results. -Over time, may find your vector search's recall (percentage of the nearest neighbors of the search vector returned by a query) decreases. +Over time, you may find the recall of vector search (percentage of the nearest neighbors of the search vector returned by a query) decreases. Searches for similar vectors may miss relevant results or may rank less-related vectors higher than more relevant results. These inaccuracies can occur because the data in the dataset changes over time as you add and remove documents. The centroids identified by PQ and IVF may no longer adequately reflect the data in your database. From 695e2c7dc66a687de33ea9b2233305a375e049b2 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Thu, 16 Oct 2025 09:50:31 +0530 Subject: [PATCH 70/80] [DOC-9906] IS DISTINCT FROM Operator (#431) --- .../n1ql-language-reference/is-expr.png | Bin 22890 -> 30155 bytes .../comparisonops.adoc | 66 +++++++++++++++++- modules/n1ql/partials/grammar/n1ql.ebnf | 3 +- 3 files changed, 67 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/assets/images/n1ql-language-reference/is-expr.png b/modules/n1ql/assets/images/n1ql-language-reference/is-expr.png index 73595099c8dff09fbd62beb672bd25ef9beea3d1..d2f527c99d97d58ed284a399c648815c815fa187 100644 GIT binary patch literal 30155 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 z zl9?C*jV5BKYcR^(hs+UhS%zx@g82D9S8vIl?GIEJYeD=41Hd;SzbEi}R-^k_4$5_S znGjN}^6wAA(IZyeNuJKrdR&+Y2JDQS_6q|IPTtm2f0H2nsU-XNt`eEaJ- zY=6%FE9z$Fv!ZW9TinO(;i>JK3AfyCtps1|9lNgU;|8dtm7ZQmLYgwd>Ip8P#3~P- zSg|={yi!_Z0b_5Jnd|2CC|yN;vfW9ct;)i!9)6i7#ScE>j_GdLRd(jC6*8`dc;&#j z-)Oc zD3DT3cP$P!*;qZ@FN%w6!h6#zcG#IM!vjY82oul0kj?aG zaVThLyBIU8(fIEI+>KK6)=lJa)ls0~n%`qkD#<51U;Qq5*5=XRbSbT-7x13MBs zn5%uoXIBd2Y|q_fW*-+Y0Whx-H5X0D{A4YHg~b7tTq-n@Zwy3H8#-3&4V|Z*XJ;z| zn6M5_oAfb3`{_E1QyvR(9MJna{)(fYm7jxiw*XIx;wv|<2SU)z`XOrQ_k*1;52HK# zZX#b!%yyJ%TT2I@WSrUDlguR!r6B<p2aV?rsZ1!6KMx8X(Aef3r1p@u}ZJ_@hB?B%c1+7uI;1Mr0JN zKy6~!6e`|}76tqp$P(p+$`-Q;-F_*NshgJmA5Vf2GD6lbf^_ktcipxG$?MfwcYQ@- z3(bXh8hd=y+wzde?O^R_0ZQPG&#};r>a@<>x;t0Gx0R7`^Ijz_;mrP@(apul86oLZ zKOg~rV1IVM@JMDZh><*6ykfzlCkC-K3hRjZ)TG_F0@Hx%_-Qn`5&tVQOgYUQmAvbL z3I3YOCDm8^>-e@a?wlU6bbY)@SzF;$9Ox+Y z8kZiCBa)uF#8iSz3X3+5MpDxQrPnIK@}lBAGHjs9b!GE2VZJXoM5Z5nOz7A5a#(Om zq>9NwNL$zYO|U>#;(7cm1L$an>Y-+?Ge;(JjHpR6R(E|SefreS08%}x^9sbPJq{mx zihRAE`wQv1{m zgteh7ej24hv9tRm@s#FR0&{FBN44jtZX8*-uI1{bt@QGMtaC+-*DJBAn#zwDTLI1+ z)pyOJs{wG`NhqpvDo{tW251%A)y3%SH7d1ND68=&YD@*lJ&@d+&w9RS#1SSshzFcr zwPT3OooWO=xaowQ(YlCY2NaNV-jE@TX*?JjIpnJHEyr87ZwB~%mzOes2F^zhWPAIj z#K6_fIb017kcA_S8C;N1cQ}-Spe4A{yyirN;wj%jjs^*fxpDXCWTY0?- z2+?Ui8jzp$ZEi{Ld0_gc!{%=w7yG3(C;HStql7;vg^zL*{whsaO1gOyN@RA^?a^CJ z$)#p+Rb!(VNlplvA-MLdM4d0Y@tSHljQVBgOCQyQ97nTAgBDw%mDaQMNIpdK-6fH78Q3OY$hWy<~k-(OI4e;_S@jj zTu0N~jV1=`L2hxs1~k%y{jk;RchyXYQR-2Zf@HLsIP+O}bb83-g1&d%wbBb<>aM9= zo64IFb~2nZ_7&At(5-ko`@q!H*mrDGP=0;*!=WYLXXhJ9JRH;EK|vwsSjvPbVj)CH zuZ+wuZpaqX@!Y6d#Pfx@hJ#ru%ztNns?q z*KqeMm!qGK?0OU2Z;^d9MO}Wh`#?w)6=ouYd(YLiHJqGRQiBnp8j^`nHzuN1+B~i+ z!sFc$?J0ftlkPcsgJdcLgJk^m)TQS~8??q%J#V*^otLxhbZ4cb_a4JtLuH-bmx?ih z*}ZvGV08N0EFuLXD5sI!IHCd;X%=-emiZQ0;>B@!Gajw%yg$>pN<5JmElna)+-kSK zryzWSW*HPBzt?r@m0bD@sfS2a9h?S0w1gz)WLsz-yyOV>SQx&f?csQ(tvoEs1GnZ5xozDZv1r+(=B_C) ziT*DyfU!RnmL}cNwXir@eBQ0%`8)Pz5CS9~-?6uL?Re3ru4lHG-g3LhzTCs$OK)qC zbP#eq%)WlwLIDL9DpG3cl3BW1YNPen&&>2uLj!XM#JF!8bsYEBj)lb)0a^scn;`3~ zZcQxd1r^8k8fdT8KAe?z_40FBqD9c^1nT+#<&En61i zgH($c8w)+6H$ssEc?~5oE!ULSnW-}13;KA3csMd&lO^{C%JgGt>RVt7 zt@D?(eLWo0%}Y!It>8Xn(k6wX`idN)8sO&y)FP&emvaEPE-5D(79YeJMR9*b2#WQa zYE}ZPxiL0DwKo4#EsON*sAi?%nxR^UqByn=;==^Qwo#^1O#%*SeL?_WHE~Q<<(=F$ zN&pb|)f_2Wpz_7R88bw=EdDqVZnJ20e!cUXj+gB(M*tLA_U6>Wu6_mmD&eLLA#15F zi;sD2c&tVgvOm^N6|Xgglu<~vkgdQvKxPP_$1Q9}E41T?kv$!C``JtIiQ*y31(Q>T zao@$NFVl|a2yYSA#SVk^{t3BJzTLmykbHOma)653a4atvVkl;Wqf)@?1O6szIs74> zGS^2MX=*Iw4-@NE?0LEoyTM)nnG#G({SPsYx$|mTr_QS`tK+BFTRo~p(T($NUGRQy z$b(*OZePf1u@+tZvxyqLLGPqU)f5$eq-b|&FCC(mf|@7@LyJ4OD~PMcfF8xKh39gBFZj_QH}Hhn!KQe1V32Q(WyH$J(eiJiK~GGMfm zFbppmBQb0EhplGNXz)S=TtDIl80wq=vCxJbl`{wJkTU~x7<#20sfpJ|YGK~PI}nR< zHf3R#GPvMm88bu~RKLnfSJ|nT63Jx{NJz$uYr|0aiv2R|Ed?a~t%aF5vqNV)W7p|+ z2le}=1)O6-Q~E<%RH^LB2&n^%qG70*s00qDNk(h56dyRl6=tp1$)tKEDK~x;{%c#} z5wv^gHLCvVqvN*>gVQfFP108S;c@+48^yPP^Z}*Z&y8PYq||XI@ACF1O?hZK{T!Gn z>P;*vC=;h9)46%C?JlopdtmFM4{iAf-M&j5(sjFQuz!g!RP>UoKA>I8g%G`&xQ z!l~)HT;J*HcUd*#EIJ+nn%Vg3F!Gum`lT(2!2gVqvLR{gi@i{ zo%vfJ_bf%Ee`mtizZ6OiptH3`ud=b|o)Zi&=eiX71O~!*e7CiGICPUSjvF&(y%}wx z^AfJ?t3KkdO4T*pjk@K})IDR=if44kj-3)NvA*t!=XJOHm}RsFHqKlUSWnueQjp7C zeO*I^OqY~0&n7s1tu~+ny#@e!qw~=q;GDu4yfM;;o3Fa!WD6+AXszsdwRK=r=`D4R$Wmn1 z1g7Qkx<$NP9uF|yWyKHtQ}X?w+pKVxLhOUN<8y2mbWC-%oh1^~!JD0TqzcEHXRxwK1Q%^YM*O?co;R4Gn(p`gh;Cfwm)#LoeAsqx!vp*f+~ zCP0LQdT?swzI^jsVGOd{KIof{$S07JN-NXX0Itme=Yva$=$O>}46jVAogIU+dwbps z2X8H2Ccr<8PIv;!=-+hLg|>`G-X^^?=ZU3uvNAft-mSkjS~QMnwo&-xK`_l4fiIz5 zTH51qJ~!}7iAzK`8eCnb0##m_5J33=jMT+arZS>)N^}Xouj*yK#-=9h&aa*uy8c&1 zY8Z6!`f2FiZomqWEDV;i!s#ALY*+DMYGzhTm+UGNtRiU8e7B|&Qn{K0eh|?JQ~XyW z=dPy{0#DRveu&a}DaknM0r73#(iSISvkM&`Mo?M$(Zf8HlHvDdC zACccoMf8z(2Hr(7_zOuS#MG4VuJB~3>=4gy5}YImQ#xFAWtnWSQci>_4f;nCjnS%N zNUT-GEZ!QfHBq5b4g3>Vi}*V)*CABLTuy;j%mcKK09NA4j_a(m831#mGzG3!Lg6t`c}Z^Rgo2X(A1q%2Y9-K{zAF*1GundQ?qnwu`g7}^)fKMT} ze0ljH>+|Ih_3)J7zjN&0WcyFd{ZH`y2j-@Aq}bhE3b^^8Bh9sF|%#soGgxH@PE;Br?M4n#S=%qsv=$$wc zD3>um30V3hI9DsK1ySP<7+QY2Xo<}hUqi0B_t`c0tqVuS*<9!SE%Dbezjh3}^kQ+s zFRa4gSU6Z!%uBua26T5HEzY7K3Drd#3pil2p>QRo(8;SDZXW4j!=KDgO8s6wcqH;R@}LjD-x?Ak z*~cd8xKduat$Au#p1s?!qwBS24=qZlSPJB-($&Ea5CqHFg?t`-_zIT)#kc4Fm2b=a z&9@CQ@ww?Vq7X?R{x`hs|F3wPOXG7v5(44|rSZzwmb6 zzsK81{{wIH|Np_;32r!EAyLlgGs~aLB~0abPjGJG)|zL>+9Nc5tHdoE z>1&<2vh!)Z+`;{w=jN~39#}2P6OZ{;Lu%M>ieu&nT+bdU+4&3=Izp6xkaExO$}Iq+ zuI+e38}~Tchg8h>RAp4GOYx->V6?WoGWGQgJ&)de8Yl%px*KXo^VzOJTp5witPzJYA~_oBJlQg0pmXL0A4<%&*|VIPfJB&wgfAK4OUI#( zpp!%`JfZzf^1KF!THEMWtmW__IQMtd3 z(+uA4k4nbvHA-Bq*W5U??6r1L@8RzlLZo3Wwp=QMLWR8LIm2S%DX>9&-JrLL%+6n2Zoh{d6{;+}Os6|tJmmk{-p(lQ{M`IQ*5PIP+b64E z6KoBvEI%&Yu*cFu1QR5wE|!J~bc{^HLQC9^R~0Mb+|8)2=)`2YZiPk%EoWsLk1iJR`u>Y+WZOBfb)01jf?+l&%@)OTtPC z_2SxySDt|k$UWpi&sd1|$+ z=fNE2OuO7ZO9Y0BbgrlnoNxc2PNZ}ERMxx7b7fc-7%tI$6k-oGtJ(B3&@tXEMDlZM z?%5L@*#+X0x%HrVDCQ&-iKIs7Tj_m78EAY`L~Z(8=*6^RHLYyY6>_4x*M@d}aXU7L zwVX}Ui7R4MtZFDkcPq|*39yWuld1msR#RC$04s{517f~T@_5x69jYvx&u2BF4zEA) z-N*E(%HlO)2gVe{R_*=0>u2UXP~;j{;Q(OOOm*!uebSF3mSCbvdLgI(hK!%M#{UO0 zp6lcKH_W(JpFaiO02&rYQTH{)sKR2$E)=~T`)#QK&h;+6*QnUAYk9cz@(yZ&i6Q^6 zkCDCRs;hwvSMR3Ec*>DtZf5;ywK=Yo)^@KJZRr>PcVe5%nFV`VfhATS+`Enhil*$$ zY?Qbn-?b##7B-~3WY&Qm<5Bihirzz91yz{`zg$+kOJd~@}`wa9Zq7hlvbAA08Ge#Wvq^-#97X%TLKJ&lM?67^ zZbq)ohZA^fn>Esa>`L9Qu{iKTjKh2Y>78;^Go@$+k1cG$3W@lZ`eYm_FPx%V+i8nt zn^P7_;F+g)1qT6VCu@8E20pECrR8XB7K?V?tkSzbUO`#N$L4YWIqGpo7}KJ-HX1$U zYXXSOOwx>wVREB*g;U6}%%sU#qMiWj-DWZq=Vb1;ZXw8O{#;%e>!g}DM`9`TX{k;7 zZ&v?Fi|F5$b?P(Q?@D{jOh?-yO@+*=gbJdJ%4$WBd6Wxu-jD zTp^Kt0uKwuz51Y%(#}fjVd5y78V;G44L>2~r2^#W^xTF6*7}2L?e2SmdS*6<^iZCj zSG24hYjv!hYK&UBRvjb`v&?>F@Vxb_hbh7;L;nB5xpBTn_2*le^4q%yhU6~}hr~lQ zs^Ylwh+1cok$L%WN9+7HlA6`600ghWqWfcm_(2#%3%YzkWZ8?^ykcMw((*!tdG&?X z%Ml@Fc@BoMHC-RGGFjy<{~;G011n@1Wp50l>gd3jMkEI^*v>(vwm4$BU4HUnsxNdLE=Qi>~TkV%${K=RjWSnuD3vdxnfazS|SRDzQG^0-D6m`G7BpC zEW1LkpM8axHD_9SV(gBGDNnR_AW7Pb~z?M!(Mc$uddzcMO7 zZJ*-BOemrlg6czYLoEn3M#t^WK~-3-$!OpK7?{S#PJn2ak#bf{ z+d?9CDpx-{rFJTEixvY}BGdsak?Qiok+W{44Q5%=0)~frE`}jVQh1<_^(NeF{T6LF! zO2N1Ff)|&Ew|g^!+Y4YQJ@Ce|PWNltr+c5=8%Vh-A@}ZP@aby%BM7I4B}{t+b@zv$ z#@OWu(N>N4h3?i#0w{Tf;}f%Ma_Kx+G~%^YB{{DtQ?UkqRlFt!DtS}oq3L>CXBRcb zxsscnlVr;p(Pm@5#>;;K*?;tFukqWx7VfMSx%`={l2h~yM1 zGa#T^#qYTYs3u#T8Joi$;3Up^zrZaZ)a}Z#{_QtTvOu(ELrhVu9G)*Jw9h#X&Y@i) zO@Imh({}t<?gbRxoJ{JNqtez_NWY0;)wyGh8#DLwHvix~^?`PBl8fFK;4 z8!rl9{OA8L8w0FRzi3w3vI4Xpz&SX>ER}sP?dnKf85N+nNdUEG#xeiUjxwk1hQla5 zL@0`^njFi|we-iCDR{1g1Mi>Jmu^|7m z*d(=|LI0-8aSw?ZAlYNt7F2c`zb>b2S8v}F0#^w^b$)#I7@q5tSN{;sI(3%JBVrhouPBDp2+>krv2 zSoMs$KNa0%qq|;A2rk-4p`P2s>iD7qfX+XCdZrb_@G{qr@Fn_I{R9qBbX;?M80`+$ zKSThY2B+u0?MhExpn4DhlURlRJz>x%q4M(7E>*HTYH0;Olgs@%Z$5bDYSdY)A%S-} zEiSB-(VrW2PuaGR!xyk8SVv#XpU7FrdG=BMyTI}F889vT* zzX>lUK9JEpJ^dpjO+F7*1M6aoq?f77&R=mw#NZn7;NN;iuH)(Vv2bmE>H2V{Xqaf z$ql9JE~ejepAO*>COU`Q`_@mV6YFmWs=mRfdNEaxQ-i{Rp7IW@P?%G2LKte;VJ zwWr~{*ctt92m=`

ws@A0qa1SNS&HHXrOO_-I#M#HYwK=jKbtJA4+c7f02E79xdW zrt_icEBaRQcMD*kDn1&W6rcnu0=5Aj$L~{LVD~Mj2s+CO)anc7s{QGxLIR2(>=ej`aUKLtyNBI~M|>j28nLRArd zlp3D~o51C~`*Ogm3I8^#C>I~TFq=!~`-lQ^w>-nD5>QI&{0CZVAw6oU3E5Y(mGLu((jaMzg3`@3sj84I0PMFGn^ipWL`sCd!=3R?sj0N zFY#z*NK3}GNf2f-(^hCqSCWP-CwBA?zJwIBpJ!FZAk>6&)sSehUQ4bc$kJ)0qB~PAnwiX*r zQdo;!CF>mFjC^uFwL<)OPm^Rt$64C-TrgmewkRk%ixVSN+{fJ}zHJDYJ#)btACLpm z^8qjYmS56qb5!fCI=F@EGkOT#A1qo*33c;ICrL2M$8FKttr(%&AAl0FB2OV5fbKj% z_hdG4dLvf8vM^#@h&n>}-3LifU};T9=;_R3_3iW*#x%xa!_vIjlUbE9OxP!9CpODU zVA7kvq1+5-+G$-ZIIzsOeKs=h6dqz>F@hulfqGH0Pk)Rim`pX)!(;8{@z(9}$~+jt z?_EJO-O))-b7NSk(#LtNtJrIS2Yr7||88RSjrybPC&?n-nj2C5Ayg4`d5VnX_o-%i_!4AxJ=p6I`8dE-|kQ~2N9@v*1-pWoV*OgA9^ zOKvkr{(Uaxxp3rzNG#K*;vM3AAAt`)3<OUmWX`-&7n^Nm!d98|CZtgyb!gv>`6#!Cxf7y)x7a03b7xEvwyH+X#1Ds#n@qRwN!J|TSMs9@s zn`!@F7dIGOw;I;^B5WZ5pp{2ZH-l%ChP@EKmo~V2U)likHOlgNkMjO`@2{l|`m1T` zd5|1k8=4p9z8;5~#cdi2R+?7O>#55EW;mHoCvndp-a0kpEIPohB{VZ6?J-zed1)5P zF7Im@V62s3WREf<)%{-I;5wB$t3iHuFQwJAn+@Z(cZI2Lx+g`<3r zu7AI@0l8#gQ%(P)H{G-3`p$GVpPnr0$b0dT#h+zEx`*hv%4!(Q&Cd7FTv!QUOG|1{ z@AJ5ijTdb^=Nua4>e+xOCGy(8U)O*g0!2q3@FA3o)}w?~zPL$0c1#|b=2tAmRYC%L ztPf_ZK|%5^jF>q5wX(sDNCD;OStyaL8#B)6HXXd%oV=NACcvPmhQWjbSO;KF0|Bx$ zF!eR{*EhCzt8nQ$#LkXGD*~Bbf~K6|C``DLS?|4= zh@PlB^3Q4_!1@OBc`^bs;`!BE zILM($gz8}ORsbRL$i$hlGgaKOU&ae!w8wERSX-xBl(|ncm#rk2Amhe_B`AiD@*1Z1;084PX)c0O^XmpA$h6M z>5fC}Vb6;;2>C1YaQy8Rlo&6v$wIO*kr<^3IET;64U z{-UErH_FD#dcIQSUcLOgFRfguHa=V`a2@HE{+*r!X;89u}I!pD&TmfnMYLa^RLY0qMHK*nB;SPB5x{G4)jUR} zg-Zq@A20`Vel#B;wqfEyhlnppQW zOlOM}0jVNLq$nNfU4(3jNRciOI-=4=2q3{N(u*i4k={fwp%{_gyFnzPdC%Z|$$>zq<9Rq`}$uw+w zaiw|3hJCL>6l|=Cd5U6YX{y6#WKVr@iT*;NA62slbJI(7X!O@RCT%nB&gZkWoa7~cuF=o zq^|F?hlBCP`k2k0*RXuV2D|DQik9Xxo!7$;?Gu8{yVRg(n5x*jd{5sHO4rM=2hgM& zzq>tTG8VcmJ>sM)+{-JVS=xE1hIJzJ&hyHLs~uJO3vDm!Bw($+MAnREXY|noed&8w zFaL>ksZq|Sx5uW*D`S(;Yx}H;*kp%iQh+%;%4ac-yaN(9NrEz(ze!Tq^=AvKD|l3t z$`OfnqQ8WbUPu(r)rkUH9ikU$yFInX&WZ-!gROk~jUv>wu9Z9WD~*Aj^OI=wj1WDzsJ6ZHMNNMe|9hI{5Fy+`Lti`gcdK$^ zx)9W2Mc-aATZ-??3sV7ap#2xt4qhw@xxx@(JG&#DhmH(Fq)vXEbFw?kUj8t9dd61xzN$G9mI6WMl!J`ah+*+BphL#cWwn) zQoFXe&roa7bOs1~Lb#fW8I_&6G+~XW397c?A-t4F1ZlIwo!s}qnhJ{_75yPXntdx% zfhdRwTB`P!QOm zh8phAD9kT+*#UYxf;i+y>830_z(+i*Tp2DPa)N+%wV$9_47%0rEw!C#Q)9<>e-OqV5tkz&jX64CGtnJN4dK`dQB^Mv$ zJ0H1uUhDz%@|EmmXtsQaMF57)sK{QPd+UC7%Kx-^KtrU|L{Ia`h#DNU2(qS%8It#o zpv>e^zKzK-DXxC5voC8h6#1o1aYe+=8uc z&dv7^<&tQzY&o);k2eWij=E9a@LjM-T3K@IqNMB;>7qJ2?_|ro*5i)i@QP5>25rYH z1?sGxPSRyu#t+Uv?i@STDzZ=cs?&ax&YM0>akt`l0Bx+%r(YqYkkF`4px zsGbO~(-PBO3M3NOFbr%c&9&vuB*TV|A%ax~@7iF297OJjiRamfFHt)5N$JQ&2Pqkn zDzkf$zp<*zV{2=98DykG;=CvUBu$)%feI~q;=a0&DNFb2$)@^!6vZSw%2>h4VXHT04iSls<^W2WHm%!HQ=BBEjOEwI*qu&Q=Xf}cD^iN zGMrBCAKk}vDqJ2^jgtnPXtXroM1KJ0CgHGr&Be&2a6DWdnPTqp#NeuwU{MXQNv>@kq_zzA;ty_d!`l|>ZmOn@T zNHSVx3Ek{8A6}d%RqfS&@x4~7wd8@1?*u~kfaB~Fg1vlc3(we|Vq{IRYgxOD)hl83 zW~zLiD{GJZ_yf`k7I^%w|By^S4FCY8d%Y~}&$n$HOMJsUM=UKSMr@Etz;X;J@b`us))ku7*_4egEUHiQZh%9&uqH zW16-A(6hg~~ZKiK*A^@9O7i0Z(M zel2@H8=Xfo`mOS5&1;smg(um$u*oKGQq_sioOe?1ad5nW_YX_6_lMx6-07;*4fi?p zjq>ntI%+5n5tqlC%5#Y|naJ~*W|k?+%M+&a)k*3^`AlQZ74bjmT{Q3BecgD~k_-83 zC>Qu1^Vd!f=tvm1fB#CR!1;sk?rxu2 z6R({yrDHc`PfU0}!Sj54c^;0XiMO4XIo+^$tWrtF(~_Gv8cAdYY+YkTpM)UA8iOy> zDThvU#zNvh1$Cobop{StB&B^>ayfndFju9*KnB{FgT%SJL(SvwbjpACap@ERyIthE zG$i?2-hO5D+wd%>Kyb2QH%Q$jB2ZViNf~&GaLg&m(fgdJ~S ztaXMb>RPHSE)J1-eZ4XOt5{gSjI3^SC#iWsg$kieJ01>&)%{**2VTVEYI+Rn!`DfC z4CZJOq`L=dDWS&~XZmRtQxm;+6LKpLUAq#P(LVvyBOkaGC-_Q!KC~JUY*gV;!J2_Xhbx1EJ)g$Bi=A5JI zONWFGzN+A*F4HC9rZwI2>hRgmJHqaSo0%Ohi#qYD+LAfA_}czC9JoJ{^yZW3?905q z0w;8V6QTsE9Ut2on`04rr<|JmmQoqP{*TFXbKsO$R?hcO)rZULze(#tPO%xaPef9A zt8MLa6~`7PW+vt)7A6)aO4i7@h=LWFjk%_4uD^8+%8kgL)n9_o?zxvt zFup#&h4-}9FL*QYMl0x0?qSxbWVdHAradCYL5Y{&4G#4b$hLdIop2uo;&8rmzTiMM z#Rf?O7A%P9)##xE-!#+jaJUs$OusHDoE?woTz|x^C3q?MnoSlhqv`e*&Ut*FSL${u z+&qO}1sC8~S5(F${AARatLk-V+2d)_{PQ3R@uAWzZa_o=?9`v|(=Be{@(WVl$%Y=V ze6^K;dn;>aM-omYWv1k?wm&IU(!<4=Y&~rwG6p6=zvbFSrN0;$+wYze6wq*PGTBCd zgRlZG)nvuRE`#_#&Qkb3eL}{(EA;itHZFFWMlz!3rfJ9%aCW6Y=xg;Z9!7=x0}>MN z4)iFiy&L(=f+xG)m7ZbOX?lEU?ME?K4<~EL6y;E%*NYI{6)m&16JJTPRg^t5uF~0x zMKlNwEPc1ktHc49?2CPEn9{6YsHG#8 z#dTG!!O&97!lH_ejG3Jxxo?XBd$=w=k=(B-D+^uD(L>lH3FoS3p^x$l^ti3aM!>Nj z=#6yuTelF*ah5h?WR4}mQ6RgFRR#lxMO|OMafR(*n7}+@DlzuD(skpH~R+g+Rpj722 zW<_Z-ZsFcax#cu2@BhZ76DLw-O2!zv7r4u&H2gRtp|28~+|C3p4x63N-*`>&qv9Y% zUAPh^&>qp9cvnNcVc*ntGCFJMcY!aZ><}dUr;rWja2U8Pe!@k-84KLU0VpVlfy22? zyDRi#Tir7XCcu>GN>@MuvS)G6<3+FFMOaq{T))QDvok91Dw!+pf_-D7HG7<{g%n{* zxTj&0|Hs_N1h?DLV<{I?%=4Kd=g;zj4bx)j0#lm6rEg-FUB*gVxJ44WqCmIk5}L%^ v&LWE?*6JSgCo6_<33&{Of Date: Thu, 16 Oct 2025 13:45:44 -0400 Subject: [PATCH 71/80] [AV-102227] Simplified Vector Index Creation (#444) * [AV-102227] First draft of creating hyperscale and composite vector indexes based on Figma UI flow. Putting contents in partials to insert in Gary's content - might need to move folder location later. * [AV-102227] Change folder structure to keep partials with the rest of the content Gary's writing * [AV-102227] Adding in info about configuring filter fields and the different index configuration settings * [AV-102227] Update procedures after reviewing UI for limitations and extra options * [AV-102227] Update procedure based on significant UI changes * [AV-102227] Add instructions for creating FTS index with Vector Indexes flow * [AV-102227] Update FTS Vector Index -> Search Vector Index * [AV-102227] Updating procedures based on UI changes * [AV-102227] Update Search Vector index procedure and embedding dimension number * [AV-102227] Replace instances of an Search * [AV-102227] Insert partials into Gary's docs * Update modules/vector-search/pages/vector-search.adoc * Fix bad find and replace * [AV-102227] Comments from SME review * [AV-102227] Change training list value guidance * [AV-102227] Link fixes + peer review comments * Apply suggestions from code review Co-authored-by: Simon Dew <39966290+simon-dew@users.noreply.github.com> * [AV-102227] HyperScale -> Hyperscale --------- Co-authored-by: Simon Dew <39966290+simon-dew@users.noreply.github.com> --- .../search/pages/search-request-params.adoc | 2 +- modules/search/pages/search.adoc | 2 +- .../vector-search-field-descriptions.adoc | 10 +- .../pages/composite-vector-index.adoc | 13 +-- .../pages/hyperscale-vector-index.adoc | 11 +- .../pages/use-vector-indexes.adoc | 2 +- .../create-composite-index-capella-ui.adoc | 105 ++++++++++++++++++ .../create-hyperscale-index-capella-ui.adoc | 99 +++++++++++++++++ .../pages/create-vector-search-index-ui.adoc | 85 +++++++++++--- .../pages/fine-tune-vector-search.adoc | 8 +- .../pages/pre-filtering-vector-search.adoc | 10 +- .../pages/run-vector-search-sdk.adoc | 28 ++--- .../pages/run-vector-search-ui.adoc | 10 +- .../vector-search/pages/vector-search.adoc | 10 +- 14 files changed, 325 insertions(+), 70 deletions(-) create mode 100644 modules/vector-index/partials/create-composite-index-capella-ui.adoc create mode 100644 modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc diff --git a/modules/search/pages/search-request-params.adoc b/modules/search/pages/search-request-params.adoc index 3cf02a820..a9a369b92 100644 --- a/modules/search/pages/search-request-params.adoc +++ b/modules/search/pages/search-request-params.adoc @@ -252,7 +252,7 @@ The `params` object can contain the following properties: Set the `ivf_nprobe_pct` value to control the percentage of probes, or the percentage of clusters, that the Search Service searches during a single Vector Search query. -The Search Service automatically calculates a default `nprobe` percentage based on the vectors in a given partition of your FTS Vector Index. +The Search Service automatically calculates a default `nprobe` percentage based on the vectors in a given partition of your Search Vector Index. For more information about this calculation, see xref:vector-search:fine-tune-vector-search.adoc[]. If you set the value of `ivf_nprobe_pct` higher than this default calculated value, the Search Service will search a higher percentage of clusters in your processed vectors. diff --git a/modules/search/pages/search.adoc b/modules/search/pages/search.adoc index 5dea1e42f..c89acc829 100644 --- a/modules/search/pages/search.adoc +++ b/modules/search/pages/search.adoc @@ -67,7 +67,7 @@ include::partial$sdks-fts-links.adoc[] Vector Search builds on {page-product-name}'s Search Service to provide vector index support for Retrieval Augmented Generation (RAG) with an existing Large Language Model (LLM). -Vector Search adds a new index type to the Search Service to support AI application development, known as an FTS Vector Index. +Vector Search adds a new index type to the Search Service to support AI application development, known as a Search Vector Index. Using Vector Search and Couchbase {page-product-name}, you can develop applications with an existing LLM while giving context and up-to-date information from your own data. For more information about Vector Search, see xref:vector-search:vector-search.adoc[]. diff --git a/modules/search/partials/vector-search-field-descriptions.adoc b/modules/search/partials/vector-search-field-descriptions.adoc index 6c0a12a47..c8f9265b1 100644 --- a/modules/search/partials/vector-search-field-descriptions.adoc +++ b/modules/search/partials/vector-search-field-descriptions.adoc @@ -17,10 +17,10 @@ This may reduce both accuracy (recall) and latency. + The Search Service uses either an inverted file index with scalar quantization, or a directly mapped index with exact vector comparisons, depending on the number of vectors in your data. -For more information about FTS Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. +For more information about Search Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. // end::optimized_for[] // tag::similarity_metric[] -For a `vector` child field, choose the method to calculate the similarity between the vector embedding in an FTS Vector Index and the vector embedding in a Vector Search query. +For a `vector` child field, choose the method to calculate the similarity between the vector embedding in a Search Vector Index and the vector embedding in a Vector Search query. NOTE: It's recommended to choose the same similarity metric for your Search index as the one used in your embedding model. @@ -46,13 +46,13 @@ The Search Service will normalize any vectors in your documents before indexing It will also normalize any vectors in your queries if the field for those queries uses cosine similarity. Use *dot_product* similarity if your vectors are already normalized. -For more information about FTS Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. +For more information about Search Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. // end::similarity_metric[] // tag::dimension[] For a `vector` child field, enter the total number of elements in the vector embedding array. -From Couchbase Server version 7.6.2 and later, FTS Vector Indexes can support arrays with up to 4096 elements. +From Couchbase Server version 7.6.2 and later, Search Vector Indexes can support arrays with up to 4096 elements. Arrays can be an array of arrays. -For more information about FTS Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. +For more information about Search Vector Indexes, see xref:vector-search:vector-search.adoc[] or xref:vector-search:create-vector-search-index-ui.adoc[]. // end::dimension[] \ No newline at end of file diff --git a/modules/vector-index/pages/composite-vector-index.adoc b/modules/vector-index/pages/composite-vector-index.adoc index 667de7633..7204c06b2 100644 --- a/modules/vector-index/pages/composite-vector-index.adoc +++ b/modules/vector-index/pages/composite-vector-index.adoc @@ -23,13 +23,13 @@ Handling the non-vector predicates first reduces the number of vector similarity == Prerequisites -* You must have the Index Service enabled on at least one node in your cluster. -For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. +* You must have the Index Service enabled on at least 1 node in your cluster. +For more information about how to deploy a new node and Services on your database, see xref:clusters:modify-database.adoc#modify-existing-service[Modify the Cluster Configuration]. * You must have a bucket with scopes and collections in your database. -For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. +For more information about how to create a bucket, see xref:clusters:data-service/manage-buckets.adoc[]. -* Your account must have the xref:learn:security/roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. +* Your account must have the xref:organizations:organization-user-roles.adoc#organization-role-organization-owner[`Organization Owner`], xref:projects:project-roles.adoc#project-owner-role[`Project Owner`], or xref:projects:project-roles.adoc#project-cluster-data-reader-writer[`Data Writer`] to be able to create an index. * You have documents in a collection that contain one or more vector embeddings. You can add a single vector to a Composite Vector index. @@ -53,13 +53,10 @@ See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector include::vector-search:partial$download-sample-partial.adoc[] [#create-index] -// TODO: For uptake in Couchbase Capella -//// + include::vector-index:partial$create-composite-index-capella-ui.adoc[opts=optional] == Create a Composite Vector Index Using {sqlpp} -//// -== Create a Composite Vector Index Creating a Composite Vector index is similar to creating a non-vector GSI index. See xref:guides:create-index.adoc[] for an overview of creating indexes. diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc index aa8f52018..b213bd327 100644 --- a/modules/vector-index/pages/hyperscale-vector-index.adoc +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -30,12 +30,12 @@ You can also store the vector in a BASE64 string. Hyperscale Vector Indexes have the following requirements: * You must have the Index Service enabled on at least one node in your cluster. -For more information about how to deploy a new node and Services on your database, see xref:manage:manage-nodes/node-management-overview.adoc[]. +For more information about how to deploy a new node and Services on your database, see xref:clusters:modify-database.adoc#modify-existing-service[Modify the Cluster Configuration]. -* Your account must have the xref:learn:security/roles.adoc#query-manage-index[Query Manage Index] or an administrator role to be able to create an index. +* Your account must have the xref:organizations:organization-user-roles.adoc#organization-role-organization-owner[`Organization Owner`], xref:projects:project-roles.adoc#project-owner-role[`Project Owner`], or xref:projects:project-roles.adoc#project-cluster-data-reader-writer[`Data Writer`] to be able to create an index. * You must have a bucket your database. -For more information about how to create a bucket, see xref:manage:manage-buckets/create-bucket.adoc[]. +For more information about how to create a bucket, see xref:clusters:data-service/manage-buckets.adoc[]. * You have documents in a collection that contain one or more vector embeddings. You can add a single vector to a Hyperscale Vector Index. @@ -64,13 +64,10 @@ See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector include::vector-search:partial$download-sample-partial.adoc[] [#create-index] -// TODO: For uptake in Couchbase Capella -//// + include::vector-index:partial$create-hyperscale-index-capella-ui.adoc[opts=optional] == Create a Hyperscale Vector Index Using {sqlpp} -//// -== Create a Hyperscale Vector Index Use the `CREATE VECTOR INDEX` statement to create a Hyperscale Vector Index. This statement is similar to the `CREATE INDEX` statement that you use to create Global Secondary Indexes (GSI). diff --git a/modules/vector-index/pages/use-vector-indexes.adoc b/modules/vector-index/pages/use-vector-indexes.adoc index 6a591e1da..ac531a69e 100644 --- a/modules/vector-index/pages/use-vector-indexes.adoc +++ b/modules/vector-index/pages/use-vector-indexes.adoc @@ -42,7 +42,7 @@ See xref:vector-index:hyperscale-vector-index.adoc[] for more information. Composite Vector Indexes:: + -- -* Combine a standard xref:learn:services-and-indexes/indexes/indexing-and-query-perf.adoc#secondary-index[Global Secondary index (GSI)] with a single vector column. +* Combine a standard xref:guides:create-index.adoc#creating-a-secondary-index[Global Secondary index (GSI)] with a single vector column. * Designed for searches using a single vector value along with standard scalar values that filter out large portions of the dataset. The scalar attributes in a query reduce the number of vectors the Couchbase {product-name} has to compare when performing a vector search to find similar vectors. * Consume a moderate amount of memory and can index billions of documents. diff --git a/modules/vector-index/partials/create-composite-index-capella-ui.adoc b/modules/vector-index/partials/create-composite-index-capella-ui.adoc new file mode 100644 index 000000000..a3de56f79 --- /dev/null +++ b/modules/vector-index/partials/create-composite-index-capella-ui.adoc @@ -0,0 +1,105 @@ +== Create a Composite Vector Index with the Capella UI + +To create a Composite Vector index with the Capella UI: + +. On the *Operational Clusters* page, select the operational cluster where you want to create a Composite Vector index. +. Go to menu:Data Tools[Vector Indexes]. +. Click btn:[Create Vector Index]. +. Choose btn:[Composite Vector Index]. +. In the *Index Name* field, enter a name for your new Vector index. ++ +[NOTE] +==== +Your index name must start with an alphabetic character (a-z or A-Z). It can only contain alphanumeric characters (a-z, A-Z, or 0-9), hyphens (-), or underscores (_). + +Your index name must be unique inside your selected bucket and scope. +You cannot have 2 indexes with the same name inside the same bucket and scope. +==== +. In the *Bucket*, *Scope*, and *Collection* lists, select the bucket, scope, and collection where you have documents that contain a vector field. + +. Under *Vector Field*, in the *Select Field* list, select the vector field to use in your Composite Vector index. + +. (Optional) To add a field to use as a filter on the data included in your Composite Vector index, click btn:[+ Add Filter Field]. + +.. Under *Filter Fields*, select the field you want to use to filter your documents before running vector comparisons. + +.. Under *Include in Index*, choose whether the previously selected field should be included in your index. ++ +You can still choose to partition using this field and not include it in your index. + +.. Under *Partition by Hash*, choose whether the previously selected field should be used to partition your index, based on the values in your documents. ++ +For example, you could partition your Composite Vector index based on the value of a `supplier` field in your documents. +If you choose *No*, you can still filter using a `WHERE` clause, but your index will not be partitioned based on field values. + +.. (Optional) Under *Add WHERE clause*, enter a clause for the specific values that a document must contain in your filter field to be included in your index. ++ +For example, you could filter your index so that only documents with `supplier = "HP"` or `brightness > 0.5` are included. + +. Under *Index Configuration*, choose options to configure additional settings for your Composite Vector index: + +.. In the *Similarity Metric* list, select the similarity metric that you want to use for comparing vectors in your index. +For the best accuracy, use the same similarity that you plan to use to query your data. ++ +For more information about vector similarity measures, see xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity]. + +.. In the *Quantization* list, select the type of quantization to use for simplifying the vectors stored in your index. ++ +For more information about quantization, see xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization]. +For more information about how to choose quantization on your index, see xref:vector-index:vectors-and-indexes-overview.adoc#choosing-a-quantization-method[Choosing a Quantization Method] and xref:vector-index:vector-index-best-practices.adoc#quantization[Tuning Index Creation - Quantization]. + +.. In the *Dimensions* field, enter the exact dimension of the vectors in your data. ++ +Your embedding model determines this value, and Capella automatically configures it based on your chosen *Vector Field*. + +.. In the *Replicas* list, select the number of replicas you want to create for your index. ++ +Replicas affect the query throughput, memory footprint, and fault tolerance for your Composite Vector index. +More replicas increase the required memory for your index, but can increase query throughput. + +.. (Optional) In the *Training List* field, enter or select the number of vectors to consider when searching for centroids in your data. ++ +[TIP] +==== +If you have less than 10,000 vectors in your index, Couchbase sets the *Training List* value to your number of vectors. +If you have more than 10,000 vectors up to a maximum of 1,000,000, Couchbase sets the *Training List* value to either 10% of your total number of vectors or 10 times your number of centroids - whichever value is higher, up to a maximum of 1,000,000. + +You can change your *Training List* value from these recommended defaults. +Increasing the value can improve recall, but increase build times. +Decreasing the value can improve build times, but reduces recall. +==== + + +.. (Optional) In the *Probes to scan* field, enter or select the number of centroids to check for similar vectors for each query. ++ +The default value is *1*. +A higher value increases search times, but also increases accuracy. +You can also choose to override this value in your queries. + +.. (Optional) In the *Number of centroids* field, enter or select the number of centroids to create in your index. ++ +A larger value creates smaller centroids. +By default, Couchbase sets the *Number of centroids* to the number of vectors in your data divided by 1000. +For more information about how to set this value, see xref:vector-index:composite-vector-index.adoc#number-of-centroids[Number of Centroids]. + +//// +.. To store full vectors in the index, select *Persist Full Vector*. ++ +This increases the storage required for your index but increases accuracy. +//// + +. Click btn:[Review Index]. +. Confirm your Composite Vector Index configuration. +. Click btn:[Create Index] or copy the {sqlpp} syntax to create your index with the Query Workbench. + +=== Resolve Index Creation Errors + +If an error occurs while Capella tries to create your Composite Vector index, on the *Vector Indexes* page, the *Status* of your index changes to *Error*. + +To view the details of the error: + +. Click the *Error* status to open the Query Workbench. +. Click btn:[Run] to rebuild the index. +. In the query results, find the error details. + +Depending on the error, you might need to try recreating your index with a new configuration. diff --git a/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc b/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc new file mode 100644 index 000000000..5c2ea20c3 --- /dev/null +++ b/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc @@ -0,0 +1,99 @@ +== Create a Hyperscale Vector Index with the Capella UI + +To create a Hyperscale Vector index with the Capella UI: + +. On the *Operational Clusters* page, select the operational cluster where you want to create a Hyperscale Vector index. +. Go to menu:Data Tools[Vector Indexes]. +. Click btn:[Create Vector Index]. +. Choose btn:[Hyperscale Vector Index]. +. In the *Index Name* field, enter a name for your new Vector index. ++ +[NOTE] +==== +Your index name must start with an alphabetic character (a-z or A-Z). It can only contain alphanumeric characters (a-z, A-Z, or 0-9), hyphens (-), or underscores (_). + +Your index name must be unique inside your selected bucket and scope. +You cannot have 2 indexes with the same name inside the same bucket and scope. +==== +. In the *Bucket*, *Scope*, and *Collection* lists, select the bucket, scope, and collection where you have documents that contain a vector field. + +. Under *Vector Field*, in the *Select Field* list, select the vector field to use in your Hyperscale Vector index. + +. (Optional) To add a field to use as a filter on the data included in your Hyperscale Vector index, click btn:[+ Add Filter Field]. + +.. Under *Filter Fields*, select the field you want to use to filter your documents. + +.. Under *Include in Index*, choose whether the previously selected field should be included in your index. ++ +You can still choose to partition using this field and not include it in your index. + +.. Under *Partition by Hash*, choose whether the previously selected field should be used to partition your index, based on the values in your documents. ++ +For example, you could partition your Hyperscale Vector index based on the value of a `supplier` field in your documents. +If you choose *No*, you can still filter using a `WHERE` clause, but your index will not be partitioned based on field values. + +.. (Optional) Under *Add WHERE clause*, enter a clause for the specific values that a document must contain in your filter field to be included in your index. ++ +For example, you could filter your index so that only documents with `supplier = "HP"` or `brightness > 0.5` are included. + +. Under *Index Configuration*, choose options to configure additional settings for your Hyperscale Vector index: + +.. In the *Similarity Metric* list, select the similarity metric that you want to use for comparing vectors in your index. +For the best accuracy, use the same similarity that you plan to use to query your data. ++ +For more information about vector similarity measures, see xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector Similarity]. + +.. In the *Quantization* list, select the type of quantization to use for simplifying the vectors stored in your index. ++ +For more information about quantization, see xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization]. +For more information about how to choose quantization on your index, see xref:vector-index:vectors-and-indexes-overview.adoc#choosing-a-quantization-method[Choosing a Quantization Method] and xref:vector-index:vector-index-best-practices.adoc#quantization[Tuning Index Creation - Quantization]. + +.. In the *Dimensions* field, enter the exact dimension of the vectors in your data. ++ +Your embedding model determines this value, and Capella automatically configures it based on your chosen *Vector Field*. + +.. In the *Replicas* list, select the number of replicas you want to create for your index. ++ +Replicas affect the query throughput, memory footprint, and fault tolerance for your Hyperscale Vector index. +More replicas increase the required memory for your index, but can increase query throughput. +.. (Optional) In the *Training List* field, enter or select the number of vectors to consider when searching for centroids in your data. ++ +[TIP] +==== +If you have less than 10,000 vectors in your index, Couchbase sets the *Training List* value to your number of vectors. +If you have more than 10,000 vectors up to a maximum of 1,000,000, Couchbase sets the *Training List* value to either 10% of your total number of vectors or 10 times your number of centroids - whichever value is higher, up to a maximum of 1,000,000. + +You can change your *Training List* value from these recommended defaults. +Increasing the value can improve recall, but increase build times. +Decreasing the value can improve build times, but reduces recall. +==== +.. (Optional) In the *Probes to scan* field, enter or select the number of centroids to check for similar vectors for each query. ++ +The default value is *1*. +A higher value increases search times, but also increases accuracy. +You can also choose to override this value in your queries. + +.. (Optional) In the *Number of centroids* field, enter or select the number of centroids to create in your index. ++ +A larger value creates smaller centroids. +By default, Couchbase sets the *Number of centroids* to the number of vectors in your data divided by 1000. +For more information about how to set this value, see xref:vector-index:hyperscale-vector-index.adoc#number-of-centroids[Number of Centroids]. + +.. To store full vectors in the index, select *Persist Full Vector*. ++ +This increases the storage required for your index but increases accuracy. +. Click btn:[Review Index]. +. Confirm your Hyperscale Vector Index configuration. +. Click btn:[Create Index] or copy the {sqlpp} syntax to create your index with the Query Workbench. + +=== Resolve Index Creation Errors + +If an error occurs while Capella tries to create your Hyperscale Vector index, on the *Vector Indexes* page, the *Status* of your index changes to *Error*. + +To view the details of the error: + +. Click the *Error* status to open the Query Workbench. +. Click btn:[Run] to rebuild the index. +. In the query results, find the error details. + +Depending on the error, you might need to try recreating your index with a new configuration. \ No newline at end of file diff --git a/modules/vector-search/pages/create-vector-search-index-ui.adoc b/modules/vector-search/pages/create-vector-search-index-ui.adoc index e600d5a5f..a35c926ab 100644 --- a/modules/vector-search/pages/create-vector-search-index-ui.adoc +++ b/modules/vector-search/pages/create-vector-search-index-ui.adoc @@ -1,9 +1,9 @@ -= Create an FTS Vector Index in Quick Mode += Create a Search Vector Index in Quick Mode :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} :page-toclevels: 2 -:description: Use Quick Mode to create an FTS Vector Index in Couchbase Capella. +:description: Use Quick Mode to create a Search Vector Index in Couchbase Capella. [abstract] {description} @@ -13,10 +13,10 @@ You must use Advanced Mode to have greater control over how the Search Service r For more information about how to create a Search index in Advanced Mode, see xref:search:create-search-index-ui.adoc[]. -TIP: FTS Vector Indexes can include all the same features and settings as a Search index. +TIP: Search Vector Indexes can include all the same features and settings as a Search index. For more information about Search indexes, see the xref:search:search.adoc[Search documentation]. -You must create an FTS Vector Index before you can xref:run-vector-search-ui.adoc[run a search] that supports vector comparisons. +You must create a Search Vector Index before you can xref:run-vector-search-ui.adoc[run a search] that supports vector comparisons. == Prerequisites @@ -38,12 +38,69 @@ include::partial$download-sample-partial.adoc[] == Procedure -To create an FTS Vector Index with Quick Mode in Capella: +To create a Search Vector Index in Capella: . On the *Operational Clusters* page, select the operational cluster where you want to create a Search index. +. Do 1 of the following: +.. Use the <>. +.. Use the <>. + +NOTE: If you use the <>, you cannot add fields other than vector fields to your index during your initial index creation. + +[#vector-indexes-flow] +=== Create a Search Vector Index from Vector Indexes + +To use the *Vector Indexes* creation flow to create a new Search Vector Index: + +. Go to menu:Data Tools[Vector Indexes]. +. On the *Vector Indexes* page, click btn:[+ Create Vector Index]. +. Click btn:[Search Vector Index]. +. In the *Index Name* field, enter a name for the Search Vector Index. ++ +[NOTE] +==== +Your index name must start with an alphabetic character (a-z or A-Z). It can only contain alphanumeric characters (a-z, A-Z, or 0-9), hyphens (-), or underscores (_). + +For Couchbase Server version 7.6 and later, your index name must be unique inside your selected bucket and scope. You cannot have 2 indexes with the same name inside the same bucket and scope. +==== +. In the *Bucket* and *Scope* lists, choose the bucket and scope where you want to create your Search Vector index. +. In the *Collections* list, select the collection or collections that contain documents with vector embeddings. +. Under *Type Mappings*, in your document schema, expand a collection that contains these documents. +. In your document schema, select the child field that contains your vector embeddings. +. Configure the options for the child field as follows: +.. In the *Type* list, select 1 of the following: +... If your child field contains vector embeddings as an array, click *vector*. ++ +Vector embeddings formatted as arrays appear as `\{field-name} [ number ]` in the editor. +... (Couchbase Server version 7.6.2 or later) If your child field contains vector embeddings formatted as a base64 encoded string, click *vector_base64*. ++ +Vector embeddings formatted as base64 strings appear as `\{field-name} [ string ]` in the Capella Quick Mode editor. +.. In the *Dimension* field, check that the value matches the total number of elements in your vector embeddings array. ++ +The Search Service supports arrays up to 4096 elements. +Capella automatically fills in the dimension value for your selected child field when you choose the *vector* or *vector_base64* type. +.. In the *Similarity metric* list, choose the method to use to calculate the similarity between search term and Search index vectors. ++ +For more information, see xref:search:type-mapping-options.adoc#field[Field Type Mapping Options]. +.. In the *Optimized for* list, choose whether the Search Service should optimize Search queries for accuracy (*recall*) or speed (*latency*). ++ +For more information, see xref:search:type-mapping-options.adoc#field[Field Type Mapping Options]. +. Click btn:[Add To Index]. +. Click btn:[Review Index]. +. Click btn:[Create Index]. + +TIP: After you create your Search Vector Index, click the index name to go back into the editor and add additional collections or child field type mappings to your index. +For example, you could add the text field that you used to generate your vector embeddings. +For more information, see xref:search:create-search-index-ui.adoc#add-mapping[Add Type Mappings and Mappings]. + +[#search-flow] +=== Create a Search Vector Index from Search + +To use the *Search* creation flow to create a new Search Vector Index: + . Go to menu:Data Tools[Search]. . Click btn:[Create Search Index]. -. In the *Index Name* field, enter a name for the FTS Vector Index. +. In the *Index Name* field, enter a name for the Search Vector Index. + [NOTE] ==== @@ -56,7 +113,7 @@ For Couchbase Server version 7.6 and later, your index name must be unique insid . Under *Type Mappings*, in your document schema, expand a collection that contains these documents. . In your document schema, select the child field that contains your vector embeddings. . Configure the options for the child field as follows: -.. In the *Type* list, select one of the following: +.. In the *Type* list, select 1 of the following: ... If your child field contains vector embeddings as an array, click *vector*. + Vector embeddings formatted as arrays appear as `\{field-name} [ number ]` in the Capella Quick Mode editor. @@ -65,7 +122,7 @@ Vector embeddings formatted as arrays appear as `\{field-name} [ number ]` in th Vector embeddings formatted as base64 strings appear as `\{field-name} [ string ]` in the Capella Quick Mode editor. .. In the *Dimension* field, check that the value matches the total number of elements in your vector embeddings array. + -The Search Service supports arrays up to 2048 elements. +The Search Service supports arrays up to 4096 elements. Capella automatically fills in the dimension value for your selected child field when you choose the *vector* or *vector_base64* type. .. In the *Similarity metric* list, choose the method to use to calculate the similarity between search term and Search index vectors. + @@ -82,7 +139,7 @@ For more information, see xref:search:create-search-index-ui.adoc#add-mapping[Ad . Click btn:[Create Index]. [#example] -=== Example: Creating an FTS Vector Index for Vector Search Query Examples +=== Example: Creating a Search Vector Index for Vector Search Query Examples If you want to use the sample dataset for the examples in xref:run-vector-search-ui.adoc[] and xref:run-vector-search-sdk.adoc[], then you can xref:search:import-search-index.adoc[import] the following Search index definition into {page-ui-name}: @@ -93,7 +150,7 @@ include::example$sample-vector-search-index-payload.json[] NOTE: Make sure you imported the sample dataset with the recommended settings. -This FTS Vector Index has a type mapping for a `color.rgb` collection and includes the following fields: +This Search Vector Index has a type mapping for a `color.rgb` collection and includes the following fields: * The *brightness number* field, which is included in search results and supports sorting and faceting. * The *color string* and *description string* fields, which are included in search results, support highlighting, phrase matching, and sorting and faceting. @@ -102,16 +159,16 @@ This FTS Vector Index has a type mapping for a `color.rgb` collection and includ == Next Steps -This basic FTS Vector Index includes the vector embeddings from the child field you specified in your type mapping. +This basic Search Vector Index includes the vector embeddings from the child field you specified in your type mapping. If you chose to add additional child fields and enabled *Include in search results*, the Search Service can also return data from those fields when you run a Vector Search query. -For example, if you used the Vector Search sample data, you might want to add another child field for the *color* string field to your FTS Vector Index, to return color names with your Search query. +For example, if you used the Vector Search sample data, you might want to add another child field for the *color* string field to your Search Vector Index, to return color names with your Search query. For more information about how to add additional child fields to your index, see xref:search:create-search-index-ui.adoc#add-mapping[Add Type Mappings and Mappings]. -You can customize your FTS Vector Index like any other Search index to add additional data and improve search results. +You can customize your Search Vector Index like any other Search index to add additional data and improve search results. For more information about how to customize an index, see xref:search:customize-index.adoc[]. CAUTION: Some Search index features are only available in Advanced Mode. If you edit your Search index in Advanced Mode, you cannot make any additional edits in Quick Mode without losing all Advanced Mode settings. -For more information about how to run a search against an FTS Vector Index, see xref:run-vector-search-ui.adoc[]. \ No newline at end of file +For more information about how to run a search against a Search Vector Index, see xref:run-vector-search-ui.adoc[]. \ No newline at end of file diff --git a/modules/vector-search/pages/fine-tune-vector-search.adoc b/modules/vector-search/pages/fine-tune-vector-search.adoc index 992da9b2c..9d9a7b307 100644 --- a/modules/vector-search/pages/fine-tune-vector-search.adoc +++ b/modules/vector-search/pages/fine-tune-vector-search.adoc @@ -9,7 +9,7 @@ -The Search Service automatically tunes your FTS Vector Indexes to achieve a balance between: +The Search Service automatically tunes your Search Vector Indexes to achieve a balance between: * Recall, or the quality of your search results * Latency, or your search response time @@ -22,7 +22,7 @@ Specifically, the Search Service dynamically adjusts two critical vector paramet `nlist`, also known as `Centroid` count:: The number of clusters used for indexing. -Centroids are used to quickly find the surrounding closest matches in the FTS Vector Index. +Centroids are used to quickly find the surrounding closest matches in the Search Vector Index. Increasing the number of centroids will increase accuracy but will decrease the speed of the search. + The `nlist` is determined dynamically based on the size of the dataset, or the number of vectors in a partition: @@ -74,7 +74,7 @@ For more information on the `vector_index_optimized_for` setting, see xref:sear |=== -== Default `nlist` and `nprobe` calculations on an FTS Vector Index +== Default `nlist` and `nprobe` calculations on a Search Vector Index The cluster maintains two dynamically adjusted parameters that will affect the speed, accuracy, and resources used during a search: @@ -90,7 +90,7 @@ Reducing the value reduces the number of centroids visited, which will decrease .Default calculation ==== -If you have an FTS Vector Index with `vector_index_optimized_for` set to `"recall"` and `indexPartitions` set to `5`, then the `centroid count` (`nlist`) and `nprobe` are determined based on the current vector count in a given partition. +If you have a Search Vector Index with `vector_index_optimized_for` set to `"recall"` and `indexPartitions` set to `5`, then the `centroid count` (`nlist`) and `nprobe` are determined based on the current vector count in a given partition. [options="noheader", frame="none", grid="none" cols="1,1"] |=== diff --git a/modules/vector-search/pages/pre-filtering-vector-search.adoc b/modules/vector-search/pages/pre-filtering-vector-search.adoc index 2eef2131c..c8601e227 100644 --- a/modules/vector-search/pages/pre-filtering-vector-search.adoc +++ b/modules/vector-search/pages/pre-filtering-vector-search.adoc @@ -21,15 +21,15 @@ For more information about how to change Services on your operational cluster, s * You have a bucket with scopes and collections in your operational cluster. For more information, see xref:cloud:clusters:data-service/manage-buckets.adoc[]. -* You have created an FTS Vector Index. +* You have created a Search Vector Index. + -For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create a Search Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index with the {page-ui-name}]. +For the best results, consider using the sample Search Vector Index from xref:create-vector-search-index-ui.adoc#example[Create a Search Vector Index with the {page-ui-name}]. -- == Procedure @@ -38,7 +38,7 @@ To add pre-filtering to a Vector Search query: . On the *Operational Clusters* page, select the operational cluster where you created your Search index. . Go to menu:Data Tools[Search]. -. Next to your FTS Vector Index, click btn:[Search]. +. Next to your Search Vector Index, click btn:[Search]. . In the *Search* field, enter a search query that includes a `filter` object with your `knn` object. + For more information about the `filter` object, see xref:search:search-request-params.adoc#filter[filter]. @@ -48,7 +48,7 @@ For more information about the `filter` object, see xref:search:search-request-p === Example: Pre-Filter A Vector Search Query For The Color "Navy" For example, the following Vector Search query tries to find matches to a color with an RGB value of `[176, 0, 176]` with a minimum brightness of `70` and a maximum of `80`. -A pre-filter on the query will narrow the documents searched inside the FTS Vector Index to documents that have a `color` field value that closely matches `navy`: +A pre-filter on the query will narrow the documents searched inside the Search Vector Index to documents that have a `color` field value that closely matches `navy`: [source, json] ---- diff --git a/modules/vector-search/pages/run-vector-search-sdk.adoc b/modules/vector-search/pages/run-vector-search-sdk.adoc index 31e0ac3bc..f6bcbce68 100644 --- a/modules/vector-search/pages/run-vector-search-sdk.adoc +++ b/modules/vector-search/pages/run-vector-search-sdk.adoc @@ -2,7 +2,7 @@ :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} -:description: Using a Couchbase SDK, you can run a simple or more complex vector search against an FTS Vector Index. +:description: Using a Couchbase SDK, you can run a simple or more complex vector search against a Search Vector Index. :tabs: :tabs-sync-option: @@ -36,15 +36,15 @@ For more information about how to change Services on your operational cluster, s + Go to your operational cluster settings and click btn:[Nodes] to view node hostnames. -* You have created an FTS Vector Index. +* You have created a Search Vector Index. + -For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create a Search Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. +For the best results, consider using the sample Search Vector Index from xref:create-vector-search-index-ui.adoc#example[Create a Search Vector Index in Quick Mode]. -- * You have installed the Couchbase Go SDK. @@ -60,15 +60,15 @@ For more information about how to change Services on your operational cluster, s + Go to your operational cluster settings and click btn:[Nodes] to view node hostnames. -* You have created an FTS Vector Index. +* You have created a Search Vector Index. + -For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create a Search Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. +For the best results, consider using the sample Search Vector Index from xref:create-vector-search-index-ui.adoc#example[Create a Search Vector Index in Quick Mode]. -- * You have installed the Couchbase Java SDK. @@ -84,15 +84,15 @@ For more information about how to change Services on your operational cluster, s + Go to your operational cluster settings and click btn:[Nodes] to view node hostnames. -* You have created an FTS Vector Index. +* You have created a Search Vector Index. + -For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create a Search Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. +For the best results, consider using the sample Search Vector Index from xref:create-vector-search-index-ui.adoc#example[Create a Search Vector Index in Quick Mode]. -- * You have installed the Couchbase Python SDK. @@ -193,11 +193,11 @@ include::example$run-vector-search-generate-embed.py[] == Next Steps -You can xref:search:create-search-index-ui.adoc#add-mapping[create an additional mapping] to update your FTS Vector Index to include the `description` field with your search results. +You can xref:search:create-search-index-ui.adoc#add-mapping[create an additional mapping] to update your Search Vector Index to include the `description` field with your search results. -For example, you could use the following JSON FTS Vector Index payload to create your Search index. +For example, you could use the following JSON Search Vector Index payload to create your Search index. It includes two child field mappings, `colorvect_l2` and `embedding_vector_dot` on two different vector fields in the keyspace's documents. -It also adds 3 normal Search index fields (`brightness`, `color`, and `description`) to add more usable data to the FTS Vector Index: +It also adds 3 normal Search index fields (`brightness`, `color`, and `description`) to add more usable data to the Search Vector Index: [source,json] ---- @@ -206,5 +206,5 @@ include::example$vector-search-index-payload.jsonc[] Run the example in <> again to see the `description` paragraphs in your results. -FTS Vector Indexes can use the same settings and features as regular Search indexes. +Search Vector Indexes can use the same settings and features as regular Search indexes. If you want to add additional fields and features to your index, see xref:search:customize-index.adoc[]. \ No newline at end of file diff --git a/modules/vector-search/pages/run-vector-search-ui.adoc b/modules/vector-search/pages/run-vector-search-ui.adoc index 7a9ee8256..80ba18c4e 100644 --- a/modules/vector-search/pages/run-vector-search-ui.adoc +++ b/modules/vector-search/pages/run-vector-search-ui.adoc @@ -2,7 +2,7 @@ :page-topic-type: guide :page-ui-name: {ui-name} :page-product-name: {product-name} -:description: Run a Vector Search query from the Couchbase {page-ui-name} to preview and test the search results from an FTS Vector Index. +:description: Run a Vector Search query from the Couchbase {page-ui-name} to preview and test the search results from a Search Vector Index. [abstract] {description} @@ -14,15 +14,15 @@ For more information about how the Search Service scores documents in search res * You have the Search Service enabled on a node in your operational cluster. For more information about how to change Services on your operational cluster, see xref:cloud:clusters:modify-database.adoc[]. -* You have created an FTS Vector Index. +* You have created a Search Vector Index. + -For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create a Search Vector Index, see xref:create-vector-search-index-ui.adoc[]. + [TIP] -- include::partial$download-sample-partial.adoc[] -For the best results, consider using the sample FTS Vector Index from xref:create-vector-search-index-ui.adoc#example[Create an FTS Vector Index in Quick Mode]. +For the best results, consider using the sample Search Vector Index from xref:create-vector-search-index-ui.adoc#example[Create a Search Vector Index in Quick Mode]. -- * You have logged in to the Couchbase {page-ui-name}. @@ -33,7 +33,7 @@ To run a Vector Search with the {page-ui-name}: . On the *Operational Clusters* page, select the operational cluster where you created your Search index. . Go to menu:Data Tools[Search]. -. Next to your FTS Vector Index, click btn:[Search]. +. Next to your Search Vector Index, click btn:[Search]. . In the *Search* field, enter a search query. . Press kbd:[Enter] or click btn:[Search]. . (Optional) To view a document and its source collection, click a document name in the search results list. diff --git a/modules/vector-search/pages/vector-search.adoc b/modules/vector-search/pages/vector-search.adoc index f8ceade7c..d4076de3b 100644 --- a/modules/vector-search/pages/vector-search.adoc +++ b/modules/vector-search/pages/vector-search.adoc @@ -10,7 +10,7 @@ == About Vector Search Vector Search builds on Couchbase {page-product-name}'s xref:search:search.adoc[Search Service] to provide vector index support. -You can use these new FTS Vector Indexes for Retrieval Augmented Generation (RAG) with an existing Large Language Model (LLM). +You can use these new Search Vector Indexes for Retrieval Augmented Generation (RAG) with an existing Large Language Model (LLM). Using {page-product-name}'s Vector Search, an embedding model, and your chosen LLM, you can develop AI applications while giving context and up-to-date information from your own data. @@ -27,24 +27,24 @@ Use generative AI to get tailored and dynamic responses across your applications Vector Search supports integrations with frameworks like https://python.langchain.com/docs/get_started/introduction[LangChain^] to support AI application development. For more information about all frameworks and integrations supported by Vector Search and {page-product-name}, see xref:third-party:integrations.adoc[]. -== Using FTS Vector Indexes +== Using Search Vector Indexes To get started using Vector Search in {page-product-name}: . *Store data*: Store the data you want to use for your search or AI project in a {page-product-name} operational cluster. . *Generate embeddings*: Generate vector embeddings from your data with your preferred embedding model. . *Store your embeddings*: Store your vector embeddings in an array inside the documents in your {page-product-name} operational cluster. -. *Create an FTS Vector Index*: Create an index to use your embeddings and identify similar documents with vector similarity. +. *Create a Search Vector Index*: Create an index to use your embeddings and identify similar documents with vector similarity. In addition to supporting integrations with frameworks like LangChain and LlamaIndex, you can also use the API for an existing LLM and one of their embedding models to generate vector embeddings for your data. For example, the OpenAI `embeddings` endpoint can generate embeddings for a text string using a specified embedding model. You can then store that embedding as a new field in your documents. For more information about how to generate and obtain embeddings for text strings using the OpenAI API, see the https://platform.openai.com/docs/guides/embeddings/what-are-embeddings[Embeddings documentation]. -NOTE: When you create an FTS Vector Index, the xref:search:type-mapping-options.adoc#dimension[dimension] of your data vector embeddings must match the dimension for any search query vectors. +NOTE: When you create a Search Vector Index, the xref:search:type-mapping-options.adoc#dimension[dimension] of your data vector embeddings must match the dimension for any search query vectors. Otherwise, a Vector Search query fails to return any results. -For more information about how to create an FTS Vector Index, see xref:create-vector-search-index-ui.adoc[]. +For more information about how to create a Search Vector Index, see xref:create-vector-search-index-ui.adoc[]. For information about how to run a Vector Search query, see xref:run-vector-search-ui.adoc[]. From 1ade58e80c7a16f5a5a40b7b1638fc4d44ac5ae5 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Tue, 7 Oct 2025 09:03:21 +0530 Subject: [PATCH 72/80] [DOC-13536] USING AI - UI support and other improvements (#417) --- .../n1ql-language-reference/using-ai.png | Bin 11605 -> 11790 bytes .../n1ql-language-reference/using-ai.adoc | 208 +++++++++++------- modules/n1ql/partials/grammar/utility.ebnf | 2 +- 3 files changed, 134 insertions(+), 76 deletions(-) diff --git a/modules/n1ql/assets/images/n1ql-language-reference/using-ai.png b/modules/n1ql/assets/images/n1ql-language-reference/using-ai.png index d67f46fe414e206bedfd1f1fd0521de2622ecb90..fa0e9d4bf3ead4252ecc58e64b54e68cd70cf989 100644 GIT binary patch literal 11790 zcmZ{q1yozj)9|5!6qjNJfR_|atztZ4@gqyh_Es+Tw^~QIgSj>5t$vbF8PWsDRGO~2T(s|;qZ<<;= zVKb7q!Wk=kK*fso1+b;j*3{R8ib>HW5xS!G(RHLt6MMf3)yO?gP-W>_Q!n_t5;uaR zsSJ;K5~fRXfhg*d6;K-Prhh2Lx2U>%BWMD$zI6ls>K|XAWyqDPm-2pD(P?lL5G`AQ zYJV&Lv&N%^#XUv=k#Warw08*bsxW=V%!-TYO!%kdR)U1`TmE?gnS#m6O!Z)^&!~wN zylk##_D_u8Ow85PO=&Wi2T$hl)7gPYYz<~d;gYY1Y@<;3s!%A^#$v!?t0k;4OX zH>)!r>)15RTcJz*+<&c39IAu<5hd$S8zM4bxXFAem`x#*mBwK35&6#%UGt!ZU{DXF z@B4wjeZvXg7}>C}Eqa>-Ti3AMCasrkC;BA?ULQrSyx#PWfUh_GNS8NU&CfHaVR4cB zim(|D^I3z3LLDL*>3<~S7m*3+og6M#$6Fe$SHK5`nbzjb*YKW;!a*#pe_Y6(k9Y{Z zstp_MQI%%4prd-p^|ls_BdAfqzP1DFTzIFtd-XMnzTE6NB|}Eulp3YotSVN z5{!$;8Pw*3;R~|sab&*}-`BgCi z>f7xou}hR=L~Geu7|zxB{k70l8hNE+K?NJ48BNXgEChnu{G+P?RI6J`ChcM4-2|0# zzMo2&GlNGlx7}~T+b*mPcjB`BGB6gvPI3>2b19KCyvPy`8B)|jDl+hP0YuKV^}Yqo z1P(@SaRQpI$V3EB?oFE`DT|~PnNnret2-8Ry%|77+gXfed8+QZl(2{<_#gUw8@d$P zo9Cy4#)4*P>=9Mub6Je3S5g{iDy2Z^v=NhE05BCflVQ=Zsvq2eG%oIQ zS*22-0(+Kkf3?$ZY-uu~TX8iI@e4T~obGu0#x_>Q?`F{96f>;X+0Q&&k3!LbYl#f` zez_60%+%eW#;ofzc>}QCS!6Cbddw`MtZdP#fS9L7i0%#8bK2HK1NABF;s| z9NQ_VJC4Y^9W+E3RbEo%q#dk5&L4HqoLpWma1i0IyNhpNbdHNk)mUHM*-l?y##111 z*7E656c81|9cHt9FKn+qQfcw}5Ewbx|ML&}7)(n2u_%zwT8o_m=K&@C*DlDK-%KO& z{%8m&(zVbl!MfD?(l3j{$M!D6vr60~3V+FUQ5kN30ZUT#Inqy_()Q|9r{Uz7asO6c zRCZl%>N5w|f?g{}drb`wVVn1xM_^rdFW(I@kR4Dm8?>H5AP;x6`q2;8sYF$CN*Pu) z*pe9hsLRpZwy^2#XM30Z*Np3iEzVzu`njbt>OXbeyA#(&1>Ki}`2&PSQOF-`t0;6Uz#uy`N-pJrg^oaqXRjX0$E_|S&ewWTbXXy560nR_8fFjfLuD; zg(Ww;_lHLf_l?Pq?WELP&?l{o7)DJ@El=wx0$)!0=-83?WvrmTao<8O)L--t&!TkR zG7`I3_H*4jn}x^=cmQ~lefmIZAqN3s08eFWe^J6N%bT`{%2iO1JA$#AdD+^*@*B%V zmyT)hI!sKVI4nrY0wm`EI?QzBF%@LC)YmM%-@}aT-PYga>o<#WI5{ldhzHh{r6qZ6 z_7lQ|iFF0i6^xg~N`fsz`UCbCd-`F@JP*-4Nl;|l&aAhcKC2~iFJ6lNez*~1%Z}Xb z>>9?x5CL~Ody}otmKiIBKQf~@82n?Ko)@~GWg0o;!ad~0)0&}H;$I6?Zg*<#Dyx|y z`_FDKXlxd9^^(|(8Z?e^rwBa*`SOJtN=g_PE)R?@){c)$cZ?*jywh8RLoCEy3|X!L z9P*9aUm6g2)mS8lSM4U{F5CBQ59b^)NdujNVqiSroFR}X7uS3qL?cPh_>+{`}&11_p;`0Yt;oCOE>GiX* zD*TqyV?B>Mrx%ShS*Ki&$2NMGySD}=!pd4{5%~iQw2A~&Mxuhal<6s;VgV()^8tFA zs7|ZEKnF}*2@=zj-QcTsa+MwPqlyq0H>Y|tHum>OX?&0cA8n?h)gt>+Lmt1ickNBCTQ|IJylZ=N_`lBBJ{+(8#*!Mq>moF+>2*Dlb6?AhZ`s2 z*=B2cIMlJE4p-RtB4MBdG;&9K%+$bd@2RD(qkE(EDv+0->0U) zv2y{0u4Hbbyme+-3hpGnRJ)g^C2TFI3B~Ys-e#nI{PWugboiUf1aCmkaAEev3Uk>V z#b`ZC@PWD>vc>ouxlc$FQYb1u=R>JbHf6TTgb`KkQdM18k}$)TAthmWy&EsxfveJj zaS%*oLgGc=ZVRHiSq)CM2#Y5S0t%6O(PbJueHA+zl=MUx3LnyHsJChSX-K9?Cw74Z8IfMYScucyf2w9qpj4`COS&Ur-pC$D8h?*7T*p z?g)Dmc`o*vQ!cD4>w`sNELV~z*Mv-j&SprZO1cehSq za3MKeBX!2L237r3rXx-WqFPlwKvbi7R!uNW)EAIK45g_%`UWv!8pMP@V$Ctf8#f*< zDqfV%=CC*S(ON6bJaMerjW`aEEY6k#wQcO}g|J`PsPmi4F)^`9kdtNv5}(>!85Aa} z8C`TU7iI+T+1ZW}1qAWfT5@3sxUF?jTGWfX6tOW@m4$B>@VYM-0x=gqwp_cQd>lC2 z+#&P0-L?gf^z`G|AD{M>ZAQ4_^8P|t7a$u@v)~lx)|e~C*%m!PmfN^1%M+!Eauo_b zCe^=#?86-+JCD$8FmQ}?o82!rPyJ>G85tOb?+#!y0DUKmG1Fwxj4L@ow=8!8nrIq! zPlYPe8nw*!5^;Z?O)pGa?hIvV(XusH8pI4?B~6>f4Hl=u{_rNAhi*-KEi3(*(6BWI z3}Dd-&?3z1Q@;1_@B!Z7cfib`_$RfsB>DEG>*V9nGuNEkY~FrvFkdJPJEjq3o4>H8 zh0(si)TlrIYA1ok>$%HMo;>K_$me_*!i>Yc^Eqq%QlgK}^M;>;6A$!`V>8nH^w5{# z?3wb@RK%~AMs^l|PP3_w?E`x1Hsx418=?>0{Jdzejk-x<(u)V77Wq-PXZKCZXPA3G z(oI{c%r_6@=;#aI;A+wtly0*%%6gIjRU{~XYl>UEuUB)YJ*|NfPAdA0d6mtcxt8=b;VvDA5mtF^MQcea`i={oK8w z1v|92NYHvi*y*L=k9r}RVEkuXG43R!6aZ(MbZ$r9pc;}>j>L4lkQ3S7h{H6ZiHzVv zoSJqxJ%y@Oj$FQQPL~K)R++gZjU_%wx@_9vEELx9D(a7#k2^FSczkkvBfRl^VO~ZU zt9FI1k6U<7I{>C$eSP?kb34wK^9)my$%!2KbAky5D3ld<%h*O_)nY#yuL{fX?s^+A zo#ZIJRl@r}b0PR)bp`zw#=o#^fsDb*48#fFsYkQ5YP^VYzYj_hG_E&&2P1!GWIcLn znRZ#ia>kg(p>(vZ?w8u+| zbN{`v1vT^-@6@4w5f3YRi597ik+w*mO<1Zw;hU`D?kKS=L05`!JZe}+bBh*;5u(5# zLe`)1?@6%%6)!F1S*5v3tEJ%ti9f}HtfC1q4o^O6WPFmbs$?!z8C=_ox85vZhbJmyec_AZu3h?Tb3Ukx$& z+|KfY8Xsx`w!pYHMo7{7$;7fydM+E58g-oevOHK@Zr=J0YZ4Wy4mY|P%}|~L;D0le z+%XgKyg+e#&{9#2!#dsjz2xGuF+Bee&DrIAe9bz>qj}W-q)$>#1Y=Jzs%lQFPooy> z9;d>Xv~<0iy&S9eW1#8xMbMy-(JB}kZqwsyi$8xeU;iYUnTRwWo}elcGP#PU^To}K z(tE}cuG%Q<-iT8{Y;Vmv)5URo;ZuJJj1{}aic{7N!niHqVBqW48GIV^Zf7`CW= z!^8j1dtcK%aUo3JgW2UDg*4-3%XsM)7|NOjikygI zB>pX(BnlKgl<6&c8_JPr)v*@2xO|)@64$KGwBvk#+7mV@(H0Zf-Mvlsed{&?eb~h# z{FD_XhW0QG(`CB$6WVUI4e%-YL>mGklI&TTn-_|SFIcEPUH}nQT)am0S{N>jiLWij z9>LeWk|Y2GDNilGb#lueqW8%tDk40LPPrLJB^M9GwH53htpsaZa~wB0=Pl=tkUejG z2A%-y_Vy83$Y|vJY~oN{g0VYEk=P{kRkRL1Ded$W#iy~jCn236b!ID*Ya@rfP(U1= z)OO<4_Ud^VfoJYUpQS%J$72eCv-PWUCeJ|_>q!Nu)#IwF-~|@{fMTiL z+D}}jrL4)ag1$C%N0LL+d}@4SvT#{{D01OnP&)l9+!At7ySsO}q|?U6OT%qmEVZ|D z^#4T`+KcihwT{e>lR~_w`e@43`P6iI1oq1yKEg_XUVNO0FUg|Nr%SZv7>_+WBGi$E z($Ed|@;U)r>3CPjB8_eju4ptsewNpX414WVEGHhac%^@ni_FCe)fWqSIuvZbUrL$4phq3}TWyg*zz=1Mk`u)Bg2uPf<)HudZ3OA)fg32jl`D+K6g2V z;tKAJ#`_?u_UlF%DU5B`RPrel(31_ixwo|3?EUg?1R7rZlP64u2LS@j*@N{8LE%P0 zRPXji5j#q76TjaJ-Ch(sA5W-vl%Xmx;j$;#?TbKAJ+G*5JcV09f#^xc+_o(;QxU z==$51FZ!9-ZK$31h6>O!X>9o&s&LnY+DlU&Eova!#|FhaI8FPHTB)UI1SthGs~q_e z3klR#cw5zARHiZy{Hb#Y22g9F#$vWU3Z4Z(5=luJx+YyWPwu14X|pem0-92;CIt(k z`OZUfpds%k&|@R>$F~740G{sI(x;r3M?xxZ^~CvElroRQY48G_$L%nsd*~-qI`~d}a?QP@&m7mNw-|aFYT#G zZ#A8CZftD##X*m6NsGRk`iFPSNf}FL#o}{z zgx#B8xmA`nw7e*OlrKdZOkFp|Q**wqj5TTlSFJxhCz&P9t`=9mTg_eeoLfopE>WaYPgo!(Z zm!2+X*uohPcI;0ck9K_1Zf51r!~;j~&RAvRHsvIX05Dfq{$;2OtgP-sIVl`^_I)&L zc~EQ)!Hm~UR73xmUVji@p{I4DDOITCz>gI7>s}sWMuL~8M-==BaiP`pv@hS0mf&2>c@=KE7$bUoSV!S<|&P zx7`k4Aq?N6_{M*WCUn4>ls&!{w)T}9fa(K-)U<^5vs@#OhT^UP6o~NW3a0kD3X*6o zsvHAfR_LjR$Vi*tLFlYjX+Tj7gn(fMQ|8$%`ilBZZ92`z zJask)O>yCV7@H`$CLPk|nG*%4R;U4@mSLI9mq5ofn)}u*y|-}&)3OD{ma>Dz={lc( zQQwZHetmb}ye6d)-Q*fe>(zw4P{$+-h~8F8P*t}wx{KeQQ`m=vwPohXOl0&Bt8)Ty zrss4fQg>$N{!uYqG%kHBf_Ta{--sfzt8_2h6U%15aSXd6s^!77v%*eDuyD5)SX8kt zRb6HAL@jjV8TAOLwm)Y)Yl5Dmr$3%#@G7snb7|yPDTm;$qW+N;mZ^*&J7^mS>e z$I_Q0RtPibC9R<>OgJlIUI~;jE|pC{8223Y1N@qvMwKIg?0^&iI zy>Tfp21A9s!Cc8cxs$k9>N;YZ9SK(YY==DI!*832Yo+|6mMp#$fQZ_@Lu-~^ax4+! zotZ;xd#1T>*Podc>mHsaaKxG+0xV}2w!z zIT|ZT(X45&!>+crjArvP-y0v;b}w)!3~x{96#HmiVlFy$R3sqhQ-aZ1K^_6$YwH@TuH6Wwa%;<3wpw&lB^lmq90eH!UXzOhY#$?qEY0!)5aHimIeVGZ=3ZpP)Alv7X$ltq?8`GT~5GB zzymJU)e?8u@RSxP>vp!cq=8pH@gg+-XFm`K9~O~-V`cWAxbN4l%s6YkRS^lFFgu-u z^t$CXq1aD?Hxc1kuYU#uqr+Pt3>Y0JzQhMwX+PRbf7zTYJu?ubZTcG-nN4Stw}}i^ z8G&JzXmOBE+8?^f+tLV~sY>3f(gT6>N+W|DYV&uczG)9k zr_L_PAGQk-WQX=cA$Y&&NA{fJ9r!*Xd^z4Fl^H#-<@kV?`(bLXzp5$f_i0Rx0Fxwm zNp(qx#qlMWwT*{C2eaECo8@@S{7X5pfx@RIFPzUFPV1tgN|MfcRaHZSGLaBqrq|lA zet(K!(5F66a;$6JL=_3I3ho??dS7(csm~KAbvJ3TA3b+#=&(Pg0Dt_U38t3+Fr-G- zqnJ(q*7;P}R2+9=(%zi64s|^3t%fRRBn)(#Mu~xHuobR^!uOIeQYNO0sYjm4ir%3h zUZGKb6w(G+D67;jsO*sdwF)Q8!@mJwk#nQW&=qG)h8OBS4)O^PBP!HZX5c_@MVw zNO}@4LyJllL-pqN0w|m`BOIXKYP8%d;XZyz4{{a=v6#=gSU_tlz5+QtKe}H9b2-KaE{j7@qGZY;>Il%Iw0i6 z!BYIZPcgcjB{E1wHC2>k*zc(bq&{#u3GUA2!c&e0Z=b)Igl=9Lqm(qJnr zG!^^`m2O+pfl)oFzDgt&9kn&wF@w_HQlSwvB|LgroXSU-5%tN~xW*1`DuZC1#J@lc|)g9y<^OwL3Z&RF8BcNYaQO-Eh6#UOr(*V9Cz*=p} zcb5#_X^pyg%r%myW4@ln_N9k%s!FAbT_O^Eg#$&C@24kdf)KUNRDwSUyX>`gnJsS^ zyKfZB0sMvYNkvM%AFsTt9wUB;w8C_P%CT-@%=0*FBpHb*VB!sUj;-BUw(}DeP0mi1SZoMLd)fMV<o3 zcSA$mkB_47u%3PXOdy3WkSmE{#3EyPqPttkYbm0 zS&YBUPs7p}{+%^wgzMbaQ@I#9B0*J7#j=of{tcC&$JFi2hWmZQk-raXXu7liZ90oF z?95|Krhc1#YGcSC^(dSIy=X*oR_apX{X87w^Q;Y5}hm39cCz)ifEE|I8gRzKg6EU z5~@G!zJ1obS$__CK{;Ag6 z#RlqMMlf{tj}rn~J-r?IkdDKDI!E;?&+@LTNcme<4UsQehu^m)l4T@Dq7-X%&z9{KCB*rbcGBv|McKmrr51Asc_8 zdVZ^L9h1n#k8dEQSkGYU^1`v3{QL?x``qIpN$6I#(_&rA%tK;a0x>5!f)#zFM6l}V z@5#Y9-E`YN*5Cb~eJV!p1YHK?#cT2CxR)4~iqr$+42^cX76(6GJAqLKsj2B9XOqZU zsrYff+G(4SQ}oWyMQLH{95D3XY=trIpMUGm_mL#V+U3%XJap(C0dDDwz4#FF1hh-# zvIZAbf~(qegT>z4c^rmCL?3P2?iIXY3Vg`6T}u4=;Zia$#+)ZS#Di`gCjDR^1u<}y9B z{%=38BlN^S*4PbI(Tw;DrgH_dADQDOE$|JT(cfUqpj=`=>N41g!IZD1Dty-BR3*cb zGRf$+5QY%_Lsi~x`_`Yb;xY+{u9RBNb7cNJ733Xf06L~D1^l7(f5jVSqZ!Q~NGvVE zXeDgjKb4y@yqM1qeWA~_w?0YRsLdNl2|gtAU2OrVZcyI7A`0Ty9EU45N#l#>eDR;` zx1!9$B(2tTJi(i1jUT<^s`Nk1m{+A=lkfZi{OtqcekY`YF<*H8O(xCvy-Uxd?4+kv z*pWI}ejVp?*VS>(&!YRsHQvGg?E#`c3+eyDlgS#01>vnNS6S`FFY)X>liXT9!@&SX`daEu8S`VclnZnMJLX%_08tj20F zG2_=wERZ{I^7IweVs2}OO4|G$bEb6TMEu-IkT*Dv7F#NX{=%uh_y`vbEnxKCk)3Q` z!oj>gkWw?GKTDiku2;tlm13tCx3+=i9MvnwGbHa8_G#Ack<4%okqePH@mDAX(L0W` z(4-ll?D?KF}r=(?rU-hWqJ)bC&zD zuRQOyP6u~>cBzWvMfXYf*^9(eNM-`0CN#R>uR^4(C&^B{ErbUEuT0eg-OR6&$aea^ zGCY^F*qE*5a(qJkjlOG1ywioGqK2vmotBpT!*iG*>=Nak;pw%Ir^>|lZOSOlkpDA3 z9C5^ZQHIw-56EFCWU9ViUZ=(DE9NJ+x~k41h4&V$>r>1S3noo zClKtWO>t~?;+v+I{XV({ z5AuN5$6@vT-$->~_MuU6BCK>Y7trs z(4=&j+DAGCqQ-L$_DR-Ie(pi-Dp_@Twaze7FGT14fd4@@omaL{G*f!ZthVlqxOm+- zr&h*QE)>O3znxM;YQ$b`l0?UpYY15%{bA`y{G;W^($tnrJpZYWl3bVm$J+Xlzhz=S zv1MqmJW;$*P&Sl&I5A~+m{2ok$q0P6uA##Uu{Ol^Kip>f^_k|yNbKTbl5VvMiZHm? z_M}$5HC1u#^vl?F9c@rs-RXoNPu6_5f`%|X`jBk_obwv$oo`M2zlZAWx5UuIj@w-`GQDr`j zQo#~~f+_qz+G!F0FFqN4^Itxh&8{SRA8?7H;rq|Xss_W%5%Y@t+;_p{B*&9w2iE*< z&amDd{tkhXlb=THBjpEP<;T(c0_)bZl>32jt**W@%q8UB(ZZ5N{@E8ueK>!~7S^ zI$+ZT>EHUeqv(0t5Fu}It=U%HnhB-@H&&&{D6rG(pRYeH=kIhcd-;^Ouh zZD*Vw-N`-?(pjMWIq@w`Rd}pqgjb)>1EVj0Gzq6$M!pQJiF@dR-UHOa{9|4zpLl3{ zN4&$sS)_++{Eomt-WN#C*7^>kWpP=GU0KFG@@mHSGv*ih3vpm?SMLJO$9h(7Wq7Op zI%QI2n))pl4_>cTr=9Adud-iA9(8?hlPMob;%12cF4f==I6mJ$ZTv|jTZap4Uupa4 zd$N;oFxjW>oQ3jpa)m&R9v5@TLHG_%+?t-tybSn|!&=?1)+mU_2O+Qp_H##r#6(a| zR%|W;AFNto6iIUCLSp_II0~Z^JqyAyq%0#m4>JGRRIl&1FfbNX6Pq?cCfyb99j+XY z<5zo2ihQfOG-s%q{M;K1HdxEfHuK32fvI^EA@v0WD=)GDEm9$lMixb=5)ADzodRJw z*Mj~<#9#d8Zv{R#{M}Db6=Z*7S)Z|LM5>puu6<*Csa*MxX7F~Lch29sj62blnaki7 z>SVwOyI?_CI-`{^{78{&?X|cCXW*H1UQC*y7s8G=e)m?5O)>U#d>=kI3ajd^m+nPi zCcsd24$|?n4PS@&DTrGWdn-@hLNDo|9cgp4f8tBrk?wdueC*AvYnj)x=9O+1<8dQO z@{Ok+_9rJf741yNc$<~pLbUvqvjM~x{PmARk(-nkXOI{j2X76WjU%m>tXq#cqbbB*Xqvh4nzB*(^;%g@rlf{APK*+F9PeylVeBNo5PGB?Lxy{rCF@j(J1!^v_?yY6DMXOOl3# zdDAg=ST$HM$~#1TF7H{$rLFR?TITK73F4abO}FN4+ge39T^9i!kGD`TuBKrchK zr99yR|1$YEVg1ncq=M$>sR~VW3M|Y67RaHK-gK~aSRCV0O~&H) z%4OwyNl4^?x@;gM?UK?Wzorb)PXTo5*$;8C`nfSV};b&eZ%4R@p!==uKn!8t7_IbI*?aqnF5l0N6At&fmsl(o4Nn#^lM;XUS**< zS}=;C&nKS>)CxX&3zONZ;-_T0QzT$>vNH`a^8{*TUJB|&<|U+r6;h%aGS4UgSC0n% z0cy>d@_A>QF2r~fgr8@4LVUOz51A+b+Q+Mio&n%fm?_$L!HkI?C#w6OsKM=6ec<`IvgAvri`?>DjXbqGwgpyRAkuSKc21Puontr zX;lR{I8RzQxbFdQaQCo}zVE@oxqO6!J1~HQ<4b{qBXme_Q4xSWKr|Oo5P^fMj`Ds` ziHE&^<)kVl3Rf{sx(|DUY$PWo4)^@>^Q*n^6p*j)Ro2!r%HZk&c9j^y-^|8|dVa@5qwh+zq9bJ%N!L&XE6LacPgV*y&7bTj{H09T+&`Du%rW$z zFF%X$EGOZJqO$qGKV|0h0-#tHEl7fYq)qx?94*vM+w8!$Gv!J7&}3LUP}!kQB=ylCbY%cla@x2$w`kf z;J5Id$3mBu$*AESAw+B_wphC55w?T5gTl-N03osK=mq#!$@w8!|=pkEk&^AhnX& zGN+F_$-tT(^^^~Sr`HHCFH?3mgU&w#@`xl(hUaWnDMeQ5I$piwFROp7dNUf+vHa)f zfArAC{>)S{SuDsGEVqY)f7IF2RF_t$>)9QcrMy)EbYON!9k^y$!cw`#x8X>Vm7 zi80Al^Cp8|Kjc;@yc3|*b( zXB$<&8huTu3-ee~s$3Gfjp}s+FeBOX-@=%x1dUZE8x1S8mOMMw@@OxLGneP1pcF_Iwi~SR;@-55D zn*iC^#ftj&xXx5;KvxBbzR6t2OQ3V^*-GB9yF?o1judi0#S;NHqFZmH@QIlG5mE$T znb65RN;yh`R4DRtICXDh7Mb4-Ai@t&TH@fsk&4RbHrGEEwbF^YSbjKphaks@k$-7( zEw%X3@hcA42Z}Pq4s_T(ibdU9c$;Md!5qvP-xx4#cX(blPQ1!h%d03p zJ~!#orcvN6Gqrk=0Na`!Caqoi(#Lw2Xi(1AldE~01u(=OybKQJz}KIOs`j)feN3az zr|rpFk02c(uk-Q<8F$;yO(tah7@H|4$?S!vOTl%fm1j!6-<11qN(!%cL7mjNG&DM3 ztC!* zJU`&JLZO28B^RzMn*Ms zjKbOGP`T21#k~eav}dXcH0$AfxTSuqWdzK=*xxb;1nV_~2*n3~ScNoRxEH!&x$n-W znV&5*T((Ui2ozQF!)}xOtECYKbfON5Mzog$6ndJ0Bx_%qSJWiFKa;`b5mR$KTTIZQ z*NXr4?LBmOFiSsremcl#Ji>6qb>jQY-lrorfkx*boSgf;{z@>DUukJ>4U3nNzWW7N z1aZNs4F+cPKy0o#Ln8{ZYquBUF5_Y2GCSgvlu#51MbQWnbK>Ao)gNLgnBbJ=FXvLI z6R2O;#h84v1eV*Z_8@2IzE6}VZ^-}ajlX;y5cmFz&zB9r3@O9_(!VP^q_D*|CItLY-DvWEVzn+y~` z*xd2HQYmyQJx<=&)h-DXvp64~t#-f49G4|MZY5DP>__=vrEt1*2Y(bfiER@v*as{& znC(!f5z-9P7sDkFWK`5;L#X1JMmpxSLJavN6&i0I-os;7+?zA`Cd8~(G~|x`7fDM( z@tI%It)O`Ovrb)KD^p#_5l$q8`FqeY0_AljYb5g?JG;~RLQgSxliiN%!)eYyY=+<6 zorD9hOg}4E)@56}!bCbi*Mqf6=&9fjJ?DIR$q9ZIU{S~Ln+p97+OThyV&GAlC;`ix zW`fYYt5DLan(v+Xl^aGd6S*7n%_~srFbHN=b^rpW%`amTb;C~G-qR1#zMj4Pae{B; zxGop`(JX`;{xLmK#AxyPZ}@O1wJtqUt(5`?mV_DoLyoai^~JOWQ~Kh5&7lls>p`ks zlLu7KbfFSm$8&C@dy$`Bu#FLVir5onmg8&BElxVxVg%*J=w_-E{+#}B9&riXBxSQ~dkP+KcQ?p^n;HBA5?kSuhVM^1iYYmMH7E9v&XyP(qFM617?N zu;!oB`X)r_ho8qje(SrMRo?J?CjmVJHgE1dQVc!wcK;|ZmQ2%mlb~|vn-)b=?Q6Xa?S}B?oiY`n>g@&8P@qFUq0R#WxeOz~p z8{NfB$JWB|C@ZIyj&FuYY*XjGYQ@A5>ZkZ~F)ycW zKVu#21_$0MeoO;4X)J4>gIt_UIs$85v^`zftm9wtxX=z(p&eAoE&068F-2p;PPk_} z;9NuzO>64lh@t1kEOQI_k!^XpS^PWL+LfDm%u(e7N@-ai22z;+g;nHr~e6Njzf&>p>qF}+Q7=^I>zj>JoQn$Cgcq~pd&41WzPHUwj}dP&M^?0 zENL8bxm?J+fv#RR&7FGx!-!HIJm3vc+?k0qg*IjOG zIbZ5^dP($Z7qb9`h(F*u1I_F(# zk9Fkx{z7~wDiiSX9Z{V13zl&}%9W*IIJsZzvW;5Lsu@yuH_!a6ZIRxkHv z?x)}4^!pM?gsSKQqCKhw{U0(j*gf(JBAyzg=po zYMq5rHWu*08`f~3mf4>3{}-lrc$_qDxolrQ+}?EkmLZ$bA@h!sG#$UaP?mU~zh@*r zEEDmkqacbG5}bW_dHq-DU2WD7Fh$sY#6@39So_)E2t(}7)cCGZKAG978ElRC01i@V zAl@xQC`xCSd6a%H4JZ!Vwy)RvZ>FUx2ZJMJ=f?2)XQwL(>=IZ=PHFL- z^xgjupuB}Qg*qhie$g#cm-qIqe*E35_`CE^`SByF`S(0@aBpD3OQ791em3A3A24cJ$2 zrfgpJF&;H_{Uq*6knE9(O~Yvng?&6n-<)Cjc5r&5hxF>no^6B&hv`Ea-@plA`N02sw%^N+wQE@afj9oS~|b_Q87}TaAm~g zeU3B2p(6m)G&k8vTD!F0ECuN&m9{~jJA}jSeH4^$m^*s0bM4Pm!K->CkucO;1myzXt^~(&m&kY}l06rdf7=>Rm%Byc8KQsBuHbult@}4gLgV^>u!zDb1$=u^nmALeZ2; zuRVXRVhjxG4;t;R;76do74md5H}!Q4eftTpQdw5%SwQ%>z@H|;ulnW=sULD3jVk|B zpa{6iEqv7fXY*X^=E$b@e%ZS0UX%_P8cV4^fV&r++wAK8)rQ4>#5(xtXK3G6&*;sn zP=3b6-9qq(vn&@+zc-Wf+8jNm5a{iDSPDiCXkWlq8=$MUM-@&B4ZsL=aH|h$FVBzL zfl&f;O;4mZpig*qEMUxI7*k;4TA#L?bxIcAsebp%ti-FY46X%v5)fSu!;n(lED}R?Q#@0oU3YPie*4QSRA4MV`V{fvMQPYj}1goS4}%NloN(GdW}S)`@;K z?dWHwwrb_+&5c_(APc+Irt`?7{Q-=n)p`9osf_2xgSl%@lyBTRxQ7_PbXbZS(F!BE zQbk`klHAu`WK67{R9;c&vlN9_ZTQo*QTEB(x_ix0Z48pA=oIwtWZ~iawMarlp7knb zpp6w|836|5j`O$qXPLsKxl?bNoclZ7A$G#~jSKz5=zxwXrF}AvFV8sFu5l18ssqQW z<~nTu`<7lE)WtYF<|uK~P@rq?DhlgOUr<0kJ=N{^qSZLujRM(=?54X!!45YjK~yO( zxqkEa@sjoMdf4h<{zwQ?^PMSVl^@}wokcG84{M+>EIaJ^aOf*GxBjlq{xI;)Em~sm z=Kfjj<}V-b!unA4r#Y`RMEHOZ&{p@)bpv~U=G7-^@pk0Xwr79fiEZO+5l0y!pcCr~ z-G}!Do6{3MgTpD}SI6^c7(0>v;o<&3o2O@2qtD9bHqSJ#gQEtFq#fYiu5gQ3VmNQG zz|gzb`D~_fRZY!zUroRgr#b$SP5D?wN6d~tTXUYIs1k)vY0v9K^emM7O%GvV4$H}< zjx*={*?Obc=;-ZD^Ky+~7>$y`TW!1DEO&aG6Toa@lDyWH9kJl4%wTzJ>b9J0uW(b& zI$YeZb!X|keK9CZpE#H#Nc>BnBT=xPwZrS{{09JY<5kgfgc>*2jjCtRtbOEQcW$an zChJ6^;2$-qL$7mgJATb}ZiZ4%pZvArwLln_x^?LZtfSgClc_n_*Rxn0;Q)z))wK0Z z+Y_%f!NyLOfTO;#!|!_c4*2swy*8Yq@UYZyHK-*j;u?GJxeOq1O8(y-w44?5pVb9q z*lA9D95^>N;;SLh(7nlV3^lX%AdKPrmg{hw=3C(l-=Xp0!L6Uj294qp^C7tHzt{@wgv7yCGoi~oPzN;uinP<5!LP{LuN%VYRZQ@t|b;ACMl-uLlbr{zB<|nI&6f(e*jUHY4-$RvPi3*FRH6RmJ^9-vW6~sv4>4GZ^90+~ zsScZcOCoIkqvNI8pJ`~fCaMoqV!xV5ZyL!}Z98Sx)%hcuu|8}BNM*DQ89brI8Kd4dvXYjh1SC?r1ThXf^ z;%TVsgOKy#5^^+4oAx}`$tr>Wpg>>@NadZ7xbUk%UvWNe#6#ni&GGk}ld)RA)40@! z#Tr?J-tnqG*O_fJQPfuad(v&YH5hL#MOl&A5gcM$Gf(n@0mlfK5OA)XHhbl#pfCHO zvDK;LSe|ZUBlP926{M)D>N&*%r>a}gdLpsN84J7yGoJ)2>Gd}%R+(0U)Z#(4tku@# zMyer`tgHL_&BuENUz%Aq-)$RYpx*$-yH>L;Wi397xf}UtKAuU%;pO0Yv2^OK##Sfe zHOfgIi~^r`p2C$V$&N}NLSAb&(Jj>^WbUK?u{(m|miqFmwH1XFirX#~elhe`8^Gss zdH5&_ISRv8q!Vlo?7!z@MF}M1%M2{vK;C_txJJMRs)}=dQqQv?SZaHuRg**KnxG^{9wF# z6THsa06$dnXx_UGVrR15l~*dVbX;0dQ)r-KEQtOo0dyE%pI8DWV%V}lR{cBT$JdME z$w0jU@VNfy>MKY(9;I>J5foAC^Awty()zwmFB>2DYauD?`qL+QQkC}Ixe?KC);_Z! zCrR9TAly>G`iksn11Zz(ZNWMwdAb(h*@6zCB|H3xo*?uFCveF`Nj0J#6r*Hl()_-V zkdnF%v0T75F~yqRIe)19%x@jDt+)gO#VcGE5Xb#{HjMHyufx^Jxk|!L@4CByw;9R7 zp@=ttj+znsZO%B1y`ok?{YJ#^m0veKReI|%YCZgJmALpq|Ms;-^pkH}V9_2TDG!XF zNdmoc)BNz7jC8Whl?J~#fCHoV-itx-hpM=Oewz}}n7(q6ijgeM?ZiP*NTS^S9Qf6# zz#_@5Fk!`OdGv$*lGl>fukqJ$nfYHQn6_pCG99aX-T-41SK)rgM7t|=gRwh-O$%@x zi4#{PUxmrCqKh$ZH0(y{`-HUrV8<2$t2TPy$W~7BPh4x5(Zxh3ZN9-c`#oYjvQ~=_ z{He-mwg279^Ak?=CA~xn&&5RyGB4a7Ev1$(^iVX?qwLKDjbb~(BKCi}prdE)ReGY?ieLn>E0pRG8(zD zVjIq3?n+PF-}ei6(&#^HNkZX;6nu5t747?;9sw&jS&5NOqT-6bS&0?MDwIEWrS^jz zGbOJ{JhyK~w)0?R{;s7;+d-L-2JGUiRacXlni`ztgWVfOxTEo=9glZs-CxOfAcRuT zz}}qNPJT2%fs-dWrJ!$1Z=?uT*;(DVjlGcOY7_Y8@Yts<9%ed3@yvI5y*MuR?r$d} zd`p8wzI-nO{M?u=k2WY&P0OX}pN^tzROoc+B3 zW)_H~vd=@K55&c_-DA>B8d&j`SZm;8TF)Bt9i-9o^ml)8+y(kbi9-8(uO^eB5cbY8 zNIHLg22O-$>^XqawUBuscue>MU3D}2)vtrD4Au_*@Ej`JNGi>Xg-yY#htFwv_8|Hi zDTS4_A#(4|8>|tFyWrCcwH?{^tG1H6M75AS`;>QZaIb&8^a9AR)vev3;)fZ3qJ^jr z>_Kk>S6=8~n?(=u)yK4u{mn&=@F!F33j8KMvJ;!Ad4&ifq8bW`3gD*hiZLS!m+PgA zq`G|66!{R*XNI}QOWy4PEmmN?tan4iVW*yW1?g4&efh(ASMPK1&9Pu&)7<=Yu;Eom zxIH1%b&Y`NYAH`l+d07d8f3u@?&|qt9 z0!H~-_w{8C{;XUIOj@aM*^wLHIU7>5UR$iDiBqe^`8$iv9f_6a|EBi2XMeAG{;%W?c zG7-XmXh>iT77BmNLJag3vnRT5s=PIhn4ztyw(*b%63}O1VW;TYp%qx!7|~tMiFJ!E zE#jRofD0^l$ox75Q7q7)uRP(9xVVtROiH>yS10IDh1K70II&;v0}{9CpTr=clzOS7 zH{IS(eacHh#yobUE8&T$FhCFFtaE5!k(*%Q8g9$tGhS?gD28t+%2Vn1$azp*KjujYs_IFYtfJ(XD=-3@^zh&SMofPQ998m!f6Iw}(YZrZ@iI@!Rf64`_=h_ps6% z403$>rxV0dQ&by7d(BPzKQv>((A~(mo^{#-UILGt?!xSqiNn zlau@5lLA$zJqY-^aMOv=C&j2Aujq?0vHFA>ErN9QysJ11t)+jeV7$yNxV0SELEwfs)dI1OQ9Q!(*WB? zwsH2RXp{l$TMiiInn@f#eM*#%*G&n2)CQJ<3z^zqC=Lv=%=2=CDHUZ-PYwtOuY0Cp<&NRC!>$7>5cxaQL^0@sYetZw35&2$IYIgmgr5NkJQ}3&@3mw}C?$WgJEa}7kAsc8^Jw(EKNIR~Wi7t)r zfkq%KE9LUps~)|W>O(D6)aI{j))x*hOR2Z!a0tdl&EKIcqDs68*eFd4fKd+dQ0~qSt=%Y^rj+~I7^sCkqivv_Li8GojS9vv zneG2;rT`oxW%#GcEM8@_Cx0B#G>q|ze>;!pfd3S6Up)3t8w)I|Ug+WgoUpI|yucj) z?*JH=_Rj#=&HB#(jt?-yQ<{aa*mTTrqudDNc~D)B#~0S}o0}xh<(c6Z6F;>4Zzk4w z{A~wx*YAfz67s*&hd67E#n$|zp|=l-e;j$SU~sViFVgYk)F`>$NkgR1al#eVCU4o#jYG)&E&p4r#aKxxXi_pulI z`({%TqQ$DefZYueTtBu%L3t=>&Ptq(ojqJ#MELZZAT}W<+;E>e z%NIv<=o;A=h{pDYt8%5qa=Acldex^x_@u3$5Ueq#+rE8mD)hg*k+fuCwsRS#XJUOQpZt?xYk`G~JQhKf(j$>+(G@#TR{ey9i}t+p!Cf=VQK~v3 zoBQhyX)gZDs)1u?k>&v$Y&x6`CG`*&aTI~u*;MQ3&c9a9%DR8;Nf$vALDbB-kea9H zm1!7jM-;w+rx3Y%I6s3_DFh~ibs9k+hdht>w@9&yXt1ufwdoP8>4Ez0fOY1>j#8G1 zLPZpAg2gN=RNtzx8N;Zv=<_;Q)WObiBOobX6ty3eC(Sx|uz%;Gpv`rzGgVrirOoE~ zSZ%@ZIolZ@e})M-V?`hqS@CI@b1|C?le1QtilJ|(9S^A^{Nm61dqCx0ufgj_1tz*DcI3q7Cv0T0R+Qjf_^34^haLRk3B-BpS0#4YD zgl)`tnk&Sd2V{ewm}p)2r*lPDdX0g;UrogoovZ?6G&Bn%$GU?vf=H>kPyIU^H#FJr zocsxquUvcAI!?5BlBZYnFnxTgUh-PiHLEWvxa9pJ=Knf5)ak#l8a2DNC`-5_20<2a~XvOhIox<_?8&J0I<$4r!wIM6ymdTi{u&; zJ@eNjYue4nTgsgU2FHhfbNsomMi`I?nl%rQillhIU+Zd$GJTE>s|0z6XY%>pvsJSU zYHN1hBVQ=Ke==S2F_W$7-!C+;%Hmuhd-OF@`RL#k-7^7eLUxc30+^JBmLozW)|_SvR^i)nEz_T2OL^J#W4-Ig zxrYK$<0&zoXFH=ew`dlAwplCRbBr)mNA>CcjEpMo|9LrmUk1}gmPaBjG}IJQz7)hb ztO;!Qg|c$i>YFzAU9qA|FSwVDED`6uIbswd85MG?P}$ zzx(EVWm2HBb6TzxweIX~7uXd^AooinvYd$*cC|zzt@g@<5IG1TrIrh*2m7qX^Dq__ z1}`l3ju#=G?3A?sX0TCvWr-WBH5Nzxk5f^bsY2;n)J`fEoH~zWQ@$#fsa#_^1WSDC zh?E~#V{x|wh+=6F=@;}Si*7{`Fi+Uf|JJsG%_PR?h>pkkL_Gw!E%{p#UB)z%)D05& z=+lJV0^!RASr1CK+li zx?5CBifOFNY*~1 zBmbtKmHF&4cnIh diff --git a/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc b/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc index 4c821141a..d26d317c2 100644 --- a/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/using-ai.adoc @@ -9,34 +9,29 @@ == Purpose -You can use the USING AI statement to input natural language queries through {sqlpp} interfaces such as the CBQ shell, REST APIs, and SDKs. +You can use the USING AI statement to convert a natural language prompt into a {sqlpp} query. When executed, the statement passes the input to Large Language Models (LLMs), which interpret the request and return the equivalent {sqlpp} query. -For example, you can input prompts such as `How many airlines are based in Europe` or `List the names of all hotels in the same city as an airport`, and the statement will generate the corresponding SQL++ queries. +For example, you can input prompts such as `How many airlines are based in Europe` or `List the names of all hotels in the same city as an airport`, and the statement generates the corresponding SQL++ query. -If USING AI generates a SELECT query, it automatically executes it and returns the results. -For all other query types, it returns the generated query as a string without executing it. +If the generated statement is a SELECT query, the Query Service automatically executes it and returns the results. +For all other query types, it returns the generated statement as a string without executing it. +However, you can modify this behavior by using the <> option. -[IMPORTANT] -==== -* With the introduction of the USING AI statement, you might notice that AI is now recognized as a keyword. -However, this change has been implemented in a way that does not break existing queries or applications where "ai" is used as a field name or identifier. -For example, queries like `SELECT ai FROM XYZ` will continue to work without any issues. -AI is treated as a keyword only when used in conjunction with the USING AI statement. - -* Currently, the Couchbase Server Web Console does not support the USING AI statement. -You can execute it only through the CBQ shell, REST APIs, or SDKs. -==== +IMPORTANT: The word `AI` is recognized as a keyword, but only when used as part of the `USING AI` statement. +When used by itself as a field name or identifier, you do not need to escape the word `AI` by enclosing it in backticks. +For example, in a query like `SELECT ai FROM XYZ`, you can use `ai` as a field name without needing to escape it. == Prerequisites Before using the USING AI statement, make sure you have: * A Couchbase Capella account. -* Your Capella account credentials and organization ID readily available. +* Your Capella account credentials and organization ID readily available. NOTE: Although the USING AI statement requires a Capella account, you can use it with any Couchbase Server 8.0 instances. +[[syntax]] == Syntax [source,ebnf] @@ -47,22 +42,20 @@ include::partial$grammar/utility.ebnf[tag=using-ai] image::n1ql-language-reference/using-ai.png["Syntax diagram: refer to source code listing", align=left] prompt:: -[Required] A natural language request that you want to convert into a SQL++ query. +[Required] A natural language request that you want to convert into a {sqlpp} query. options:: -[Optional] A JSON object specifying additional <> to guide the statement execution. +[Optional] A JSON object specifying additional <> for the statement. + -By default, the statement uses the `natural_orgid`, `natural_cred`, and `natural_context` parameters. +By default, the statement uses the xref:n1ql-rest-query:index.adoc#natural_orgid[natural_orgid], xref:n1ql-rest-query:index.adoc#natural_cred[natural_cred], and xref:n1ql-rest-query:index.adoc#natural_context[natural_context] request-level parameters. These parameters determine the organization ID, credentials, and keyspaces for the request. -You can override them by using the <> object. - -//TODO: Add links to `natural_orgid`, `natural_cred` and `natural_context` when available in the 8.0 documentation. +You can override them by specifying the relevant parameters in the <> object. === FLEXINDEX / FTS Use the optional `FLEXINDEX` or `FTS` keyword to generate a query that uses an FTS or flex index. This hint appends a `USE INDEX (USING FTS)` clause to all `FROM` keyspaces in the generated query. -Refer to <>. +See <>. [[optional-parameters]] === Options @@ -73,15 +66,16 @@ Refer to <>. | **creds** + __optional__ -| Credentials to authenticate the request. +| Couchbase Capella credentials to authenticate the request. Can be one of the following: -* A string in the username:password format, which matches the `natural_cred` specification. -//TODO: Add link to `natural_cred` when available in the 8.0 documentation. -* An object with the fields `user` and `pass`, similar to the xref:n1ql:n1ql-manage/query-settings.adoc#Credentials[`creds`] parameter. +* A string in the username:password format. +* An object with the fields `user` and `pass`, similar to the xref:n1ql:n1ql-manage/query-settings.adoc#Credentials[creds] request-level parameter. -If specified, this value overrides the `natural_cred` parameter, which by default contains your Capella credentials. +If specified, this value overrides the xref:n1ql-rest-query:index.adoc#natural_cred[natural_cred] request-level parameter. + +To ensure your credentials are passed securely, see <>. | String or object @@ -92,36 +86,38 @@ __optional__ Can be one of the following: -* A string matching the `natural_keyspaces` specification. -//TODO: Add link to `natural_context` when available in the 8.0 documentation. -* An array of comma-separated strings, which when joined, form the value. +* A string matching the xref:n1ql-rest-query:index.adoc#natural_context[natural_context] specification. +* An array of comma-separated strings. -If specified, this value overrides the default `natural_context` parameter. +If specified, this value overrides the xref:n1ql-rest-query:index.adoc#natural_context[natural_context] request-level parameter. | String or an array of strings | **orgId** + __optional__ -| Organization ID for the request. +| Couchbase Capella organization ID for the request. + +If specified, this value overrides the xref:n1ql-rest-query:index.adoc#natural_orgid[natural_orgid] request-level parameter. -If specified, this value overrides the `natural_orgid` parameter, which by default contains your Capella organization ID. -//TODO: Add link to `natural_orgid` when available in the 8.0 documentation. +To find your organization ID, log in to your Couchbase Capella account and check the URL in your web browser. +The organization ID is the `oid` parameter in the URL. + +For example, in the URL `+++https://cloud.couchbase.com/databases?oid=5c670d3e-12a3-456b-7c89-123456789ab+++`, the organization ID is `5c670d3e-12a3-456b-7c89-123456789ab`. | String | **execute** + __optional__ -| Indicates if the generated statement should be executed immediately. +| Indicates if the generated statement should be executed automatically. If `TRUE`, the Query Service executes the generated statement and returns the results. - This applies only if the statement is a SELECT query. -For other statement types, such as INSERT, UPDATE, DELETE, UPSERT, or CREATE FUNCTION, the Query Service returns the statement without executing it, even if `execute` is `TRUE`. -Refer to <>. +For other statement types, such as INSERT, UPDATE, DELETE, UPSERT, or CREATE FUNCTION, the statement is not executed, even if `execute` is `TRUE`. +See <>. -If `FALSE`, the Query Service returns the generated statement as a string without executing it. +If `FALSE`, the generated statement is returned, but not executed. *Default:* `TRUE` @@ -133,20 +129,22 @@ __optional__ Possible values are: -- -* `sql` - Generates a standard SQL++ query. +* `sql` — +Generates a standard SQL++ query. -* `jsudf` - Generates a CREATE FUNCTION statement. +* `jsudf` — +Generates a CREATE FUNCTION statement. You can use this to create a SQL++ managed JavaScript user-defined function. -+ -The Query Service does not execute the CREATE FUNCTION, even if `execute` is `TRUE`. +Note that the Query Service does not execute the CREATE FUNCTION, even if `execute` is `TRUE`. You must run the generated statement separately to create the function. -* `ftssql` - Generates a SQL++ query optimized for FTS or flex indexes. +* `ftssql` — +Generates a SQL++ query optimized for FTS or flex indexes. The Query Service appends a `USE INDEX (USING FTS)` clause to all `FROM` keyspaces in the generated query. This enables the query to use a flex index if it's available. -- -The Query Service returns an error if you specify a value not included in this list. +The statement returns an error if you specify a value not included in this list. *Default:* `sql` | String @@ -154,7 +152,39 @@ The Query Service returns an error if you specify a value not included in this l |=== TIP: You can prefix a USING AI statement with EXPLAIN or ADVISE to get the query plan or index recommendations for your generated query. -Refer to <>. +See <>. + +[[usage]] +== Usage + +To use a USING AI statement, you must provide your Capella credentials, Capella organization ID, and one or more keyspaces. +You can provide these details in two ways: + +* <> +* <> + +[[request-level-parameters]] +=== Set Parameters at the Request Level + +You can set `natural_cred`, `natural_orgid`, and `natural_context` as request-level parameters, outside the USING AI statement. +When set, these parameters apply to all subsequent USING AI statements in that session. + +For example: + +* In the cbq shell, you can set these parameters using the `\set` command. +See <>. +* In the Query Workbench, you can set these parameters in the xref:tools:query-workbench.adoc#query-preferences[Run-Time Preferences] window as named parameters, without the $ prefix. + +For more information about how to set request-level parameters, see xref:n1ql:n1ql-manage/query-settings.adoc#section_nnj_sjk_k1b[Configure Queries]. + +Once configured, you do not need to specify `creds`, `orgId`, or `keyspaces` in the WITH clause. + +[[inline-parameters]] +=== Set Parameters Inline + +You can set the `creds`, `orgId`, and `keyspaces` options directly in the `WITH` clause of the USING AI statement. +If specified, these values override the `natural_cred`, `natural_orgid`, and `natural_context` parameters. +See <>. == Result @@ -162,6 +192,7 @@ A JSON object containing the generated statement, execution status, and metrics. If the generated statement is a SELECT query and the `execute` option is `TRUE` (default), the output includes the query results as well. +[[handling-passwords]] == Handling Passwords Securely Use `creds` and `natural_cred` parameters with caution to avoid exposing password information through history files or logs. @@ -169,10 +200,26 @@ When working with the cbq shell, avoid passing passwords directly on the command Instead, use the `\set` command to specify only the username, and then enter the password at the terminal prompt. This ensures that the password is not recorded in the shell history. -Similarly, if you are sending requests directly to a REST endpoint from a shell, be mindful of how you provide the password and whether it will be recorded in the shell history. +For example: + +---- +cbq> \set -natural_cred username@example.com; +Enter password for "natural_cred": + +cbq> \set; + Query Parameters : + Parameter name : natural_cred + Value : [username@example.com:***] + + Parameter name : profile + Value : ["timings"] + + ... +---- + +Similarly, if you're sending requests directly to a REST endpoint from a shell, be mindful of how you provide the password and whether it will be recorded in the shell history. Consider using a method like the following to prompt for the password: -[source,sh] ---- echo -n "Enter your password: " read -s p @@ -180,20 +227,20 @@ echo curl -s -d "natural_cred=:${p}" ... ---- -If you choose to reuse the password by setting an evironment variable, note that it might be visible to other users on the system with sufficient privileges for process inspection (for example, through `/proc`). +If you choose to reuse the password by setting an environment variable, note that it might be visible to other users on the system with sufficient privileges for process inspection (for example, through `/proc`). If security is a concern, consider using an HTTPS connection. == Examples -In the following examples, replace `natural_cred` and `natural_orgid` with your Capella credentials and organization ID, respectively. +In the following examples, replace `natural_cred`/`creds` and `natural_orgid`/`orgId` with your Couchbase Capella credentials and organization ID, respectively. [[example-1]] -.Natural language prompt with default request parameters +.USING AI with default request parameters ==== {example-note} .Request -[source, console] +[source, sqlpp] ---- \set -natural_context travel-sample.inventory.hotel; \set -natural_cred username@example.com:P@ssw0rd; @@ -205,7 +252,8 @@ USING AI How many hotels provide free parking?; ---- { "requestID": "097f9cbf-57f2-4832-986d-4f85041c91dc", - "generated_statement": "SELECT COUNT(*) FROM `travel-sample`.`inventory`.`hotel` + "generated_statement": "SELECT COUNT(*) + FROM `travel-sample`.`inventory`.`hotel` AS `h` WHERE `h`.`free_parking` = TRUE", "signature": { "$1": "number" @@ -230,12 +278,12 @@ USING AI How many hotels provide free parking?; ==== [[example-2]] -.Natural language prompt with a custom keyspace +.USING AI with keyspace specified within the statement and execute set to FALSE ==== {example-note} .Request -[source, console] +[source,sqlpp] ---- \set -natural_cred username@example.com:P@ssw0rd; \set -natural_orgid 7a99d00c-f55b-4b39-bc72-1b4cc68ba894; @@ -265,12 +313,12 @@ How many airlines are based in United Kingdom?; ==== [[example-3]] -.Natural language prompt with all parameters directly in the statement, overriding the default ones +.USING AI with all parameters directly in the statement ==== {example-note} .Request -[source, console] +[source, sqlpp] ---- USING AI WITH { @@ -311,7 +359,7 @@ List the names of all hotels in the same city as an airport; ==== [[example-4]] -.Natural language prompt submitted directly to the Query REST API +.USING AI with the Query REST API ==== .Request [source, sh] @@ -330,7 +378,8 @@ curl -s -d "natural_cred=username@example.com:${p}" \ ---- { "requestID": "325457b8-9cf4-477b-aaf5-7609f2ae79bf", - "generated_statement": "SELECT COUNT(*) FROM `travel-sample`.`inventory`.`landmark` + "generated_statement": "SELECT COUNT(*) + FROM `travel-sample`.`inventory`.`landmark` AS `l` WHERE `l`.`geo`.`lon` \u003c 0", "signature": { "$1": "number" @@ -359,9 +408,9 @@ curl -s -d "natural_cred=username@example.com:${p}" \ {example-note} .Request -[source, console] +[source, sqlpp] ---- -\set -natural_cred rakhi.prathap@couchbase.com:Couchbase123#; +\set -natural_cred username@example.com:P@ssw0rd; \set -natural_orgid 7a99d00c-f55b-4b39-bc72-1b4cc68ba894; USING AI WITH {"keyspaces":["travel-sample.inventory.hotel"], "execute": true} \ Insert a new hotel named "Sunset Inn" in "Miami, Florida" with a rating of 4; @@ -390,17 +439,17 @@ Insert a new hotel named "Sunset Inn" in "Miami, Florida" with a rating of 4; } } ---- -If you examine the `hotel` keyspace, you will see that this document is not inserted, even though `execute` was set to `TRUE`. -This is because the Query Service executes the generated statement only if it is a SELECT statement. +If you examine the `hotel` keyspace, you'll see that this document was not inserted, even though `execute` was set to `TRUE`. +This is because the Query Service executes the generated statement only if it's a SELECT query. ==== [[example-6]] -.USING AI with flex index hint +.USING AI with the Flex Index hint ==== {example-note} .Request -[source, console] +[source, sqlpp] ---- \set -natural_cred username@example.com:P@ssw0rd; \set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; @@ -441,10 +490,10 @@ How many hotels are located in California?; ==== {example-note} -This example uses the same prompt as <> but specifies the `output` option instead of the `FLEXINDEX` keyword. +This example uses the same prompt as <>, but specifies the `output` option instead of the `FLEXINDEX` keyword. .Request -[source, console] +[source, sqlpp] ---- \set -natural_cred username@example.com:P@ssw0rd; \set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; @@ -458,7 +507,8 @@ How many hotels are located in California?; { "requestID": "c6fcaed5-23fa-4dc5-936c-febc6b5cb222", "generated_statement": "SELECT COUNT(*) - FROM `travel-sample`.`inventory`.`hotel` AS `h` + FROM `travel-sample`.`inventory`.`hotel` + AS `h` USE INDEX (USING FTS) WHERE `h`.`state` = \"California\"", "signature": { "$1": "number" @@ -487,7 +537,7 @@ How many hotels are located in California?; {example-note} .Request -[source, console] +[source, sqlpp] ---- \set -natural_cred username@example.com:P@ssw0rd; \set -natural_orgid 5c670d3e-12a3-456b-7c89-123456789ab; @@ -509,7 +559,8 @@ Create a function to list all hotels in California; AS `h` WHERE `h`.`state` = \"CA\"; /* Initialize an empty array to store the results */ var res = []; - /* Iterate over the query results and push each hotel into the results array */ + /* Iterate over the query results and + push each hotel into the results array */ for (const doc of q) { var hotel = {}; hotel.name = doc.name; @@ -534,14 +585,14 @@ Create a function to list all hotels in California; ==== [[example-9]] -.Using EXPLAIN with USING AI +.Prefixing USING AI with EXPLAIN ==== {example-note} .Request -[source, console] +[source, sqlpp] ---- -\set -natural_cred rakhi.prathap@couchbase.com:Couchbase123#; +\set -natural_cred username@example.com:P@ssw0rd; \set -natural_orgid 7a99d00c-f55b-4b39-bc72-1b4cc68ba894; EXPLAIN USING AI WITH {"keyspaces":["travel-sample.inventory.hotel"]} \ List the names and cities of hotels with a rating greater than 4; @@ -608,7 +659,8 @@ List the names and cities of hotels with a rating greater than 4; { "#operator": "Filter", "condition": "any `review` in (`h`.`reviews`) - satisfies (4 \u003c (`review`.`rating`)) end" + satisfies (4 \u003c (`review`.`rating`)) + end" }, { "#operator": "InitialProject", @@ -645,4 +697,10 @@ List the names and cities of hotels with a rating greater than 4; } } ---- -==== \ No newline at end of file +==== + +== Related Links + +* xref:cloud:get-started:intro.adoc[Couchbase Capella Operational] +* xref:n1ql-manage/query-settings.adoc#section_nnj_sjk_k1b[Setting Request-Level Parameters] +* xref:n1ql-rest-query:index.adoc[Query Service REST API] diff --git a/modules/n1ql/partials/grammar/utility.ebnf b/modules/n1ql/partials/grammar/utility.ebnf index f2dfcf515..8e40fb77b 100644 --- a/modules/n1ql/partials/grammar/utility.ebnf +++ b/modules/n1ql/partials/grammar/utility.ebnf @@ -99,5 +99,5 @@ delete-all ::= 'ALL' | 'STATISTICS' ***********************/ /* tag::using-ai[] */ -using-ai ::= 'USING AI' ( 'FOR' ( 'FLEXINDEX' | 'FTS' ) )? ( 'WITH' options )? prompt +using-ai ::= 'USING' 'AI' ( 'FOR' ( 'FLEXINDEX' | 'FTS' ) )? ( 'WITH' options )? prompt /* end::using-ai[] */ \ No newline at end of file From baf7202904889e8d86146f2435ed31928bbce3a6 Mon Sep 17 00:00:00 2001 From: rakhi-prathap Date: Tue, 7 Oct 2025 10:17:33 +0530 Subject: [PATCH 73/80] [DOC-9978] New ARRAY_REPLACE_EQUIVALENT function (#427) --- .../n1ql-language-reference/arrayfun.adoc | 77 ++++++++++++++++++- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc b/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc index 7cfac84e0..dbc69b1a1 100644 --- a/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/arrayfun.adoc @@ -1253,12 +1253,12 @@ SELECT ARRAY_REPEAT("Vallie Ryan", 3) AS repeat_val; ==== [[fn-array-replace,ARRAY_REPLACE()]] -== ARRAY_REPLACE([.var]`expr`, [.var]`val1`, [.var]`val2` [, [.var]`max_int` ]) +== ARRAY_REPLACE(`expr`, `val1`, `val2` [, `max_int`]) === Description This function returns a new array with all occurrences of [.in]`value1` replaced with [.in]`value2`. -If [.var]`max_int` is specified, than no more than [.var]`max_int` replacements will be performed. +If [.var]`max_int` is specified, the function performs no more than [.var]`max_int` replacements. === Arguments expr:: [Required] The input array you want to replace [.var]`val1` with [.var]`val2`. @@ -1310,6 +1310,79 @@ LIMIT 1; ---- ==== +[[fn-array-replace-equivalent,ARRAY_REPLACE_EQUIVALENT()]] +== ARRAY_REPLACE_EQUIVALENT(`expr`, `val1`, `val2` [, `max_int`]) + +=== Description + +This function is similar to the <> function and returns a new array with all occurrences of `val1` replaced with `val2`. +However, it determines matches using the equivalence operator instead of the equality operator. +This enables you to replace `NULL` values and composite object values with `NULL` attributes, which is not possible with <>. + +If `max_int` is specified, the function performs no more than `max_int` replacements. + +=== Arguments + +expr:: [Required] The input array you want to replace `val1` with `val2`. + +val1:: [Required] The existing value in the input `expr` you want to replace. + +val2:: [Required] The new value you want to take the place of `val1` in the input `expr`. + +max_int:: +[Optional] The maximum number of replacements to perform. +By default, you can perform any number of replacements. + +=== Return Values +A new array with all or `max_int` occurrences of `val1` replaced with `val2`. + +If any of the arguments are `MISSING`, then it returns `MISSING`. + +If the first argument is not an array, then it returns `NULL`. + +=== Example +==== +The following example shows how the ARRAY_REPLACE_EQUIVALENT function can replace `NULL` values, while the ARRAY_REPLACE function cannot. + +[source,sqlpp] +---- +SELECT +ARRAY_REPLACE([{"name":"Brian"},{"name":null}], + {"name":null}, + {"name":"Unknown User"}) + AS replace_result, +ARRAY_REPLACE_EQUIVALENT([{"name":"Brian"},{"name":null}], + {"name":null}, + {"name":"Unknown User"}) + AS replace_equiv_result; +---- + +.Results +[source,json] +---- +[ + { + "replace_result": [ + { + "name": "Brian" + }, + { + "name": null + } + ], + "replace_equiv_result": [ + { + "name": "Brian" + }, + { + "name": "Unknown User" + } + ] + } +] +---- +==== + [[fn-array-reverse,ARRAY_REVERSE()]] == ARRAY_REVERSE([.var]`expr`) From 90711129f90fd82f045411faf6742b056b672f9b Mon Sep 17 00:00:00 2001 From: Simon Dew Date: Fri, 17 Oct 2025 20:23:05 +0100 Subject: [PATCH 74/80] [DOC-13581] AWR Improvements (#430) --------- Co-authored-by: rakhi-prathap --- modules/n1ql/pages/n1ql-manage/query-awr.adoc | 289 +++++++++++------- 1 file changed, 171 insertions(+), 118 deletions(-) diff --git a/modules/n1ql/pages/n1ql-manage/query-awr.adoc b/modules/n1ql/pages/n1ql-manage/query-awr.adoc index a1e245c6d..97c079a24 100644 --- a/modules/n1ql/pages/n1ql-manage/query-awr.adoc +++ b/modules/n1ql/pages/n1ql-manage/query-awr.adoc @@ -1,6 +1,6 @@ = Automatic Workload Repository :page-status: Couchbase Server 8.0 -:description: Monitor and optimize query performance and workload using Automatic Workload Repository (AWR). +:description: Monitor and optimize query performance and workload using Automatic Workload Repository (AWR). :page-toclevels: 2 [abstract] @@ -9,116 +9,138 @@ == Overview Automatic Workload Repository (AWR) is a feature that captures and maintains performance statistics for queries executed on your Couchbase cluster. -It acts as a centralized repository for query performance data, enabling you to monitor and analyze query activity and workload over time. +It acts as a centralized repository for query performance data, enabling you to track query activities, analyze workload trends, and identify performance bottlenecks. -By providing a historical view of query behavior, AWR makes it easier to identify trends and performance bottlenecks. -For example, some queries may run efficiently with minimal overhead, while others may consume more resources or take longer to complete. +For example, some queries may run efficiently with minimal overhead, while others may consume more resources or take longer to complete. With AWR, you can understand these differences and optimize your queries accordingly. +It also allows you to generate reports to compare query performances over time. -When enabled, AWR automatically gathers detailed metrics from the Query Service for every query that you run on your cluster. -This includes metrics such as execution time, CPU usage, memory consumption, number of executions, and more. +When enabled, AWR automatically gathers detailed metrics from the Query Service for every query that you run on your cluster. +These metrics include execution time, CPU usage, memory consumption, number of executions, and more. It then aggregates this data into <> and stores them in a <>. -You can access the collected data by directly querying the <> or by using Couchbase's report generation tool to generate reports and compare query performance across different time periods. +You can access the collected data by directly querying the repository or by using Couchbase's report generation tool. For more information, see <>. == Use Cases -Here are some scenarios where AWR can be effectively utilized to enhance query performance and workload: +Here are some use cases of AWR: * **Troubleshooting Real-Time Issues**: -You can quickly identify slow running queries or instances of high resource usage. -You can extract the SQL ID of the problematic query from the AWR report and use it to trace the query in xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests]. +You can quickly identify slow running queries or instances of high resource usage. +You can extract the SQL ID of the problematic query from the AWR report and use it to trace the query in xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests]. -* **Analyzing Performance**: -When rolling out changes, such as introducing new microservices, AWR lets you compare query performance before and after the update. -This helps you identify affected queries and optimize their performance accordingly. +* **Analyzing Performance**: +When rolling out changes, such as introducing new microservices, AWR lets you compare query performance before and after the update. * **Analyzing Upgrade Impacts**: -You can assess query performance before and after a cluster upgrade to identify queries impacted by the new version. +You can assess query performance before and after a cluster upgrade to identify queries impacted by the new version. [#workload-repository] -== Workload Repository +== Workload Repository -The workload repository is a centralized storage location where all snapshots are collected and maintained. -It is a user-defined location that can be a bucket or a collection, but not a scope. +The workload repository is a centralized storage location where all AWR data is collected and maintained. -Before AWR can start collecting data, you must configure the repository location in the <> catalog. +Before AWR can start collecting data, you must configure this location in the <> catalog. +The repository can be a bucket or a collection, but not a scope. + +If you specify only the bucket name, AWR uses the default scope (`_default`) and default collection (`_default`) within that bucket to store the data. +If the bucket or collection does not exist, you must create it. + +For example, a valid location is `travel-sample._default.awr`, which you can create using the following query: + +[source,sqlpp] +---- +CREATE COLLECTION `travel-sample`._default.awr IF NOT EXISTS; +---- + +AWR checks the availability of repository location at the start of each reporting interval. Until this specified location is available, AWR remains in a quiescent (inactive) state. -Once the location becomes accessible, AWR transitions to an active state and begins collecting data. -If the location becomes unavailable at any point, AWR returns to the quiescent state and resumes activity only when the location is accessible again. +Once the location becomes accessible, AWR transitions to an active state and begins collecting data. +If the location becomes unavailable at any point, AWR returns to the quiescent state and resumes activity only when the location is accessible again. For more information about setting up the repository location, see <>. [#snapshots] -== Snapshots +== Snapshots -AWR stores query performance data in the form of snapshots. +AWR stores query performance data in the form of snapshots. For each unique statement executed within a specified reporting interval, AWR generates a snapshot. This snapshot contains aggregate metrics for all executions of that statement during the interval. These metrics include execution time, CPU usage, memory consumption, and other performance indicators. -Snapshots are stored as individual documents in the workload repository. -Each document is uniquely identified by its document key (ID), that includes the start time of the reporting interval, making it easier to filter and analyze data. +Snapshots are stored as individual documents in the workload repository. +Each document is uniquely identified by its document key (ID), which includes the start time of the reporting interval, making it easier to filter and analyze data. === Snapshot Retention Management -To facilitate long-term analysis and performance comparisons across different periods, AWR retains snapshot documents in the repository. -By default, AWR does not automatically enforce retention policies on these documents. -Instead, you need to configure a Time-To-Live (TTL) or expiration for the AWR location. +AWR retains snapshot documents for long-term analysis, but does not enforce retention policies by default. +To manage storage effectively, you need to configure a Time-To-Live (TTL) or expiration for the AWR location. The TTL specifies how long the documents remain in that location before the system automatically purges them. - -For example, setting a TTL of 180 days on a given bucket ensures that all snapshot documents older than 180 days within the bucket are automatically deleted. -This mechanism allows you to manage storage usage effectively while retaining relevant history of query performance data. For more information about configuring the TTL, see xref:server:learn:data/expiration.adoc[Expiration]. +=== Example + +.Set TTL on AWR Collection +==== + +If you set a TTL of 7 days on a target AWR collection, say `travel-sample._default.awr`, all snapshot documents older than 7 days are automatically deleted. +To create the collection with this TTL setting, use the following query: + +[source,sqlpp] +---- +CREATE COLLECTION `travel-sample`._default.awr IF NOT EXISTS WITH { "maxTTL": (7*24*60*60) }; +---- + +For more information about creating collections, see xref:n1ql:n1ql-language-reference/createcollection.adoc[CREATE COLLECTION]. +==== + [#enable-configure-awr] == Enable and Configure AWR AWR is an opt-in feature that you must explicitly enable and configure. Once enabled, AWR starts collecting data as soon as the repository location is set and is available. -You can manage these settings through the <> catalog. +You can manage these settings through the <> catalog. [#system-awr] -=== system:awr +=== system:awr -This catalog determines how AWR functions including where it stores snapshots, how often it collects statistics, and which queries to include in the report. -You can adjust the AWR settings at any time to align with your monitoring needs. +This catalog determines how AWR functions including where it stores snapshots, how often it collects statistics, and which queries to include in the report. +You can adjust these settings using an UPDATE query on `system:awr`. -NOTE: Only admins or users with the `query_manage_system_catalog` role can modify settings in `system:awr`. +NOTE: Only admins or users with the `query_manage_system_catalog` role can modify settings in `system:awr`. For more information, see xref:n1ql:n1ql-intro/sysinfo.adoc#authentication-and-client-privileges[Authentication and Client Privileges]. -The catalog consists of the following attributes: +The catalog consists of the following attributes: [cols="1a,4a,1a"] |=== | Name | Description | Schema |**enabled** + -| Indicates whether AWR is enabled or disabled. +| Indicates whether AWR is enabled or disabled. *Default*: `FALSE` | Boolean | **location** + -| The target keyspace (repository) where the snapshots are stored. -This can only be a path to a bucket or collection; it cannot be a scope. -For more information about the repository, see <>. +| The target keyspace (repository) where the snapshots are stored. -AWR checks the availability of the location only once per interval. +This can only be a path to a bucket or collection; it cannot be a scope. +For more information, see <>. -*Example*: `"bucket1.scope1.collection1"` +*Example*: `"travel-sample._default.awr"` or `"travel-sample"`, in which case it uses the default scope and default collection. | String |**interval** + |The duration of the reporting interval. That is, the time between each snapshot collection. -If the interval is set to 10 minutes, AWR captures snapshots every 10 minutes. +If the interval is set to 10 minutes, AWR captures snapshots every 10 minutes. -The interval must be at least 1 minute. +The interval must be at least 1 minute. *Default*: `"10m0s"` @@ -129,7 +151,7 @@ The interval must be at least 1 minute. |**threshold** + |The minimum time a statement must take to complete for it be captured and included in the snapshot. -The threshold must be at least 0 seconds. +The threshold must be at least 0 seconds. *Default*: `"0s"`, so that by default, all statements are captured by AWR regardless of their execution time. @@ -141,15 +163,15 @@ The threshold must be at least 0 seconds. Once the specified limit is reached during a reporting interval, AWR does not generate snapshots for any additional unique statements within that same interval. -*Default*: `10000` +*Default*: `10000` *Max*: `100000` | Positive integer | **queue_len** + -| Length of the processing queue. -It is recommended not to change this value. +| Length of the processing queue. +It's recommended not to change this value. The default value and maximum allowable value for `queue_len` are internally calculated based on system resources. @@ -158,38 +180,77 @@ The default value and maximum allowable value for `queue_len` are internally cal === Examples -.Enable AWR and set the repository location +.Enable AWR and configure settings ==== -The following query enables AWR and sets the repository location to `default.s1.awr`. -It also sets the reporting interval to 1 minute and threshold to 0 seconds. +The following query enables AWR, sets the repository location to `travel-sample._default.awr`, and configures the reporting interval and threshold. [source,sqlpp] ---- -UPDATE system:awr SET enabled = true, location = "default.s1.awr", +UPDATE system:awr SET enabled = true, location = "`travel-sample`._default.awr", interval = "1m", threshold = "0s"; ---- +If you execute this query in the Query Workbench, you'll get a warning about running an UPDATE query without specifying a WHERE clause or USE KEYS. +You can ignore this warning and proceed. ==== .Retrieve current AWR settings -==== +==== The following query retrieves the current AWR configuration settings. + +.Query [source,sqlpp] ---- SELECT * FROM system:awr; ---- + +.Result +[source,json] +---- +[ + { + "awr": { + "enabled": true, + "interval": "1m0s", + "location": "`default`:`travel-sample`.`_default`.`awr`", + "num_statements": 10000, + "queue_len": 160, + "threshold": "0s" + } + } +] +---- ==== [#monitor-awr] == Monitor AWR -The current status of AWR is recorded in the `query.log`. -You can view this information in the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#vitals[system:vitals] output by using the following query: +The current status of AWR is recorded in the `query.log` and you can view this information in the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#vitals[system:vitals] output. + +.Query AWR status in system:vitals +==== +.Query [source,sqlpp] ---- SELECT awr FROM system:vitals; ---- +.Result +[source,json] +---- +[ + { + "awr": { + "requests": 11, + "snapshots": 6, + "start": "2025-09-26T05:10:44.789Z", + "state": "active" + } + } +] +---- +==== + [#view-awr-data-and-reports] == View AWR Data and Reports @@ -201,42 +262,36 @@ You can access the AWR data by: [#report-generation-tool] === Report Generation Tool -You can generate AWR reports using Couchbase's `cbqueryreportgen` tool. +You can generate AWR reports using the xref:cli:cbqueryreportgen.adoc[cbqueryreportgen] command line tool. It provides comprehensive and user-friendly reports by executing SQL++ queries against the collected AWR data. -For optimal query performance with the this tool, it is recommended to create an index on the document key (`META().id`) in your configured AWR location. +For optimal query performance with this tool, it is recommended to create an index on the document key (`META().id`) in your configured AWR location. If this index is not present, the tool will use sequential scans, which can impact performance. -For example, if the snapshots are stored in the `default:bucket1.scope1.awr` keyspace, you can create the recommended index as follows: +For example, if the target location is `travel-sample._default.awr`, you can create an index as follows: [source,sqlpp] ---- -CREATE INDEX idx_awr ON default:bucket1.scope1.awr(META().id); +CREATE INDEX idx_awr ON `travel-sample`._default.awr(META().id); ---- -This index enables the `cbqueryreportgen` tool to efficiently query and retrieve AWR data for generating reports. -//For more information about the tool and its usage, see cbqueryreportgen. -// TODO: Add link to the CLI Reference section. - [#query-awr-data-directly] === Querying AWR Data Directly -You can also query AWR data directly from the workload repository using SQL++ queries. -When doing so, it is important to understand the data format, which is optimized to minimize the storage size. +You can query AWR data directly from the workload repository using SQL++ queries. -To query AWR data, access the specific target keyspace where the snapshots are stored. The document keys (IDs) of the snapshot documents include the timestamp of the reporting interval's start time. -This allows you to filter documents based on time ranges without requiring additional indexes, as sequential scans support range-based key patterns. -However, if needed, you can define and add indexes to further optimize your queries. +This allows you to filter documents based on time ranges without requiring additional indexes (as sequential scans support range-based key patterns). +However, you can add indexes to further optimize your queries, if needed. -Each document contains the following fields: +Each document contains the following fields: [cols="1a,4a,1a"] |=== | Name | Description | Schema | **cnt** + -| The number of times the statement was executed. +| The number of times the statement was executed. | Number | **from** + @@ -248,12 +303,12 @@ Each document contains the following fields: | Number | **pln** + -|An array containing the encoded, compressed outlines of the execution plan for both the minimum and maximum execution times of the statement. +|An array containing the encoded, compressed outlines of the execution plan for both the minimum and maximum execution times of the statement. -This is just the outline of the plan listing operators and significant objects used. +This is just the outline of the plan listing operators and significant objects used. For full execution details, configure the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-config[completed_requests] system keyspace to capture the executions of the statement. -You can use xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] to decompress the execution plan strings, and then pass them to xref:n1ql:n1ql-language-reference/jsonfun.adoc[DECODE_JSON()] for formatting, if needed. +You can use xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] to decompress the execution plan strings, and then pass them to xref:n1ql:n1ql-language-reference/jsonfun.adoc[DECODE_JSON()] for formatting, if needed. | Array of strings @@ -264,14 +319,14 @@ You can use xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[U | **sqlID** + | The unique hash identifier of the statement. -This can be used to aggregate information across different reporting periods for the same statement. -It is also included in the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests] entries (collected independently of AWR). +This can be used to aggregate information across different reporting periods for the same statement. +It's also included in the xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests] entries (collected independently of AWR). | String | **sts** + -| An ordered array of 51 entries representing the total, min, and max values of 17 statistics. -That is, each statistic is represented by three consecutive entries in the array: the total value, the minimum value, and the maximum value. -These values have fixed array positions and appear in the sequence specified in the <> array. +| An ordered array of 51 entries representing the total, min, and max values of 17 statistics. +That is, each statistic is represented by three consecutive entries in the array: the total value, the minimum value, and the maximum value. +These values have fixed array positions and appear in the sequence specified in the <> array. For example, the second statistic in the list is the CPU time. Therefore, + -- @@ -282,16 +337,16 @@ For example, the second statistic in the list is the CPU time. Therefore, + |<> array |**txt** + -| The statement text, possibly in a compressed format. +| The statement text, possibly in a compressed format. -Typically, this field is accessed using the xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] function, and the function returns the raw text if it isn't compressed. +Typically, this field is accessed using the xref:n1ql:n1ql-language-reference/stringfun.adoc#fn-str-uncompress[UNCOMPRESS()] function, and the function returns the raw text if it is not compressed. | String |**ver** + -| The version of the data record. +| The version of the data record. -For this release, the value is always 1. +For this release, the value is always 1. | Number @@ -300,8 +355,6 @@ For this release, the value is always 1. [[Stats]] ==== Statistics -// TODO: Remove `flag-devex-rest-api` feature flag when Data API is released. - [cols="1a,4a,1a"] |=== | Name | Description | Schema @@ -309,81 +362,69 @@ For this release, the value is always 1. | **total time** + | The total time taken for the request -- that is, the time from when the request was received until the results were returned, including time spent in the queue. -ifdef::flag-devex-rest-api[] -It is analogous to `elapsedTime` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. -endif::flag-devex-rest-api[] +This is analogous to `elapsedTime` in the xref:data-api-reference:index.adoc#tag/Query[Data API (Query Service)] response. | Number | **cpu time** + | The amount of time the operators in the execution plan spent executing operator code. -ifdef::flag-devex-rest-api[] -It is analogous to `cpuTime` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response when profiling is enabled. -endif::flag-devex-rest-api[] +This is analogous to `cpuTime` in the xref:data-api-reference:index.adoc#tag/Query[Data API (Query Service)] response when profiling is enabled. | Number | **memory usage (quota)** + -|The amount of document memory used to execute the request. +|The amount of document memory used to execute the request. A request will return its document memory usage only if `memory-quota` is set for the query, or if both `node-quota` and `node-quota-val-percent` are set. For more information about these settings, see xref:n1ql:n1ql-manage/query-settings.adoc[]. -ifdef::flag-devex-rest-api[] -It is analogous to `usedMemory` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. -endif::flag-devex-rest-api[] +This is analogous to `usedMemory` in the xref:data-api-reference:index.adoc#tag/Query[Data API (Query Service)] response. | Number | **result count** + | The total number of objects in the results. -ifdef::flag-devex-rest-api[] -It is analogous to `resultCount` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. -endif::flag-devex-rest-api[] +This is analogous to `resultCount` in the xref:data-api-reference:index.adoc#tag/Query[Data API (Query Service)] response. | Number | **result size** + |The total number of bytes in the results. -ifdef::flag-devex-rest-api[] -It is analogous to `resultSize` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. -endif::flag-devex-rest-api[] +This is analogous to `resultSize` in the xref:data-api-reference:index.adoc#tag/Query[Data API (Query Service)] response. | Number | **error count** + | The number of errors that occurred during the request. -ifdef::flag-devex-rest-api[] -It is analogous to `errorCount` in the xref:data-api-reference:index.adoc#tag/Default[Data API (Query Service)] response. -endif::flag-devex-rest-api[] +This is analogous to `errorCount` in the xref:data-api-reference:index.adoc#tag/Query[Data API (Query Service)] response. | Number | **run time** + -| The total amount of time taken to execute the query. It does not include time spent in the queue. +| The total amount of time taken to execute the query. It does not include time spent in the queue. | Number | **fetch time** + -| The total amount of time spent fetching data from the Data service. +| The total amount of time spent fetching data from the Data service. -It includes the time spent executing `Fetch` operator code and waiting for data from the Data service. +This includes the time spent executing `Fetch` operator code and waiting for data from the Data service. | Number | **primary scan time** + | The total amount of time spent by primary scan operations. -It includes the time spent executing the `PrimaryScan` operator code and waiting for data from the Index service. +This includes the time spent executing the `PrimaryScan` operator code and waiting for data from the Index service. | Number | **sequential scan time** + -| The amount of time spent by sequential scan operations. +| The amount of time spent by sequential scan operations. -It includes the time spent executing the `PrimaryScan` operator code and waiting for data from the Data service. +This includes the time spent executing the `PrimaryScan` operator code and waiting for data from the Data service. | Number @@ -424,26 +465,26 @@ It includes the time spent executing the `PrimaryScan` operator code and waiting === Example ==== -The following example fetches AWR data for a specific SQL ID, including the statement text, max execution plan, number of executions, total time, and max CPU usage. +The following example fetches AWR data for a specific SQL ID, including the statement text, max execution plan, number of executions, total time, and max CPU usage. .Query [source,sqlpp] ---- -SELECT +SELECT text, max_plan, the_count, avg_total_time, max_cpu -FROM +FROM default.s1.awr -LET +LET text = uncompress(txt) -WHERE +WHERE sqlID = 'fcff011269f93c3b7903d746c2914dab' -GROUP BY +GROUP BY sqlID, text -LETTING +LETTING the_count = SUM(cnt), max_plan = json_decode(uncompress(MAX(pln[1]))), avg_total_time = duration_to_str(SUM(sts[0])/SUM(cnt)), @@ -486,5 +527,17 @@ LETTING == Limitations -When working with Couchbase transactions, AWR collects performance statistics for all individual statements, and you may notice that the COMMIT statement often shows the highest elapsed time. -However, from the AWR report alone, you will not be able to get insights into why the COMMIT statement took so long to execute. \ No newline at end of file +* In AWR reports, COMMIT statements may often show the highest elapsed time. +However, the report alone does not provide insights into why the statement took so long to execute. +* AWR does not capture SQL++ statements that contain sensitive information, such as CREATE USER and ALTER USER. +* In some cases, SQL++ statements may appear truncated in AWR reports or snapshot documents. +To find the complete statement, use its `sqlID` to look for entries in xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[completed_requests] that have the same `sqlID`. +Then use one of those entries to get the full statement text. + +== See Also + +* xref:cli:cbqueryreportgen.adoc[Report Generation CLI Tool] +* xref:n1ql:n1ql-language-reference/createcollection.adoc[CREATE COLLECTION Statement] +* xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#sys-completed-req[Monitor Completed Requests] +* xref:n1ql:n1ql-manage/monitoring-n1ql-query.adoc#vitals[Monitor System Vitals] +* xref:server:learn:data/expiration.adoc[Data Expiration and TTL] From 05c92394f4690950a8bda1242c4194b22f97f9e5 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 17 Oct 2025 20:24:17 +0100 Subject: [PATCH 75/80] DOC-13644: [Capella] Vector-index sample bucket (#452) * Update Vector Search examples * Update Vector Index examples * Update Query examples * Update examples for Hyperscale Vector indexes * Update examples for Composite Vector indexes --- .../altervectorindex.adoc | 4 +- .../n1ql-language-reference/createindex.adoc | 6 +- .../createvectorindex.adoc | 2 +- .../dropvectorindex.adoc | 6 +- .../n1ql-language-reference/vectorfun.adoc | 2 +- .../examples/find-reranking-cases.py | 8 +- .../examples/gsi-vector-idx-examples.sqlpp | 20 ++--- .../examples/hyperscale-idx-examples.sqlpp | 89 +++++++++---------- .../pages/composite-vector-index.adoc | 21 ++++- .../pages/hyperscale-vector-index.adoc | 25 ++++-- .../pages/vector-index-best-practices.adoc | 3 + .../run-vector-search-generate-embed.go | 2 +- .../run-vector-search-generate-embed.java | 2 +- .../run-vector-search-generate-embed.py | 2 +- .../run-vector-search-simple-color.go | 2 +- .../run-vector-search-simple-color.java | 2 +- .../run-vector-search-simple-color.py | 2 +- .../vector-search-index-payload.jsonc | 4 +- .../partials/download-sample-partial.adoc | 2 +- 19 files changed, 114 insertions(+), 90 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc index 3e88a6132..18a6da352 100644 --- a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc @@ -58,9 +58,9 @@ To try the examples in this section, you must do the following: The examples in this section assume that the 3 nodes have the names `svc-dqi-node-001`, `svc-dqi-node-002`, and `svc-dqi-node-003`. The nodes in your cluster may have different names or IP addresses. -. Install the vector sample data as described in {prerequisites}[Prerequisites]. +. Install the `color-vector-sample` data as described in {prerequisites}[Prerequisites]. -. Set the query context to the `color` scope in the vector sample dataset. +. Set the query context to the `color` scope in the `color-vector-sample` dataset. For more information, see xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context[Query Context]. .Create and move an index from one node to another diff --git a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc index 80bd0e264..082b626c2 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createindex.adoc @@ -722,7 +722,7 @@ For more examples of indexes where the leading key may be missing, see xref:n1ql [[ex-create-rgb-idx]] .Create a Composite Vector index ==== -For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +For this example, you must install the `color-vector-sample` data as described in {prerequisites}[Prerequisites]. The path to the required keyspace is specified by the query, so you do not need to set the query context. Create a Composite Vector index that indexes the vector field named `colorvect_l2`, as well as the scalar `color` and `brightness` fields. @@ -736,7 +736,7 @@ include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-rgb-idx] [[ex-create-vectors-idx]] .Create a Composite Vector index using embedded vectors ==== -For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +For this example, you must install the `color-vector-sample` data as described in {prerequisites}[Prerequisites]. The path to the required keyspace is specified by the query, so you do not need to set the query context. Create a Composite Vector index that indexes the vector field named `embedding-vector-dot`, as well as the scalar `color` and `brightness` fields. @@ -750,7 +750,7 @@ include::vector-index:example$gsi-vector-idx-examples.sqlpp[tag=create-vectors-i [[ex-create-colors-idx]] .Create a Composite Vector index with a scalar leading key ==== -For this example, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +For this example, you must install the `color-vector-sample` data as described in {prerequisites}[Prerequisites]. The path to the required keyspace is specified by the query, so you do not need to set the query context. Create a Composite Vector index that indexes the scalar `color` and `brightness` fields, as well as the vector field named `embedding-vector-dot`. diff --git a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc index babcd9665..491454051 100644 --- a/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/createvectorindex.adoc @@ -175,7 +175,7 @@ include::createindex.adoc[tags=defer-index-builds-by-default] == Examples -To try the examples in this section, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +To try the examples in this section, you must install the `color-vector-sample` data as described in {prerequisites}[Prerequisites]. [[ex-create-rgb-idx]] .Create a Hyperscale Vector index diff --git a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc index 56673a954..3faf03854 100644 --- a/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/dropvectorindex.adoc @@ -49,7 +49,7 @@ include::dropindex.adoc[tags=usage] == Examples -To try the examples in this section, you must install the vector sample data as described in {prerequisites}[Prerequisites]. +To try the examples in this section, you must install the `color-vector-sample` data as described in {prerequisites}[Prerequisites]. [[ex-1]] .Drop a Hyperscale Vector index @@ -62,7 +62,7 @@ Drop the Hyperscale Vector index called `color_desc_hyperscale`, if it exists. ---- DROP VECTOR INDEX `color_desc_hyperscale` IF EXISTS - ON `vector-sample`.color.rgb + ON `color-vector-sample`.color.rgb ---- The following command would drop the index in exactly the same way, but uses alternative syntax. @@ -70,7 +70,7 @@ The following command would drop the index in exactly the same way, but uses alt [source,sqlpp] ---- DROP VECTOR INDEX IF EXISTS - default:`vector-sample`.color.rgb.`color_desc_hyperscale` + default:`color-vector-sample`.color.rgb.`color_desc_hyperscale` ---- ==== diff --git a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc index 7d62cc8ba..dee57e169 100644 --- a/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/vectorfun.adoc @@ -457,7 +457,7 @@ Check whether the specified fields in the `rgb` collection contain vector values SELECT ISVECTOR(description, 1, "float32") AS description, ISVECTOR(colorvect_l2, 3, "float32") AS colorvect_l2, ISVECTOR(embedding_vector_dot, 1536, "float32") AS embedding_vector_dot -FROM `vector-sample`.color.rgb LIMIT 1; +FROM `color-vector-sample`.color.rgb LIMIT 1; ---- .Results diff --git a/modules/vector-index/examples/find-reranking-cases.py b/modules/vector-index/examples/find-reranking-cases.py index 30fae2822..696f60f03 100644 --- a/modules/vector-index/examples/find-reranking-cases.py +++ b/modules/vector-index/examples/find-reranking-cases.py @@ -12,14 +12,14 @@ COUCHBASE_URL = "couchbase://localhost" USERNAME = "Administrator" PASSWORD = "password" -BUCKET_NAME = "vector-sample" +BUCKET_NAME = "color-vector-sample" # --- Connect to Cluster --- cluster = Cluster(COUCHBASE_URL, ClusterOptions(PasswordAuthenticator(USERNAME, PASSWORD))) cluster.wait_until_ready(timedelta(seconds=10)) # --- Get all search-color IDs --- -get_ids_query = "SELECT META().id AS id FROM `vector-sample`.`color`.`rgb`" +get_ids_query = "SELECT META().id AS id FROM `color-vector-sample`.`color`.`rgb`" search_colors = cluster.query(get_ids_query) search_color_ids = [row["id"] for row in search_colors] @@ -29,10 +29,10 @@ def run_vector_query(search_color_id, use_rerank=False, limit=10): query = f""" WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` + FROM `color-vector-sample`.`color`.`rgb-questions` WHERE meta().id = "{search_color_id}") SELECT b.color, b.description, b.id - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4, {rerank_str}) LIMIT {limit}; """ diff --git a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp index 700aedccf..7c16ec672 100644 --- a/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp +++ b/modules/vector-index/examples/gsi-vector-idx-examples.sqlpp @@ -2,8 +2,8 @@ SELECT RAW OBJECT_PUT(d, "embedding_vector_dot", ARRAY_CONCAT(d.embedding_vector_dot[0:4], ["..."]) ) -FROM `vector-sample`.`color`.`rgb` AS d -USE KEYS ["#FFEFD5"]; +FROM `color-vector-sample`.`color`.`rgb` AS d +USE KEYS ["FFEFD5"]; /* end::get-sample-doc[] */ /* tag::get-sample-doc-question[] */ @@ -15,25 +15,25 @@ SELECT RAW OBJECT_PUT(d, "couchbase_search_query", FOR k IN d.couchbase_search_query.knn END ) ) -FROM `vector-sample`.`color`.`rgb-questions` AS d +FROM `color-vector-sample`.`color`.`rgb-questions` AS d USE KEYS ["#FFEFD5"]; /* end::get-sample-doc-question[] */ /* tag::create-rgb-idx[] */ -CREATE INDEX `color_vectors_idx` ON `vector-sample`.`color`.`rgb` +CREATE INDEX `color_vectors_idx` ON `color-vector-sample`.`color`.`rgb` (`colorvect_l2` VECTOR, color, brightness) WITH { "dimension":3 , "similarity":"L2", "description":"IVF,SQ8"}; /* end::create-rgb-idx[] */ /* tag::create-vectors-idx[] */ -CREATE INDEX `color_desc_idx` ON `vector-sample`.`color`.`rgb` +CREATE INDEX `color_desc_idx` ON `color-vector-sample`.`color`.`rgb` (`embedding_vector_dot` VECTOR, color, brightness) WITH { "dimension":1536, "similarity":"DOT", "description":" IVF,SQ8" } /* end::create-vectors-idx[] */ /* tag::create-colors-idx[] */ -CREATE INDEX `color_name_idx` ON `vector-sample`.`color`.`rgb` +CREATE INDEX `color_name_idx` ON `color-vector-sample`.`color`.`rgb` (color, brightness, `embedding_vector_dot` VECTOR) WITH { "dimension":1536, "similarity":"DOT", "description":" IVF,SQ8" } /* end::create-colors-idx[] */ @@ -54,8 +54,8 @@ LIMIT 5; /* tag::query-vectors-idx-subquery[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - from `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#FFEFD5") + from `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#FFEFD5") SELECT b.color, b.description from `rgb` AS b order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "DOT") LIMIT 3; @@ -64,8 +64,8 @@ question_vec[0], "DOT") LIMIT 3; /* tag::query-vectors-idx-subquery-filtered[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - from `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#FFEFD5") + from `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#FFEFD5") SELECT b.color, b.description, b.brightness from `rgb` AS b WHERE b.brightness > 190.0 order by APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, diff --git a/modules/vector-index/examples/hyperscale-idx-examples.sqlpp b/modules/vector-index/examples/hyperscale-idx-examples.sqlpp index ba9637253..6275d04d0 100644 --- a/modules/vector-index/examples/hyperscale-idx-examples.sqlpp +++ b/modules/vector-index/examples/hyperscale-idx-examples.sqlpp @@ -1,6 +1,6 @@ /* tag::create-rgb-idx[] */ CREATE VECTOR INDEX `color_desc_hyperscale` - ON `vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) + ON `color-vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) WITH { "dimension":1536, "similarity":"L2", "description":"IVF8,SQ4" } /* end::create-rgb-idx[] */ @@ -14,8 +14,8 @@ SELECT d.embedding_vector_dot[0:4], ["..."] ) AS embedding_vector_dot -FROM `vector-sample`.`color`.`rgb` AS d -WHERE d.id = "#87CEEB"; +FROM `color-vector-sample`.`color`.`rgb` AS d +USE KEYS "87CEEB"; /* end::rgb-entry[] */ @@ -28,28 +28,28 @@ SELECT d.couchbase_search_query.knn[0].vector[0:4], ["..."] ) AS vector -FROM `vector-sample`.`color`.`rgb-questions` AS d -WHERE d.id = "#87CEEB"; +FROM `color-vector-sample`.`color`.`rgb-questions` AS d +USE KEYS "#87CEEB"; /* end::query-rgb-questions[] */ /* tag::query-rgb-with-subquery[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB"), + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB"), question_answer AS ( SELECT wanted_similar_color_from_search - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB") + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB") SELECT b.color, b.description, q.wanted_similar_color_from_search - FROM `vector-sample`.`color`.`rgb` AS b, question_answer as q + FROM `color-vector-sample`.`color`.`rgb` AS b, question_answer as q ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) LIMIT 3; /* end::query-rgb-with-subquery[] */ /* tag::create-idx-brightness[] */ CREATE VECTOR INDEX `color_desc_hyperscale_brightness` - ON `vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) + ON `color-vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) INCLUDE (`brightness`) WITH { "dimension":1536, "similarity":"L2", "description":"IVF8,SQ4" } /* end::create-idx-brightness[] */ @@ -57,10 +57,10 @@ CREATE VECTOR INDEX `color_desc_hyperscale_brightness` /* tag::query-rgb-with-brightness[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB") + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB") SELECT b.color, b.description, b.brightness - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b WHERE b.brightness > 170.0 ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) LIMIT 3; @@ -68,7 +68,7 @@ SELECT b.color, b.description, b.brightness /* tag::create-rgb-no-persist[] */ CREATE VECTOR INDEX `color_desc_hyperscale_no_persist` - ON `vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) + ON `color-vector-sample`.`color`.`rgb`(`embedding_vector_dot` VECTOR) WITH { "dimension":1536, "similarity":"L2", "description":"IVF8,SQ4", "persist_full_vector": false}; /* end::create-rgb-no-persist[] */ @@ -76,10 +76,10 @@ CREATE VECTOR INDEX `color_desc_hyperscale_no_persist` /* tag::rerank-before-example[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#FFFFE0") + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#FFFFE0") SELECT b.color, b.description, b.id - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) LIMIT 3; /* end::rerank-before-example[] */ @@ -87,10 +87,10 @@ WITH question_vec AS ( /* tag::rerank-after-example[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#FFFFE0") + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#FFFFE0") SELECT b.color, b.description, b.id - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4, TRUE) LIMIT 3; /* end::rerank-after-example[] */ @@ -99,28 +99,27 @@ WITH question_vec AS ( /* tag::query-rgb-with-distance[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB"), + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB"), question_answer AS ( SELECT wanted_similar_color_from_search - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB") + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB") SELECT b.color, b.description, q.wanted_similar_color_from_search, approx_distance - FROM `vector-sample`.`color`.`rgb` AS b, question_answer as q, - APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) - as approx_distance + FROM `color-vector-sample`.`color`.`rgb` AS b, question_answer as q + LET approx_distance = APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) ORDER BY approx_distance LIMIT 3; /* end::query-rgb-with-distance[] */ /* tag::untuned-query[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB" + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB" ), colors AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") LIMIT 10 ) SELECT RAW colors; @@ -130,12 +129,12 @@ SELECT RAW colors; /* tag::exact-query[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB" + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB" ), colors AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") LIMIT 10 ) SELECT RAW colors; @@ -145,20 +144,20 @@ SELECT RAW colors; -- Get the vector for the question WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB" + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB" ), -- Exact Search results GroundTruthResults AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") LIMIT 10 ), -- Approximate Search results ApproximateResults AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") LIMIT 10 ) @@ -182,20 +181,20 @@ LEFT JOIN -- Get the vector for the question WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB" + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB" ), -- Exact Search results GroundTruthResults AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2") LIMIT 10 ), -- Approximate Search results, this timw with nProbes set to 4: ApproximateResults AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) LIMIT 10 ) @@ -219,12 +218,12 @@ LEFT JOIN /* tag::tuned-query[] */ WITH question_vec AS ( SELECT RAW couchbase_search_query.knn[0].vector - FROM `vector-sample`.`color`.`rgb-questions` - WHERE meta().id = "#87CEEB" + FROM `color-vector-sample`.`color`.`rgb-questions` + USE KEYS "#87CEEB" ), colors AS ( SELECT b.color - FROM `vector-sample`.`color`.`rgb` AS b + FROM `color-vector-sample`.`color`.`rgb` AS b ORDER BY APPROX_VECTOR_DISTANCE(b.embedding_vector_dot, question_vec[0], "l2", 4) LIMIT 10 ) SELECT RAW colors; diff --git a/modules/vector-index/pages/composite-vector-index.adoc b/modules/vector-index/pages/composite-vector-index.adoc index 7204c06b2..28da9baf2 100644 --- a/modules/vector-index/pages/composite-vector-index.adoc +++ b/modules/vector-index/pages/composite-vector-index.adoc @@ -52,6 +52,19 @@ See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector include::vector-search:partial$download-sample-partial.adoc[] +include::vector-search:partial$download-sample-partial.adoc[] + +In addition, to get the best results with the examples on this page, download the following sample dataset: + +https://cbc-remote-execution-examples-prod.s3.amazonaws.com/color_data_2vectors.zip[Download color_data_2vectors.zip] + +When you have downloaded `color_data_2vectors.zip`, unzip it, then xref:guides:load.adoc[import] the `rgb_questions.json` file with the following settings: + +* Use the `color-vector-sample` bucket. +* Use the `color` scope. +* Create a new target collection called `rgb-questions` -- with a hyphen `-`, not an underscore `_`. +* To set your document keys, use the value of the `id` field from the JSON document. + [#create-index] include::vector-index:partial$create-composite-index-capella-ui.adoc[opts=optional] @@ -98,7 +111,7 @@ include::partial$index-algorithm-settings.adoc[] The following examples show you how to create two Composite Vector index with a vector column using sample data. They both use the data from the `color_data_2vectors.zip` file mentioned earlier. -The following query gets a single document from the `rgb` collection in the `vector-sample` bucket's `color` scope. +The following query gets a single document from the `rgb` collection in the `color-vector-sample` bucket's `color` scope. It truncates the `embedding_vector_dot` attribute to the first four values to improve readability. [source,sqlpp] @@ -115,7 +128,7 @@ include::vector-index:example$composite-vector-data.json[tag=sample-doc] ==== Index the RGB Values -The `rgb.json` file's `colorvect_l2` attribute defines an array containing the RGB values for the entry's color. +The `rgb` collection's `colorvect_l2` attribute defines an array containing the RGB values for the entry's color. While this technically is not an embedded vector, you can still create a vector index column for this array. The following example creates a Composite Vector index for this attribute as an embedded vector as well as the color's name and brightness. @@ -366,7 +379,7 @@ In a production environment, your application calls the same embedding model it For this example, you can use embedded vectors in the `rgb_questions.json` file that's in the `color_data_2vectors.zip` file. This file contains a `question` attribute containing a search prompt for a particular color. -The following query gets a single document from the `rgb_questions` collection in the `vector-sample` bucket's `color` scope. +The following query gets a single document from the `rgb_questions` collection in the `color-vector-sample` bucket's `color` scope. It truncates the `couchbase_search_query.knn.vector` attribute to the first four values to improve readability. [source,sqlpp] @@ -394,7 +407,7 @@ include::vector-index:example$query-vectors-idx-whole.sqlpp[tags=!query-vectors- Click btn:[icon:github[\] View] to see and copy the entire query with all the vectors. -Another option is to import the `rgb_questions.json` file into another collection in the `vector-sample` bucket's `color` scope named `rgb-questions`. +Another option is to import the `rgb_questions.json` file into another collection in the `color-vector-sample` bucket's `color` scope named `rgb-questions`. Then you can use a subquery to get the vectors for the question and use it in your query of the `rgb` collection's `embedding_vector_dot` attribute: [source,sqlpp] diff --git a/modules/vector-index/pages/hyperscale-vector-index.adoc b/modules/vector-index/pages/hyperscale-vector-index.adoc index b213bd327..2ec05b5bd 100644 --- a/modules/vector-index/pages/hyperscale-vector-index.adoc +++ b/modules/vector-index/pages/hyperscale-vector-index.adoc @@ -63,6 +63,17 @@ See xref:vector-index:vectors-and-indexes-overview.adoc#vector_similarity[Vector include::vector-search:partial$download-sample-partial.adoc[] +In addition, to get the best results with the examples on this page, download the following sample dataset: + +https://cbc-remote-execution-examples-prod.s3.amazonaws.com/color_data_2vectors.zip[Download color_data_2vectors.zip] + +When you have downloaded `color_data_2vectors.zip`, unzip it, then xref:guides:load.adoc[import] the `rgb_questions.json` file with the following settings: + +* Use the `color-vector-sample` bucket. +* Use the `color` scope. +* Create a new target collection called `rgb-questions` -- with a hyphen `-`, not an underscore `_`. +* To set your document keys, use the value of the `id` field from the JSON document. + [#create-index] include::vector-index:partial$create-hyperscale-index-capella-ui.adoc[opts=optional] @@ -112,12 +123,10 @@ include::partial$index-algorithm-settings.adoc[] [#examples] === Create Hyperscale Vector Index Example -The examples in this section use a dataset that contains information about colors including a text description of the color. -There's also a field named `couchbase_search_query.knn.vector` that contains an embedded vector for the color description. - -include::vector-search:partial$download-sample-partial.adoc[] +The examples in this section use the `color-vector-sample.color.rgb` collection. +This contains information about colors, including a text description of the color. -The following query returns a sample document from the data in the `vector-sample.color.rgb` collection, truncating the embedded vector to 4 values to make the result readable: +The following query returns a sample document from the data in the `color-vector-sample.color.rgb` collection, truncating the embedded vector to 4 values to make the result readable: [source,sqlpp] ---- @@ -132,7 +141,7 @@ The result of running the query is: include::vector-index:example$hyperscale-idx-data.json[tag=rgb-document] ---- -The following example creates an Hyperscale vector index for the vector column named `embedding-vector-dot`. +The following example creates an Hyperscale Vector index for the vector column named `embedding-vector-dot`. [source,sqlpp] ---- @@ -205,7 +214,7 @@ You must supply a vector value in your query that Couchbase {product-name} can c In actual use, your application generates a vector for the query value using the same embedding model it used to embed the vectors in your documents. To avoid the complication of calling an embedding model, this example uses embedded vectors in the `rgb_questions.json` file that's included in `color_data_2vectors.zip`. -For this example, the contents of this file are loaded into a collection named `vector-sample.color.rgb-questions`. +For this example, the contents of this file are loaded into a collection named `color-vector-sample.color.rgb-questions`. This collection contains a `question` attribute which is a search prompt for a particular color. The `couchbase_search_query.knn.vector` attribute contains the embedded vector for the `question` attribute. The following query lists several attributes from a document in the collection. @@ -224,7 +233,7 @@ include::vector-index:example$hyperscale-idx-data.json[tag=query-rgb-questions-o ---- To use the embedded vector, you need to include the `couchbase_search_query.knn.vector` attribute in your query's `SELECT` statement. -You can either directly copy and paste the entire array into your query or use a subquery to retrieve it from the `vector-sample.color.rgb-questions` collection. +You can either directly copy and paste the entire array into your query or use a subquery to retrieve it from the `color-vector-sample.color.rgb-questions` collection. The following example uses a subquery to get the vector, and also includes the `wanted_similar_color_from_search` attribute in the output which shows you the color that the query should return. [source,sqlpp] diff --git a/modules/vector-index/pages/vector-index-best-practices.adoc b/modules/vector-index/pages/vector-index-best-practices.adoc index 84b93e85a..a0ab8175a 100644 --- a/modules/vector-index/pages/vector-index-best-practices.adoc +++ b/modules/vector-index/pages/vector-index-best-practices.adoc @@ -210,6 +210,9 @@ The following example uses the `VECTOR_DISTANCE` function instead of the `APPROX include::vector-index:example$hyperscale-idx-examples.sqlpp[tag=exact-query] ---- +TIP: If the query fails and Couchbase Capella advises you to create a primary index, click btn:[Build Primary Index]. +When the primary index is created, run the query again. + Running the query returns the following results: [source,json] diff --git a/modules/vector-search/examples/run-vector-search-generate-embed.go b/modules/vector-search/examples/run-vector-search-generate-embed.go index 4894d3ead..37623b39e 100644 --- a/modules/vector-search/examples/run-vector-search-generate-embed.go +++ b/modules/vector-search/examples/run-vector-search-generate-embed.go @@ -74,7 +74,7 @@ func main() { username := os.Getenv("CB_USERNAME") password := os.Getenv("CB_PASSWORD") // Make sure to change the bucket, and scope names to match where you stored the sample data in your database. - bucket_name := "vector-sample" + bucket_name := "color-vector-sample" scope_name := "color" cluster, err := gocb.Connect(connstr, gocb.ClusterOptions{ diff --git a/modules/vector-search/examples/run-vector-search-generate-embed.java b/modules/vector-search/examples/run-vector-search-generate-embed.java index 183d14514..af60ff3f9 100644 --- a/modules/vector-search/examples/run-vector-search-generate-embed.java +++ b/modules/vector-search/examples/run-vector-search-generate-embed.java @@ -67,7 +67,7 @@ public static void main(String[] args) { String username = System.getenv("CB_USERNAME"); String password = System.getenv("CB_PASSWORD"); // Make sure to change the bucket, scope, collection, and index names to match where you stored the sample data in your database. - String bucketName = "vector-sample"; + String bucketName = "color-vector-sample"; String scopeName = "color"; String collectionName = "rgb"; String searchIndexName = "color-index"; diff --git a/modules/vector-search/examples/run-vector-search-generate-embed.py b/modules/vector-search/examples/run-vector-search-generate-embed.py index 4a80dc62c..14916721d 100644 --- a/modules/vector-search/examples/run-vector-search-generate-embed.py +++ b/modules/vector-search/examples/run-vector-search-generate-embed.py @@ -22,7 +22,7 @@ pa = PasswordAuthenticator(os.getenv("CB_USERNAME"), os.getenv("CB_PASSWORD")) cluster = Cluster("couchbases://" + os.getenv("CB_HOSTNAME") + "/?ssl=no_verify", ClusterOptions(pa)) # Make sure to change the bucket, scope, and index names to match where you stored the sample data in your database. -bucket = cluster.bucket("vector-sample") +bucket = cluster.bucket("color-vector-sample") scope = bucket.scope("color") search_index = "color-index" try: diff --git a/modules/vector-search/examples/run-vector-search-simple-color.go b/modules/vector-search/examples/run-vector-search-simple-color.go index 9f56e35df..a3718c3a6 100644 --- a/modules/vector-search/examples/run-vector-search-simple-color.go +++ b/modules/vector-search/examples/run-vector-search-simple-color.go @@ -16,7 +16,7 @@ func main() { username := os.Getenv("CB_USERNAME") password := os.Getenv("CB_PASSWORD") // Make sure to change the bucket, and scope names to match where you stored the sample data in your database. - bucket_name := "vector-sample" + bucket_name := "color-vector-sample" scope_name := "color" cluster, err := gocb.Connect(connstr, gocb.ClusterOptions{ diff --git a/modules/vector-search/examples/run-vector-search-simple-color.java b/modules/vector-search/examples/run-vector-search-simple-color.java index 9ff873d4d..88dfd77f0 100644 --- a/modules/vector-search/examples/run-vector-search-simple-color.java +++ b/modules/vector-search/examples/run-vector-search-simple-color.java @@ -18,7 +18,7 @@ public static void main(String[] args) { String username = System.getenv("CB_USERNAME"); String password = System.getenv("CB_PASSWORD"); // Make sure to change the bucket, scope, collection, and index names to match where you stored the sample data in your database. - String bucketName = "vector-sample"; + String bucketName = "color-vector-sample"; String scopeName = "color"; String collectionName = "rgb"; String searchIndexName = "color-index"; diff --git a/modules/vector-search/examples/run-vector-search-simple-color.py b/modules/vector-search/examples/run-vector-search-simple-color.py index ee0869c13..85516c514 100644 --- a/modules/vector-search/examples/run-vector-search-simple-color.py +++ b/modules/vector-search/examples/run-vector-search-simple-color.py @@ -17,7 +17,7 @@ pa = PasswordAuthenticator(os.getenv("CB_USERNAME"), os.getenv("CB_PASSWORD")) cluster = Cluster("couchbases://" + os.getenv("CB_HOSTNAME") + "/?ssl=no_verify", ClusterOptions(pa)) # Make sure to change the bucket, scope, and index names to match where you stored the sample data in your database. -bucket = cluster.bucket("vector-sample") +bucket = cluster.bucket("color-vector-sample") scope = bucket.scope("color") search_index = "color-index" try: diff --git a/modules/vector-search/examples/vector-search-index-payload.jsonc b/modules/vector-search/examples/vector-search-index-payload.jsonc index 5b70f0f21..7c5d47c8d 100644 --- a/modules/vector-search/examples/vector-search-index-payload.jsonc +++ b/modules/vector-search/examples/vector-search-index-payload.jsonc @@ -1,8 +1,8 @@ { "type": "fulltext-index", - "name": "vector-sample.color.color-index", + "name": "color-vector-sample.color.color-index", "sourceType": "gocbcore", - "sourceName": "vector-sample", + "sourceName": "color-vector-sample", "planParams": { "maxPartitionsPerPIndex": 512, "indexPartitions": 1 diff --git a/modules/vector-search/partials/download-sample-partial.adoc b/modules/vector-search/partials/download-sample-partial.adoc index 3786ab73a..8f8167ddb 100644 --- a/modules/vector-search/partials/download-sample-partial.adoc +++ b/modules/vector-search/partials/download-sample-partial.adoc @@ -1,4 +1,4 @@ You can import a sample dataset to use with the procedure or examples on this page. -Go to menu:Data Tools[Import] from your cluster and xref:clusters:data-service/import-data-documents.adoc#import-sample-data[import the vector-sample] sample data. +Go to menu:Data Tools[Import] from your cluster and xref:clusters:data-service/import-data-documents.adoc#import-sample-data[import the color-vector-sample] sample data. From 36ed8f93cf8233b48902c544f0b3230bd9da3ae8 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Fri, 17 Oct 2025 22:42:42 +0100 Subject: [PATCH 76/80] DOC-13645: [Capella] ALTER INDEX move is disabled (#454) * Update ALTER INDEX for Capella * Update ALTER VECTOR INDEX for Capella * Update common errors * Minor tweaks --- .../n1ql-language-reference/alterindex.adoc | 156 +++--------------- .../altervectorindex.adoc | 74 +-------- 2 files changed, 28 insertions(+), 202 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc b/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc index ddbcb9932..e399b46d0 100644 --- a/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/alterindex.adoc @@ -1,5 +1,5 @@ = ALTER INDEX -:description: The ALTER INDEX statement moves the placement of an existing index or replica among different GSI nodes. +:description: The ALTER INDEX statement increases or decreases the number of index replicas and partition replicas. :page-partial: :page-toclevels: 2 :imagesdir: ../../assets/images @@ -24,27 +24,17 @@ Both statements have the same functionality. //tag::purpose[] == Purpose -You can use the `{doctitle}` statement to change the placement of an existing index or replica among different GSI nodes, to increase or decrease the number of replicas, or to drop a specified index replica temporarily. +You can use the `{doctitle}` statement to increase or decrease the number of replicas, or to drop a specified index replica temporarily. You can also use it to perform the same alterations to a partitioned index and any replica partitions. You may use this statement when you encounter any of the following situations: -* An imbalance occurs due to a particular index growing faster than expected and is needed on a different node. +* An imbalance occurs due to a particular index growing faster than expected, and a replica is needed on a different node. * An imbalance occurs due to a cluster of indexes being dropped on a single node. -* A machine is scheduled for removal, so its indexes need to move off its current node. +* A node is scheduled for removal, and its index replicas need to be dropped. * The automated process of rebalancing does not give the expected results. * Other types of scaling up or scaling down are needed. -For example, if a node fails, you can use the `{doctitle}` statement to move an index to another node. -See <> below. - -NOTE: The {doctitle} move operation is asynchronous. -As soon as the move alter index command is executed, the command returns. -If there is no error in the input, the move operation can be tracked through the console UI and any error can be found in the Console logs and Indexer logs. - If a node goes down while an {doctitle} operation is happening, then the index would rollback to its original node (not affecting queries) and a notification would appear. - -IMPORTANT: It's not possible to move an index or index replica and change the number of index replicas at the same time. - //end::purpose[] //tag::prerequisites[] @@ -298,14 +288,13 @@ __required__ The possible values are: move::: -Moves an index (or its replicas) to a different node while not making any changes to the index topology -- for example, the number of replicas remains the same. -You must use the `nodes` property to specify the target node or nodes. +You cannot use this action in Couchbase Capella, as it defaults to file-based index rebalancing. replica_count::: Alters the number of replicas. You must use the `num_replica` property to specify the required number of replicas. -You can use the `nodes` property to restrict the placement of index replicas to the specified nodes. The planner decides where to place any new index replicas on the available index nodes, based on the server load. +In Couchbase Capella, you cannot restrict the placement of index replicas to specified nodes. drop_replica::: Drops a specified replica temporarily; for example, to repair a replica. @@ -319,21 +308,12 @@ __optional__ An integer specifying the number of replicas of the index. The index service will automatically distribute these indexes amongst the index nodes in the cluster for load balancing and high availability purposes. The index service attempts to distribute the replicas based on the server groups in use in the cluster where possible. -(You can restrict the number of index nodes available for index and index replica placement using the `nodes` property, described below.) +(In Couchbase Capella, you cannot restrict the placement of index replicas to specified nodes.) | Integer |**nodes** + __optional__ -| Required if `action` is set to `move`; + -Optional if `action` is set to `replica_count`. - -An array of strings, specifying a list of nodes. -If `action` is set to `move`, the node list determines the new destination nodes for the index and its replicas. -If `action` is set to `replica_count` and you're increasing the number of replicas, the node list restricts the set of nodes available for placement of the index and its replicas. -However, if `action` is set to `replica_count` and you're decreasing the number of replicas, the `nodes` property is ignored. - -NOTE: You cannot use this property in Couchbase Capella, as it defaults to file-based index rebalancing. -See xref:server:learn:clusters-and-availability/rebalance.adoc#index-rebalance-methods[Index Rebalance Methods]. +| You cannot use this property in Couchbase Capella, as it defaults to file-based index rebalancing. | String array |**replicaId** + @@ -354,22 +334,18 @@ The statement will not work while the cluster is undergoing a rebalance. === Moving an Index or Index Replicas -When moving an index or index replicas, the number of destination nodes must be the same as the number of nodes on which the index and any replicas are currently placed. -You must specify the full node list, even if you only need to move a single replica. +You cannot use this statement to move indexes or index replicas in Couchbase Capella, as it defaults to file-based index rebalancing. -Likewise, when moving a partitioned index, the number of destination nodes must be the same as the number of nodes on which the index partitions and any replicas are currently placed. -You cannot use this statement to repartition an index across a different number of nodes. - -The source and destination node ranges may overlap, for example you may move a partitioned index from `["192.168.0.15:9000", "27.0.0.1:9001"]` to `["192.168.0.15:9000", "127.0.0.1:9002"]`. +Likewise, you cannot use this statement to repartition an index across a different number of nodes. === Changing the Replica Count When changing the number of replicas, the specified number of replicas must be less than the number of index nodes available for placement. If the specified number of replicas is greater than or equal to the number of index nodes available for placement, then the operation will fail. -If you specify a node list when changing the number of replicas, the specified nodes must include all of the nodes on which the index or index partitions and any index replicas are currently placed. +In Couchbase Capella, you cannot restrict the placement of index replicas to specified nodes. -When increasing the number of replicas, whether you specify a node list or not, no single index node will host more than 1 replica of the same index, or the same partition of the same index. +When increasing the number of replicas, no single index node will host more than 1 replica of the same index, or the same partition of the same index. Replicas are distributed across the available server groups. When reducing the number of replicas, the index service will first drop unhealthy replicas, where an unhealthy replica is a replica with missing partitions. @@ -389,10 +365,6 @@ For a partitioned index, run a rebalance to move a replica into the vacant serve === Index Redistribution -Using this statement to move 1 index at a time may be cumbersome if there are a lot of indexes to be moved. -ifdef::flag-devex-rest-api[] -The index redistribution setting enables you to specify how -endif::flag-devex-rest-api[] Couchbase Capella redistributes indexes automatically on rebalance. For more information, see {rebalancing-the-index-service}[Rebalance]. //end::usage[] @@ -403,9 +375,8 @@ For more information, see {rebalancing-the-index-service}[Rebalance]. If the statement succeeds, then: * The query returns an empty array. -* The index alteration is visible in the Query tab. -* After the movement is complete, the new indexes begin to service query scans. -* The command line displays the new index nodes. +* The index alteration is visible in the Indexes tab. +* After the alteration is complete, the new indexes begin to service query scans. If the statement fails, then: @@ -420,24 +391,21 @@ If the statement fails, then: a| * Mistyped an index name -| `Missing Node Information For Move Index` +| `move index is disabled` a| -* Mistyped `"node"` instead of `"nodes"` -* Mistyped punctuation or other item +* Attempted to move a replica -| `No Index Movement Required for Specified Destination List` +| `"nodes" clause is disabled with alter index as file based rebalance (shard affinity) is enabled` a| -* Entered the current node instead of the target node +* Attempted to restrict replicas to specified nodes when altering the number of replicas | `syntax error - at \",\"` a| * Missed a double-quote mark (`"`) -| `Unable to find Index service for destination xxx.xxx.xxx.xxx:8091 or destination is not part of the cluster` +| `Fail to alter index: Fail to drop replica` a| -* Address does not exist or was mistyped -* Node is not running -* Node not properly added to the cluster +* Replica does not exist or was mistyped | `Unsupported action value` a| @@ -450,66 +418,14 @@ a| include::ROOT:partial$query-context.adoc[tag=section] -.Move the `def_inventory_airport_faa` index from one node to another -==== -Create a cluster of 3 nodes and install the `travel-sample` bucket. -The indexes are then installed in a round-robin fashion and distributed over the 3 nodes. - -Then move the `def_inventory_airport_faa` index from its original node (`svc-dqi-node-001` in this example) to a new node (`svc-dqi-node-002` in this example). - -[source,sqlpp] ----- -include::example$n1ql-language-reference/alter-idx-move.n1ql[] ----- - -You should see: - -[source,json] ----- -include::example$n1ql-language-reference/alter-idx-move.jsonc[] ----- -==== - -.Create and move an index replica from one node to another -==== -Create an index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then move its replica from node `svc-dqi-node-002` to `svc-dqi-node-003`. - -[source,sqlpp] ----- -CREATE INDEX country_idx ON airport(country, city) - USING GSI - WITH {"nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091"]}; - -ALTER INDEX country_idx ON airport -WITH {"action": "move", - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-003:18091"]}; ----- -==== - -.Moving multiple replicas -==== -Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then move the replicas to nodes `svc-dqi-node-004` and `svc-dqi-node-005`. - -[source,sqlpp] ----- -CREATE INDEX country_idx ON airport(country, city) -WITH {"nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091", - "svc-dqi-node-003:18091"]}; - -ALTER INDEX country_idx ON airport -WITH {"action": "move", - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-004:18091", - "svc-dqi-node-005:18091"]}; ----- -==== +The examples in this section assume that you have a cluster with at least 4 nodes. +The nodes are named `svc-dqi-node-001`, `svc-dqi-node-002`, and `svc-dqi-node-003`, and `svc-dqi-node-004`. +The nodes in your cluster may have different names or IP addresses. .Increasing the number of replicas ==== -Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then increase the number of replicas to 4 and specify that new replicas may be placed on any available index nodes in the cluster. +Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then increase the number of replicas to 4. +New replicas may be placed on any available index nodes in the cluster. [source,sqlpp] ---- @@ -523,28 +439,6 @@ WITH {"action": "replica_count", "num_replica": 4}; ---- ==== -.Increasing the number of replicas and restricting the nodes -==== -Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then increase the number of replicas to 4, and specify that replicas may now also be placed on nodes `svc-dqi-node-004` and `svc-dqi-node-005`. - -[source,sqlpp] ----- -CREATE INDEX country_idx ON airport(country, city) -WITH {"nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091", - "svc-dqi-node-003:18091"]}; - -ALTER INDEX country_idx ON airport -WITH {"action": "replica_count", - "num_replica": 4, - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091", - "svc-dqi-node-003:18091", - "svc-dqi-node-004:18091", - "svc-dqi-node-005:18091"]}; ----- -==== - .Decreasing the number of replicas ==== Create an index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then decrease the number of replicas to 1. diff --git a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc index 18a6da352..9e9b07cc8 100644 --- a/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/altervectorindex.adoc @@ -1,5 +1,5 @@ = ALTER VECTOR INDEX -:description: The ALTER VECTOR INDEX statement moves the placement of an existing index or replica among different GSI nodes. +:description: The ALTER VECTOR INDEX statement increases or decreases the number of index replicas and partition replicas. :page-status: Couchbase Server 8.0 :page-toclevels: 2 :imagesdir: ../../assets/images @@ -63,55 +63,10 @@ The nodes in your cluster may have different names or IP addresses. . Set the query context to the `color` scope in the `color-vector-sample` dataset. For more information, see xref:n1ql:n1ql-intro/queriesandresults.adoc#query-context[Query Context]. -.Create and move an index from one node to another -==== -Create a Hyperscale Vector index on node `svc-dqi-node-001`. - -[source,sqlpp] ----- -CREATE VECTOR INDEX hyperscale_idx_move - ON rgb(embedding_vector_dot VECTOR) - WITH {"dimension": 1536, - "similarity": "L2", - "description": "IVF8,SQ4", - "nodes": "svc-dqi-node-001:18091"} ----- - -Then move the index from its original node (`svc-dqi-node-001` in this example) to a new node (`svc-dqi-node-002` in this example). - -[source,sqlpp] ----- -ALTER VECTOR INDEX hyperscale_idx_move ON rgb -WITH {"action": "move", "nodes": ["svc-dqi-node-002:18091"]}; ----- - -To check the node where the index is located, see xref:manage:manage-indexes/manage-indexes.adoc[]. -==== - -.Create and move an index replica from one node to another -==== -Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then move its replica from node `svc-dqi-node-002` to `svc-dqi-node-003`. - -[source,sqlpp] ----- -CREATE VECTOR INDEX hyperscale_rep_move - ON rgb(embedding_vector_dot VECTOR) - WITH {"dimension": 1536, - "similarity": "L2", - "description": "IVF8,SQ4", - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091"]}; - -ALTER VECTOR INDEX hyperscale_rep_move ON rgb -WITH {"action": "move", - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-003:18091"]}; ----- -==== - .Increase the number of replicas ==== -Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on nodes `svc-dqi-node-002`, then increase the number of replicas to 2 and specify that new replicas may be placed on any available index nodes in the cluster. +Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then increase the number of replicas to 2. +New replicas may be placed on any available index nodes in the cluster. [source,sqlpp] ---- @@ -128,29 +83,6 @@ WITH {"action": "replica_count", "num_replica": 2}; ---- ==== -.Increase the number of replicas and specify the nodes -==== -Create a Hyperscale Vector index on node `svc-dqi-node-001` with a replica on node `svc-dqi-node-002`, then increase the number of replicas to 2, and specify that replicas may be placed on nodes `svc-dqi-node-002` and `svc-dqi-node-003`. - -[source,sqlpp] ----- -CREATE VECTOR INDEX hyperscale_rep_increase - ON rgb(embedding_vector_dot VECTOR) - WITH {"dimension": 1536, - "similarity": "L2", - "description": "IVF8,SQ4", - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091"]}; - -ALTER VECTOR INDEX hyperscale_rep_increase ON rgb -WITH {"action": "replica_count", - "num_replica": 2, - "nodes": ["svc-dqi-node-001:18091", - "svc-dqi-node-002:18091", - "svc-dqi-node-003:18091"]}; ----- -==== - .Decrease the number of replicas ==== Create a Hyperscale Vector index on node `svc-dqi-node-001` with replicas on nodes `svc-dqi-node-002` and `svc-dqi-node-003`, then decrease the number of replicas to 1. From 6a2ff073ebcce44930a496b27270936e2b53ae55 Mon Sep 17 00:00:00 2001 From: Gary Gray <137797428+ggray-cb@users.noreply.github.com> Date: Fri, 17 Oct 2025 17:54:18 -0400 Subject: [PATCH 77/80] fixed a few issues I noticed when looking at the vector index intro. (#453) --- modules/vector-index/pages/vectors-and-indexes-overview.adoc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/vector-index/pages/vectors-and-indexes-overview.adoc b/modules/vector-index/pages/vectors-and-indexes-overview.adoc index f25d1cfeb..f7ef7a294 100644 --- a/modules/vector-index/pages/vectors-and-indexes-overview.adoc +++ b/modules/vector-index/pages/vectors-and-indexes-overview.adoc @@ -110,7 +110,7 @@ You can use external embedding models or https://www.couchbase.com/products/ai-s == Vector Similarity Metrics Once you have embedded vectors in your database, you find documents with a similar meaning by finding similar vectors. -You use metrics to (also referred to as distance functions) to find similar vectors. +You use metrics (also known as distance functions) to find similar vectors. When you create an index or perform a vector search, you must specify which metric to use to compare vectors. Each metric works best for certain applications and types of data. @@ -135,7 +135,8 @@ For example, if your query returns the distance between vectors as a column, Cou Euclidean Distance is useful for tasks such as: -* 3D motion capture where you're detecting similar positions or trajectories of joints, objects, where finding real-world values for thresholds is important. +* 3D motion capture where you're detecting similar positions or trajectories of joints or objects. +In these applications, finding real-world values for thresholds is important. * Geographic or spatial searches where you care about exact (and often real-world) distances. * Other cases where you use the results as filters in calculations that require the actual distance between the vectors. From 0b4e11501bc820a254bb6028955e718e2576c867 Mon Sep 17 00:00:00 2001 From: Simon Dew <39966290+simon-dew@users.noreply.github.com> Date: Tue, 21 Oct 2025 16:11:59 +0100 Subject: [PATCH 78/80] DOC-13651: Incorrect role names in GRANT and REVOKE (#455) * Update GRANT * Update REVOKE --- .../pages/n1ql-language-reference/grant.adoc | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/modules/n1ql/pages/n1ql-language-reference/grant.adoc b/modules/n1ql/pages/n1ql-language-reference/grant.adoc index a8027101f..5941432b9 100644 --- a/modules/n1ql/pages/n1ql-language-reference/grant.adoc +++ b/modules/n1ql/pages/n1ql-language-reference/grant.adoc @@ -21,7 +21,7 @@ parameterized by a keyspace:: Roles which are defined for the context of the specified keyspace only. Specify the keyspace name after the keyword ON. + -The keyspace must be fully qualified and must include the bucket, scope, and collection names. +The keyspace must be fully qualified and must include the bucket, scope, and collection names. Even if you're granting a role to an entire bucket, you must specify the default scope (`_default`) and default collection (`_default`). Using only the bucket name is not sufficient. + @@ -76,7 +76,7 @@ A group name created by the Couchbase Server RBAC system. NOTE: When granting roles to users, the keyword `USER` or `USERS` is optional. However, when granting roles to groups, you must include the keyword `GROUP` or `GROUPS`. -You can use either the singular or plural form of these keywords as this does not affect the number of users or groups the role applies to. +You can use either the singular or plural form of these keywords as this does not affect the number of users or groups the role applies to. [[keyspace-ref,keyspace-ref]] === Keyspace Reference @@ -107,14 +107,11 @@ For more information about the syntax, see the {keyspace-ref}[CREATE INDEX] stat == Usage -GRANT statements support legacy systems and have two forms: +GRANT statements have two forms: .{counter:form}. Unparameterized Roles [source,sqlpp] ---- -GRANT Replication Admin, Query External Access - TO cchaplan, jgleason; - GRANT replication_admin, query_external_access TO cchaplan, jgleason; ---- @@ -122,10 +119,6 @@ GRANT replication_admin, query_external_access .{counter:form}. Parameterized Roles [source,sqlpp] ---- -GRANT Query Select, Views Admin - ON `retail`.`customers`.`orders` - TO bill, linda; - GRANT query_select, views_admin ON `retail`.`customers`.`orders` TO bill, linda; @@ -135,7 +128,7 @@ NOTE: Mixing of parameterized and unparameterized roles or syntax is not allowed == Examples -.Grant the role of Cluster Administrator to multiple users +.Grant the role of Cluster Admin to multiple users ==== [source,sqlpp] ---- @@ -153,7 +146,7 @@ GRANT query_select, data_reader ON `travel-sample`.`_default`.`_default` TO debb .Grant the role of Data Reader on a keyspace to a specific group ==== -[source,sqlpp] +[source,sqlpp] ---- GRANT data_reader ON `travel-sample`.`inventory`.`hotel` TO GROUP sales; ---- From 2083c8ef728419fb31e308153764a2266fb0219c Mon Sep 17 00:00:00 2001 From: Sarah Emmett Date: Tue, 21 Oct 2025 12:29:16 -0400 Subject: [PATCH 79/80] [NO ISSUE] Add anchor link for Learn More + fix formatting issue with procedure --- .../partials/create-composite-index-capella-ui.adoc | 5 ++--- .../partials/create-hyperscale-index-capella-ui.adoc | 4 +++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/modules/vector-index/partials/create-composite-index-capella-ui.adoc b/modules/vector-index/partials/create-composite-index-capella-ui.adoc index a3de56f79..82a91ab45 100644 --- a/modules/vector-index/partials/create-composite-index-capella-ui.adoc +++ b/modules/vector-index/partials/create-composite-index-capella-ui.adoc @@ -19,7 +19,7 @@ You cannot have 2 indexes with the same name inside the same bucket and scope. . Under *Vector Field*, in the *Select Field* list, select the vector field to use in your Composite Vector index. -. (Optional) To add a field to use as a filter on the data included in your Composite Vector index, click btn:[+ Add Filter Field]. +. [[filter-fields]](Optional) To add a field to use as a filter on the data included in your Composite Vector index, click btn:[+ Add Filter Field]. .. Under *Filter Fields*, select the field you want to use to filter your documents before running vector comparisons. @@ -81,13 +81,12 @@ You can also choose to override this value in your queries. A larger value creates smaller centroids. By default, Couchbase sets the *Number of centroids* to the number of vectors in your data divided by 1000. For more information about how to set this value, see xref:vector-index:composite-vector-index.adoc#number-of-centroids[Number of Centroids]. - ++ //// .. To store full vectors in the index, select *Persist Full Vector*. + This increases the storage required for your index but increases accuracy. //// - . Click btn:[Review Index]. . Confirm your Composite Vector Index configuration. . Click btn:[Create Index] or copy the {sqlpp} syntax to create your index with the Query Workbench. diff --git a/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc b/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc index 5c2ea20c3..f7f62cae0 100644 --- a/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc +++ b/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc @@ -19,7 +19,7 @@ You cannot have 2 indexes with the same name inside the same bucket and scope. . Under *Vector Field*, in the *Select Field* list, select the vector field to use in your Hyperscale Vector index. -. (Optional) To add a field to use as a filter on the data included in your Hyperscale Vector index, click btn:[+ Add Filter Field]. +. [[filter-fields]](Optional) To add a field to use as a filter on the data included in your Hyperscale Vector index, click btn:[+ Add Filter Field]. .. Under *Filter Fields*, select the field you want to use to filter your documents. @@ -82,6 +82,8 @@ For more information about how to set this value, see xref:vector-index:hypersca .. To store full vectors in the index, select *Persist Full Vector*. + This increases the storage required for your index but increases accuracy. + ++ . Click btn:[Review Index]. . Confirm your Hyperscale Vector Index configuration. . Click btn:[Create Index] or copy the {sqlpp} syntax to create your index with the Query Workbench. From 2a552f314b8522414623656112490d3cc8a66070 Mon Sep 17 00:00:00 2001 From: Sarah Emmett Date: Tue, 21 Oct 2025 12:35:52 -0400 Subject: [PATCH 80/80] [NO ISSUE] Add anchor link for Learn More --- .../partials/create-composite-index-capella-ui.adoc | 6 +++--- .../partials/create-hyperscale-index-capella-ui.adoc | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/vector-index/partials/create-composite-index-capella-ui.adoc b/modules/vector-index/partials/create-composite-index-capella-ui.adoc index 82a91ab45..ea4306641 100644 --- a/modules/vector-index/partials/create-composite-index-capella-ui.adoc +++ b/modules/vector-index/partials/create-composite-index-capella-ui.adoc @@ -48,7 +48,7 @@ For more information about vector similarity measures, see xref:vector-index:vec For more information about quantization, see xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization]. For more information about how to choose quantization on your index, see xref:vector-index:vectors-and-indexes-overview.adoc#choosing-a-quantization-method[Choosing a Quantization Method] and xref:vector-index:vector-index-best-practices.adoc#quantization[Tuning Index Creation - Quantization]. -.. In the *Dimensions* field, enter the exact dimension of the vectors in your data. +.. [[dimensions]] In the *Dimensions* field, enter the exact dimension of the vectors in your data. + Your embedding model determines this value, and Capella automatically configures it based on your chosen *Vector Field*. @@ -57,7 +57,7 @@ Your embedding model determines this value, and Capella automatically configures Replicas affect the query throughput, memory footprint, and fault tolerance for your Composite Vector index. More replicas increase the required memory for your index, but can increase query throughput. -.. (Optional) In the *Training List* field, enter or select the number of vectors to consider when searching for centroids in your data. +.. [[training-list]](Optional) In the *Training List* field, enter or select the number of vectors to consider when searching for centroids in your data. + [TIP] ==== @@ -70,7 +70,7 @@ Decreasing the value can improve build times, but reduces recall. ==== -.. (Optional) In the *Probes to scan* field, enter or select the number of centroids to check for similar vectors for each query. +.. [[probes]](Optional) In the *Probes to scan* field, enter or select the number of centroids to check for similar vectors for each query. + The default value is *1*. A higher value increases search times, but also increases accuracy. diff --git a/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc b/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc index f7f62cae0..0e29beee2 100644 --- a/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc +++ b/modules/vector-index/partials/create-hyperscale-index-capella-ui.adoc @@ -48,7 +48,7 @@ For more information about vector similarity measures, see xref:vector-index:vec For more information about quantization, see xref:vector-index:vectors-and-indexes-overview.adoc#quantization[Quantization]. For more information about how to choose quantization on your index, see xref:vector-index:vectors-and-indexes-overview.adoc#choosing-a-quantization-method[Choosing a Quantization Method] and xref:vector-index:vector-index-best-practices.adoc#quantization[Tuning Index Creation - Quantization]. -.. In the *Dimensions* field, enter the exact dimension of the vectors in your data. +.. [[dimensions]] In the *Dimensions* field, enter the exact dimension of the vectors in your data. + Your embedding model determines this value, and Capella automatically configures it based on your chosen *Vector Field*. @@ -56,7 +56,7 @@ Your embedding model determines this value, and Capella automatically configures + Replicas affect the query throughput, memory footprint, and fault tolerance for your Hyperscale Vector index. More replicas increase the required memory for your index, but can increase query throughput. -.. (Optional) In the *Training List* field, enter or select the number of vectors to consider when searching for centroids in your data. +.. [[training-list]](Optional) In the *Training List* field, enter or select the number of vectors to consider when searching for centroids in your data. + [TIP] ==== @@ -67,7 +67,7 @@ You can change your *Training List* value from these recommended defaults. Increasing the value can improve recall, but increase build times. Decreasing the value can improve build times, but reduces recall. ==== -.. (Optional) In the *Probes to scan* field, enter or select the number of centroids to check for similar vectors for each query. +.. [[probes]](Optional) In the *Probes to scan* field, enter or select the number of centroids to check for similar vectors for each query. + The default value is *1*. A higher value increases search times, but also increases accuracy.