-
Notifications
You must be signed in to change notification settings - Fork 181
Add semantic_text index_options examples for BBQ quantization #3854
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
bb1544f
754604e
dd7b107
9c9edf5
7bb6a2f
8bb10f3
1a1a562
3174a6a
ba95752
c1e272a
affde45
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -12,4 +12,7 @@ AGENTS.md | |
| .github/instructions/**.instructions.md | ||
| CLAUDE.md | ||
| GEMINI.md | ||
| .cursor | ||
| .cursor | ||
| .claude | ||
| .claude-flow | ||
| .hive-mind | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I don't even know what |
||
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -29,6 +29,10 @@ The mapping of the destination index - the index that contains the embeddings th | |||||||||
|
|
||||||||||
| You can run {{infer}} either using the [Elastic {{infer-cap}} Service](/explore-analyze/elastic-inference/eis.md) or on your own ML-nodes. The following examples show you both scenarios. | ||||||||||
|
|
||||||||||
| ::::{tip} | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not sure if we need this tip as we already have the Optimizing vector storage with index_options subsection which is prominent. We also need to be sparing in the use of admonitions because you really can't use more than a few in a single doc. They can make a page hard to maintain over time because of that budget. Often a large TIP can simply become a new subheading. |
||||||||||
| For production deployments with dense vector embeddings, consider optimizing storage and performance using [`index_options`](#semantic-text-index-options). This allows you to configure quantization strategies like BBQ (Better Binary Quantization) that can reduce memory usage by up to 32x. Note that with newer indices, `semantic_text` will default to BBQ HNSW automatically. | ||||||||||
| :::: | ||||||||||
|
|
||||||||||
| :::::::{tab-set} | ||||||||||
|
|
||||||||||
| ::::::{tab-item} Using EIS on Serverless | ||||||||||
|
|
@@ -107,10 +111,151 @@ PUT semantic-embeddings | |||||||||
|
|
||||||||||
| ::::::: | ||||||||||
|
|
||||||||||
| To try the ELSER model on the Elastic Inference Service, explicitly set the `inference_id` to `.elser-2-elastic`. For instructions, refer to [Using `semantic_text` with ELSER on EIS](https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/semantic-text#using-elser-on-eis). | ||||||||||
| To try the ELSER model on the Elastic Inference Service, explicitly set the `inference_id` to `.elser-2-elastic`. For instructions, refer to [Using `semantic_text` with ELSER on EIS](https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/semantic-text#using-elser-on-eis). | ||||||||||
|
|
||||||||||
| ### Optimizing vector storage with `index_options` [semantic-text-index-options] | ||||||||||
|
|
||||||||||
| When using `semantic_text` with dense vector embeddings (such as E5 or other text embedding models), you can optimize storage and search performance by configuring `index_options` on the underlying `dense_vector` field. This is particularly useful for large-scale deployments. | ||||||||||
|
|
||||||||||
| The `index_options` parameter controls how vectors are indexed and stored. For dense vector embeddings, you can specify [quantization strategies](https://www.elastic.co/blog/vector-search-elasticsearch-rationale) like Better Binary Quantization (BBQ) that significantly reduce memory footprint while maintaining search quality. Quantization compresses high-dimensional vectors into more efficient representations, enabling faster searches and lower memory consumption. For details on available options and their trade-offs, refer to the [`dense_vector` `index_options` documentation](elasticsearch://reference/elasticsearch/mapping-reference/dense-vector.md#dense-vector-index-options). | ||||||||||
|
|
||||||||||
| ::::{tip} | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's refactor this by removing the TIP block and just using a subheading |
||||||||||
| For most production use cases using `semantic_text` with dense vector embeddings from text models (like E5, OpenAI, or Cohere), BBQ is recommended as it provides up to 32x memory reduction with minimal accuracy loss. BBQ requires a minimum of 64 dimensions and works best with text embeddings (it may not perform well with other types like image embeddings). Choose from: | ||||||||||
| - `bbq_hnsw` - Best for most use cases (default for 384+ dimensions) | ||||||||||
| - `bbq_flat` - Simpler option for smaller datasets | ||||||||||
| - `bbq_disk` - Disk-based storage for very large datasets with minimal memory requirements (Elasticsearch 9.2+) | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
| :::: | ||||||||||
|
|
||||||||||
| Here's an example using `semantic_text` with a text embedding inference endpoint and BBQ quantization: | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's add a heading to each example, this improves the scannability of the page, making it easier to digest and navigate. Keep the headings short as possible and start the sentence with a verb |
||||||||||
|
|
||||||||||
| ```console | ||||||||||
| PUT semantic-embeddings-optimized | ||||||||||
| { | ||||||||||
| "mappings": { | ||||||||||
| "properties": { | ||||||||||
| "content": { | ||||||||||
| "type": "semantic_text", | ||||||||||
| "inference_id": ".multilingual-e5-small-elasticsearch", <1> | ||||||||||
| "index_options": { | ||||||||||
| "dense_vector": { | ||||||||||
| "type": "bbq_hnsw" <2> | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| 1. Reference to a text embedding inference endpoint. This example uses the built-in E5 endpoint that is automatically available. For custom models, you must create the endpoint first using the [Create {{infer}} API](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-inference-put). | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
| 2. Use Better Binary Quantization with HNSW indexing for optimal memory efficiency. This setting applies to the underlying `dense_vector` field that stores the embeddings. | ||||||||||
|
|
||||||||||
| You can also use `bbq_flat` for smaller datasets where you need maximum accuracy at the expense of speed: | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's add a subheading here describing the example |
||||||||||
|
|
||||||||||
| ```console | ||||||||||
| PUT semantic-embeddings-flat | ||||||||||
| { | ||||||||||
| "mappings": { | ||||||||||
| "properties": { | ||||||||||
| "content": { | ||||||||||
| "type": "semantic_text", | ||||||||||
| "inference_id": ".multilingual-e5-small-elasticsearch", | ||||||||||
| "index_options": { | ||||||||||
| "dense_vector": { | ||||||||||
| "type": "bbq_flat" <1> | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| 1. Use BBQ without HNSW for smaller datasets. This uses brute-force search and requires less compute resources during indexing but more during querying. | ||||||||||
|
|
||||||||||
| For very large datasets where RAM is constrained, use `bbq_disk` (DiskBBQ) to minimize memory usage: | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's add a subheading here describing the example
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The placement of the
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you add the subheadings as Liam suggests below, you can disregard this suggestion, since you can add the section-level applies to tag starting in line 197 to the new section title. |
||||||||||
|
|
||||||||||
| ```console | ||||||||||
| PUT semantic-embeddings-disk | ||||||||||
| { | ||||||||||
| "mappings": { | ||||||||||
| "properties": { | ||||||||||
| "content": { | ||||||||||
| "type": "semantic_text", | ||||||||||
| "inference_id": ".multilingual-e5-small-elasticsearch", | ||||||||||
| "index_options": { | ||||||||||
| "dense_vector": { | ||||||||||
| "type": "bbq_disk" <1> | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| ```{applies_to} | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is a section-level applies_to which should be used immediately after a heading Where it's situated right now makes it hard to tell what example it's referring to It should be placed under the new heading for the example it's tagging |
||||||||||
| stack: ga 9.2 | ||||||||||
| serverless: unavailable | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
|
Comment on lines
+197
to
+201
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you accepted my previous suggestion, then this should be deleted.
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If you add the subheadings as Liam suggests below, you can disregard this suggestion, since you can add this tag to the new section title. |
||||||||||
| 1. Use DiskBBQ when RAM is limited. Available in Elasticsearch 9.2+, this option keeps vectors in compressed form on disk and only loads/decompresses small portions on-demand during queries. Unlike standard HNSW indexes (which rely on filesystem cache to load vectors into memory for fast search), DiskBBQ dramatically reduces RAM requirements by avoiding the need to cache vectors in memory. This enables vector search on much larger datasets with minimal memory, though queries will be slower compared to in-memory approaches. | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
|
|
||||||||||
| Other quantization options include `int8_hnsw` (8-bit integer quantization) and `int4_hnsw` (4-bit integer quantization): | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's add a subheading here describing the example |
||||||||||
|
|
||||||||||
| ```console | ||||||||||
| PUT semantic-embeddings-int8 | ||||||||||
| { | ||||||||||
| "mappings": { | ||||||||||
| "properties": { | ||||||||||
| "content": { | ||||||||||
| "type": "semantic_text", | ||||||||||
| "inference_id": ".multilingual-e5-small-elasticsearch", | ||||||||||
| "index_options": { | ||||||||||
| "dense_vector": { | ||||||||||
| "type": "int8_hnsw" <1> | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| 1. Use 8-bit integer quantization for 4x memory reduction with high accuracy retention. For 4-bit quantization, use `"type": "int4_hnsw"` instead, which provides up to 8x memory reduction. For the full list of other available quantization options (including `int4_flat` and others), refer to the [`dense_vector` `index_options` documentation](elasticsearch://reference/elasticsearch/mapping-reference/dense-vector.md#dense-vector-index-options). | ||||||||||
|
|
||||||||||
| For HNSW-specific tuning parameters like `m` and `ef_construction`, you can include them in the `index_options`: | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Let's add a subheading here describing the example |
||||||||||
|
|
||||||||||
| ```console | ||||||||||
| PUT semantic-embeddings-custom | ||||||||||
| { | ||||||||||
| "mappings": { | ||||||||||
| "properties": { | ||||||||||
| "content": { | ||||||||||
| "type": "semantic_text", | ||||||||||
| "inference_id": ".multilingual-e5-small-elasticsearch", | ||||||||||
| "index_options": { | ||||||||||
| "dense_vector": { | ||||||||||
| "type": "bbq_hnsw", | ||||||||||
| "m": 32, <1> | ||||||||||
| "ef_construction": 200 <2> | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| } | ||||||||||
| ``` | ||||||||||
|
|
||||||||||
| 1. The number of neighbors each node will be connected to in the HNSW graph. Higher values improve recall but increase memory usage. Default is 16. | ||||||||||
| 2. Number of candidates considered during graph construction. Higher values improve index quality but slow down indexing. Default is 100. | ||||||||||
|
|
||||||||||
| ::::{note} | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This page now has two {note}s on top of each other which isn't ideal, and again we should use admonitions sparingly. Also this message probably belongs at the top of this section. Consider moving it and seeing if it can be plain prose in the introduction, to avoid stacking admonitions. |
||||||||||
| The `index_options` parameter is only applicable when using inference endpoints that produce dense vector embeddings (like E5, OpenAI embeddings, Cohere embeddings, etc.). It does not apply to sparse vector models like ELSER, which use a different internal representation. | ||||||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||
| :::: | ||||||||||
|
|
||||||||||
| ::::{note} | ||||||||||
| If you’re using web crawlers or connectors to generate indices, you have to [update the index mappings](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-put-mapping) for these indices to include the `semantic_text` field. Once the mapping is updated, you’ll need to run a full web crawl or a full connector sync. This ensures that all existing documents are reprocessed and updated with the new semantic embeddings, enabling semantic search on the updated data. | ||||||||||
| If you're using web crawlers or connectors to generate indices, you have to [update the index mappings](https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-put-mapping) for these indices to include the `semantic_text` field. Once the mapping is updated, you'll need to run a full web crawl or a full connector sync. This ensures that all existing documents are reprocessed and updated with the new semantic embeddings, enabling semantic search on the updated data. | ||||||||||
|
|
||||||||||
| :::: | ||||||||||
|
|
||||||||||
|
|
||||||||||
| Original file line number | Diff line number | Diff line change | ||||
|---|---|---|---|---|---|---|
|
|
@@ -134,7 +134,11 @@ Support for approximate kNN search was added in version 8.0. Before 8.0, `dense_ | |||||
|
|
||||||
| For approximate kNN, {{es}} stores dense vector values per segment as an [HNSW graph](https://arxiv.org/abs/1603.09320). Building HNSW graphs is compute-intensive, so indexing vectors can take time; you may need to increase client request timeouts for index and bulk operations. The [approximate kNN tuning guide](/deploy-manage/production-guidance/optimize-performance/approximate-knn-search.md) covers indexing performance, sizing, and configuration trade-offs that affect search performance. | ||||||
|
|
||||||
| In addition to search-time parameters, HNSW exposes index-time settings that balance graph build cost, search speed, and accuracy. When defining your `dense_vector` mapping, use [`index_options`](elasticsearch://reference/elasticsearch/mapping-reference/dense-vector.md#dense-vector-index-options) to set these parameters: | ||||||
| In addition to search-time parameters, HNSW exposes index-time settings that balance graph build cost, search speed, and accuracy. When defining your `dense_vector` mapping, use [`index_options`](elasticsearch://reference/elasticsearch/mapping-reference/dense-vector.md#dense-vector-index-options) to set these parameters. | ||||||
|
|
||||||
| ::::{tip} | ||||||
| When using the [`semantic_text` field type](../semantic-search/semantic-search-semantic-text.md) with dense vector embeddings, you can also configure `index_options` directly on the field. See [Optimizing vector storage with `index_options`](../semantic-search/semantic-search-semantic-text.md#semantic-text-index-options) for examples. | ||||||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
| :::: | ||||||
|
|
||||||
| ```console | ||||||
| PUT image-index | ||||||
|
|
||||||
Uh oh!
There was an error while loading. Please reload this page.