From 8e3451358bfad4166528bc34cd5ba17d45010dad Mon Sep 17 00:00:00 2001 From: closingin <2735603+closingin@users.noreply.github.com> Date: Mon, 2 Aug 2021 11:49:32 +0200 Subject: [PATCH 01/37] feat: add a link to the developer guide Signed-off-by: closingin <2735603+closingin@users.noreply.github.com> --- _external_links/developer-guide.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 _external_links/developer-guide.md diff --git a/_external_links/developer-guide.md b/_external_links/developer-guide.md new file mode 100644 index 00000000..17fb165c --- /dev/null +++ b/_external_links/developer-guide.md @@ -0,0 +1,7 @@ +--- +layout: default +title: Developer Guide +nav_order: 2 +permalink: /developer-guide/ +redirect_to: https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/DEVELOPER_GUIDE.md +--- From 17ae32cb9a3d859ed54c1943f717edcb2f58b1b8 Mon Sep 17 00:00:00 2001 From: Keith Chan <12404772+keithhc2@users.noreply.github.com> Date: Thu, 19 Aug 2021 13:51:01 -0700 Subject: [PATCH 02/37] Fixed variable name --- _clients/java-rest-high-level.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_clients/java-rest-high-level.md b/_clients/java-rest-high-level.md index 1dcf1563..a9ed5945 100644 --- a/_clients/java-rest-high-level.md +++ b/_clients/java-rest-high-level.md @@ -79,7 +79,7 @@ public class RESTClientSample { RestHighLevelClient client = new RestHighLevelClient(builder); //Create a non-default index with custom settings and mappings. - CreateIndexRequest createIndexRequest = new CreateIndexRequest("test-index"); + CreateIndexRequest createIndexRequest = new CreateIndexRequest("custom-index"); createIndexRequest.settings(Settings.builder() //Specify in the settings how many shards you want in the index. .put("index.number_of_shards", 4) From f3a9bad35c582625d1ffdee3d717b63fbd86ed84 Mon Sep 17 00:00:00 2001 From: ict-one-nl Date: Wed, 25 Aug 2021 13:54:54 +0200 Subject: [PATCH 03/37] Use same attribute name as cluster page Simple fix, but because https://opensearch.org/docs/opensearch/cluster/ uses the node.attr.temp setting and this page uses the box_type setting a less experienced user like me easily makes a mistake (not comprehending the exact workings). Using the temp attribute here as well would have saved me a couple of hours and some grey hairs. --- _im-plugin/ism/policies.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_im-plugin/ism/policies.md b/_im-plugin/ism/policies.md index e6bfa983..fe723d9a 100644 --- a/_im-plugin/ism/policies.md +++ b/_im-plugin/ism/policies.md @@ -347,7 +347,7 @@ Parameter | Description | Type | Required | Default ### allocation -Allocate the index to a node with a specific attribute. +Allocate the index to a node with a specific attribute set like this {{site.url}}{{site.baseurl}}/opensearch/cluster/#advanced-step-7-set-up-a-hot-warm-architecture For example, setting `require` to `warm` moves your data only to "warm" nodes. The `allocation` operation has the following parameters: @@ -363,7 +363,7 @@ Parameter | Description | Type | Required "actions": [ { "allocation": { - "require": { "box_type": "warm" } + "require": { "temp": "warm" } } } ] From df42f777f9eac79b819f0469b756199a4c4a78dd Mon Sep 17 00:00:00 2001 From: ashwinkumar12345 Date: Wed, 25 Aug 2021 11:21:56 -0700 Subject: [PATCH 04/37] changed window size to shingle size --- _monitoring-plugins/ad/index.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/_monitoring-plugins/ad/index.md b/_monitoring-plugins/ad/index.md index 1874a37c..be661b80 100644 --- a/_monitoring-plugins/ad/index.md +++ b/_monitoring-plugins/ad/index.md @@ -79,13 +79,11 @@ This formula provides a good starting point, but make sure to test with a repres For example, for a cluster with 3 data nodes, each with 8G of JVM heap size, a maximum memory percentage of 10% (default), and the entity size of the detector as 1MB: the total number of unique entities supported is (8.096 * 10^9 * 0.1 / 1M ) * 3 = 2429. -#### Set a window size +#### Set a shingle size -Set the number of aggregation intervals from your data stream to consider in a detection window. It's best to choose this value based on your actual data to see which one leads to the best results for your use case. +Set the number of aggregation intervals from your data stream to consider in a detection window. It’s best to choose this value based on your actual data to see which one leads to the best results for your use case. -Based on experiments performed on a wide variety of one-dimensional data streams, we recommend using a window size between 1 and 16. The default window size is 8. If you set the category field for high cardinality, the default window size is 1. - -If you expect missing values in your data or if you want to base the anomalies on the current interval, choose 1. If your data is continuously ingested and you want to base the anomalies on multiple intervals, choose a larger window size. +The anomaly detector expects the shingle size to be in the range of 1 and 60. The default shingle size is 8. We recommend that you don't choose 1 unless you have two or more features. Smaller values might increase [recall](https://en.wikipedia.org/wiki/Precision_and_recall) but also false positives. #### Preview sample anomalies From 0376c4b6d9e73a523ab1e8e054fe3fcbd23b0c7d Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 25 Aug 2021 14:55:03 -0700 Subject: [PATCH 05/37] Fix link. --- _im-plugin/ism/policies.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_im-plugin/ism/policies.md b/_im-plugin/ism/policies.md index fe723d9a..ec4bf737 100644 --- a/_im-plugin/ism/policies.md +++ b/_im-plugin/ism/policies.md @@ -347,7 +347,7 @@ Parameter | Description | Type | Required | Default ### allocation -Allocate the index to a node with a specific attribute set like this {{site.url}}{{site.baseurl}}/opensearch/cluster/#advanced-step-7-set-up-a-hot-warm-architecture +Allocate the index to a node with a specific attribute set [like this]({{site.url}}{{site.baseurl}}/opensearch/cluster/#advanced-step-7-set-up-a-hot-warm-architecture). For example, setting `require` to `warm` moves your data only to "warm" nodes. The `allocation` operation has the following parameters: From bdffb128d851007866e1d525c7a5fb82b7830bef Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 25 Aug 2021 15:17:51 -0700 Subject: [PATCH 06/37] Some redirects for OpenSearch Dashboards 1.0.0 --- _dashboards/index.md | 3 +++ _dashboards/maptiles.md | 4 ++++ _opensearch/index.md | 3 +++ 3 files changed, 10 insertions(+) diff --git a/_dashboards/index.md b/_dashboards/index.md index d4ac0e23..df5a9516 100644 --- a/_dashboards/index.md +++ b/_dashboards/index.md @@ -5,9 +5,12 @@ nav_order: 1 has_children: false has_toc: false redirect_from: + - /docs/opensearch-dashboards/ - /dashboards/ --- +{%- comment -%}The `/docs/opensearch-dashboards/` redirect is specifically to support the UI links in OpenSearch Dashboards 1.0.0.{%- endcomment -%} + # OpenSearch Dashboards OpenSearch Dashboards is the default visualization tool for data in OpenSearch. It also serves as a user interface for many of the OpenSearch plugins, including security, alerting, Index State Management, SQL, and more. diff --git a/_dashboards/maptiles.md b/_dashboards/maptiles.md index 1bbf27f6..f7a43046 100644 --- a/_dashboards/maptiles.md +++ b/_dashboards/maptiles.md @@ -2,8 +2,12 @@ layout: default title: WMS map server nav_order: 5 +redirect_from: + - /docs/opensearch-dashboards/maptiles/ --- +{%- comment -%}The `/docs/opensearch-dashboards/maptiles/` redirect is specifically to support the UI links in OpenSearch Dashboards 1.0.0.{%- endcomment -%} + # Configure WMS map server OpenSearch Dashboards includes default map tiles, but if you need more specialized maps, you can configure OpenSearch Dashboards to use a WMS map server: diff --git a/_opensearch/index.md b/_opensearch/index.md index dbafecf0..505faeec 100644 --- a/_opensearch/index.md +++ b/_opensearch/index.md @@ -5,9 +5,12 @@ nav_order: 1 has_children: false has_toc: false redirect_from: + - /docs/opensearch/ - /opensearch/ --- +{%- comment -%}The `/docs/opensearch/` redirect is specifically to support the UI links in OpenSearch Dashboards 1.0.0.{%- endcomment -%} + # Introduction to OpenSearch OpenSearch is a distributed search and analytics engine based on [Apache Lucene](https://lucene.apache.org/). After adding your data to OpenSearch, you can perform full-text searches on it with all of the features you might expect: search by field, search multiple indices, boost fields, rank results by score, sort results by field, and aggregate results. From 78621f98e3970c7505ab3890144173e293b7e41c Mon Sep 17 00:00:00 2001 From: ashwinkumar12345 Date: Wed, 25 Aug 2021 16:34:46 -0700 Subject: [PATCH 07/37] minor change --- _monitoring-plugins/ad/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_monitoring-plugins/ad/index.md b/_monitoring-plugins/ad/index.md index be661b80..5cb67b7a 100644 --- a/_monitoring-plugins/ad/index.md +++ b/_monitoring-plugins/ad/index.md @@ -83,7 +83,7 @@ For example, for a cluster with 3 data nodes, each with 8G of JVM heap size, a m Set the number of aggregation intervals from your data stream to consider in a detection window. It’s best to choose this value based on your actual data to see which one leads to the best results for your use case. -The anomaly detector expects the shingle size to be in the range of 1 and 60. The default shingle size is 8. We recommend that you don't choose 1 unless you have two or more features. Smaller values might increase [recall](https://en.wikipedia.org/wiki/Precision_and_recall) but also false positives. +The anomaly detector expects the shingle size to be in the range of 1 and 60. The default shingle size is 8. We recommend that you don't choose 1 unless you have two or more features. Smaller values might increase [recall](https://en.wikipedia.org/wiki/Precision_and_recall) but also false positives. Larger values might be useful for ignoring noise in a signal. #### Preview sample anomalies From 36853b648465dd96ae24ac0b9d84c3c2b862da5f Mon Sep 17 00:00:00 2001 From: aetter Date: Fri, 27 Aug 2021 12:46:55 -0700 Subject: [PATCH 08/37] Update external link to Dashboards developer guide --- _external_links/developer-guide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_external_links/developer-guide.md b/_external_links/developer-guide.md index 17fb165c..5f07b6ae 100644 --- a/_external_links/developer-guide.md +++ b/_external_links/developer-guide.md @@ -1,7 +1,7 @@ --- layout: default -title: Developer Guide +title: Dashboards developer guide nav_order: 2 -permalink: /developer-guide/ +permalink: /dashboards-developer-guide/ redirect_to: https://github.com/opensearch-project/OpenSearch-Dashboards/blob/main/DEVELOPER_GUIDE.md --- From 17f91f09a398aae31174147b14efbd828e0ec839 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:29:19 -0700 Subject: [PATCH 09/37] Language tweaks everywhere --- .../rest-api/document-apis/delete-by-query.md | 20 ++++++------- .../rest-api/document-apis/delete-document.md | 4 +-- .../rest-api/document-apis/get-documents.md | 4 +-- .../rest-api/document-apis/index-document.md | 10 +++---- .../rest-api/document-apis/multi-get.md | 14 ++++----- .../rest-api/document-apis/update-by-query.md | 30 +++++++++---------- .../rest-api/document-apis/update-document.md | 14 ++++----- 7 files changed, 46 insertions(+), 50 deletions(-) diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index b9c17308..de717005 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -37,7 +37,8 @@ All URL parameters are optional. Parameter | Type | Description :--- | :--- | :--- | :--- -<index> | String | Name of the data streams, indices, or aliases to delete from. Supports wildcards. If left blank, OpenSearch searches all indices. +<index> | String | Name or list of the data streams, indices, or aliases to delete from. Supports wildcards. If left blank, OpenSearch searches all indices. +allow_no_indices - Whether to ignore wildcards that don’t match any indices. Default is `true`. allow_no_indices | Boolean | False indicates to OpenSearch the request should return an error if any wildcard expression or index alias targets only missing or closed indices. Default is true. analyzer | String | The analyzer to use in the query string. analyze_wildcard | Boolean | Specifies whether to analyze wildcard and prefix queries. Default is false. @@ -47,19 +48,18 @@ df | String | The default field in case a field prefix is not provided in the qu expand_wildcards | String | Specifies the type of index that wildcard expressions can match. Supports comma-separated values. Valid values are `all` (match any index), `open` (match open, non-hidden indices), `closed` (match closed, non-hidden indices), `hidden` (match hidden indices), and `none` (deny wildcard expressions). Default is `open`. from | Integer | The starting index to search from. Default is 0. ignore_unavailable | Boolean | Specifies whether to include missing or closed indices in the response. Default is false. -lenient | Boolean | Specifies whether OpenSearch should ignore format-based query failures (for example, querying a text field for an integer). Default is false. -max_docs | Integer | Maximum amount of documents the operation should process. Default is all documents. -preference | String | Specifies the shard or node OpenSearch should perform the operation on. -q | String | Query in the Lucene query string syntax. -request_cache | Boolean | Specifies whether OpenSearch should use the request cache for the request. Default is whether it's enabled in the index's settings. -refresh | Boolean | Specifies whether OpenSearch should refresh all of the shards involved in the delete request once the operation finishes. Default is false. +lenient | Boolean | Specifies whether OpenSearch should accept requests if queries have format errors (for example, querying a text field for an integer). Default is false. +max_docs | Integer | How many documents the delete by query operation should process at most. Default is all documents. +preference | String | Specifies which shard or node OpenSearch should perform the delete by query operation on. +q | String | Lucene query string's query. +request_cache | Boolean | Specifies whether OpenSearch should use the request cache. Default is whether it’s enabled in the index’s settings. +refresh | Boolean | If true, OpenSearch refreshes shards to make the delete by query operation available to search results. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`. requests_per_second | Integer | Specifies the request's throttling in sub-requests per second. Default is -1, which means no throttling. routing | String | Value used to route the operation to a specific shard. scroll | Time | Amount of time the search context should be open. -scroll_size | Integer | Size of the scroll request of the operation. Default is 1000. +scroll_size | Integer | Size of the operation's scroll requests. Default is 1000. search_type | String | Whether OpenSearch should use global term and document frequencies calculating revelance scores. Valid choices are `query_then_fetch` and `dfs_query_then_fetch`. `query_then_fetch` scores documents using local term and document frequencies for the shard. It’s usually faster but less accurate. `dfs_query_then_fetch` scores documents using global term and document frequencies across all shards. It’s usually slower but more accurate. Default is `query_then_fetch`. -search_timeout | Time | Amount of time until timeout for the search request. Default is no timeout. -slices | Integer | Number of sub-tasks OpenSearch should divide this task into. Default is 1, which means OpenSearch should not divide this task. +search_timeout | Time | How long to wait until OpenSearch deems the request timed out. Default is no timeout. sort | String | A comma-separated list of <field> : <direction> pairs to sort by. _source | String | Specifies whether to include the `_source` field in the response. _source_excludes | String | A comma-separated list of source fields to exclude from the response. diff --git a/_opensearch/rest-api/document-apis/delete-document.md b/_opensearch/rest-api/document-apis/delete-document.md index 0d56a3ec..f67cf280 100644 --- a/_opensearch/rest-api/document-apis/delete-document.md +++ b/_opensearch/rest-api/document-apis/delete-document.md @@ -30,9 +30,9 @@ Parameter | Type | Description | Required <_id> | String | The ID of the document to delete. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Only perform the delete operation if the document has the specified primary term. | No -refresh | Enum | If true, OpenSearch refreshes shards to make the operation visible to searching. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is false. | No +refresh | Enum | If true, OpenSearch refreshes shards to make the delete operation available to search results. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`. | No routing | String | Value used to route the operation to a specific shard. | No -timeout | Time | How long to wait for a response from the cluster. | No +timeout | Time | How long to wait for a response from the cluster. Default is `1m`. | No version | Integer | The version of the document to delete, which must match the last updated version of the document. | No version_type | Enum | Retrieves a specifically typed document. Available options are `external` (retrieve the document if the specified version number is greater than the document's current version) and `external_gte` (retrieve the document if the specified version number is greater than or equal to the document's current version). For example, to delete version 3 of a document, use `/_doc/1?version=3&version_type=external`. | No wait_for_active_shards | String | The number of active shards that must be available before OpenSearch processes the delete request. Default is 1 (only the primary shard). Set to `all` or a positive integer. Values greater than 1 require replicas. For example, if you specify a value of 3, the index must have two replicas distributed across two additional nodes for the operation to succeed. | No diff --git a/_opensearch/rest-api/document-apis/get-documents.md b/_opensearch/rest-api/document-apis/get-documents.md index 931e89a1..896e1717 100644 --- a/_opensearch/rest-api/document-apis/get-documents.md +++ b/_opensearch/rest-api/document-apis/get-documents.md @@ -35,9 +35,9 @@ Parameter | Type | Description :--- | :--- | :--- preference | String | Specifies a preference of which shard to retrieve results from. Available options are `_local`, which tells the operation to retrieve results from a locally allocated shard replica, and a custom string value assigned to a specific shard replica. By default, OpenSearch executes get document operations on random shards. realtime | Boolean | Specifies whether the operation should run in realtime. If false, the operation waits for the index to refresh to analyze the source to retrieve data, which makes the operation near-realtime. Default is true. -refresh | Boolean | If true, OpenSearch refreshes shards to make the operation visible to searching. Default is false. +refresh | Boolean | If true, OpenSearch refreshes shards to make the get operation available to search results. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`. routing | String | A value used to route the operation to a specific shard. -stored_fields | Boolean | If true, the operation retrieves document fields stored in the index rather than the document's `_source`. Default is false. +stored_fields | Boolean | Whether the get operation should retrieve fields stored in the index. Default is false. _source | String | Whether to include the `_source` field in the response body. Default is true. _source_excludes | String | A comma-separated list of source fields to exclude in the query response. _source_includes | String | A comma-separated list of source fields to include in the query response. diff --git a/_opensearch/rest-api/document-apis/index-document.md b/_opensearch/rest-api/document-apis/index-document.md index 2317e308..d83ba319 100644 --- a/_opensearch/rest-api/document-apis/index-document.md +++ b/_opensearch/rest-api/document-apis/index-document.md @@ -39,11 +39,11 @@ Parameter | Type | Description | Required :--- | :--- | :--- | :--- <index> | String | Name of the index. | Yes <_id> | String | A unique identifier to attach to the document. To automatically generate an ID, use `POST /doc` in your request instead of PUT. | No -if_seq_no | Integer | Only perform the operation if the document has the specified sequence number. | No -if_primary_term | Integer | Only perform the operation if the document has the specified primary term. | No +if_seq_no | Integer | Only perform the index operation if the document has the specified sequence number. | No +if_primary_term | Integer | Only perform the index operation if the document has the specified primary term.| No op_type | Enum | Specifies the type of operation to complete with the document. Valid values are `create` (create the index if it doesn't exist) and `index`. If a document ID is included in the request, then the default is `index`. Otherwise, the default is `create`. | No -pipeline | String | ID used to route the indexing operation to a certain pipeline. | No -routing | String | Value used to assign operations to specific shards. | No +pipeline | String | Route the index operation to a certain pipeline. | No +routing | String | value used to assign the index operation to a specific shard. | No timeout | Time | How long to wait for a response from the cluster. Default is `1m`. | No version | Integer | The document's version number. | No version_type | Enum | Assigns a specific type to the document. Valid options are `external` (retrieve the document if the specified version number is greater than the document's current version) and `external_gte` (retrieve the document if the specified version number is greater than or equal to the document's current version). For example, to index version 3 of a document, use `/_doc/1?version=3&version_type=external`. | No @@ -86,7 +86,7 @@ _index | The name of the index. _type | The document's type. OpenSearch supports only one type, which is `_doc`. _id | The document's ID. _version | The document's version. -_result | The result of the index operation. +result | The result of the index operation. _shards | Detailed information about the cluster's shards. total | The total number of shards. successful | The number of shards OpenSearch succssfully added the document to. diff --git a/_opensearch/rest-api/document-apis/multi-get.md b/_opensearch/rest-api/document-apis/multi-get.md index c294a669..3890e4a5 100644 --- a/_opensearch/rest-api/document-apis/multi-get.md +++ b/_opensearch/rest-api/document-apis/multi-get.md @@ -3,12 +3,12 @@ layout: default title: Multi-get document parent: Document APIs grand_parent: REST API reference -nav_order: 25 +nav_order: 30 --- # Multi-get documents - -Introduced 1.0 {: .label .label-purple } +Introduced 1.0 +{: .label .label-purple } The multi-get operation allows you to execute multiple GET operations in one request, so you can get back all documents that match your criteria. @@ -69,11 +69,11 @@ All multi-get URL parameters are optional. Parameter | Type | Description :--- | :--- | :--- | :--- <index> | String | Name of the index to retrieve documents from. -preference | String | The node or shard that OpenSearch should perform the operation on. Default is random. +preference | String | Specifies the nodes or shards OpenSearch should execute the multi-get operation on. Default is random. realtime | Boolean | Specifies whether the operation should run in realtime. If false, the operation waits for the index to refresh to analyze the source to retrieve data, which makes the operation near-realtime. Default is `true`. -refresh | Boolean | If true, OpenSearch refreshes shards to make the operation visible to searching. Default is `false`. -routing | String | A value used to route the operation to a specific shard. -stored_fields | Boolean | If true, the operation retrieves document fields stored in the index rather than the document's `_source`. Default is `false`. +refresh | Boolean | If true, OpenSearch refreshes shards to make the multi-get operation available to search results. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`. +routing | String | Value used to route the multi-get operation to a specific shard. +stored_fields | Boolean | Specifies whether OpenSearch should retrieve documents fields from the index instead of the document's `_source`. Default is `false`. _source | String | Whether to include the `_source` field in the query response. Default is `true`. _source_excludes | String | A comma-separated list of source fields to exclude in the query response. _source_includes | String | A comma-separated list of source fields to include in the query response. diff --git a/_opensearch/rest-api/document-apis/update-by-query.md b/_opensearch/rest-api/document-apis/update-by-query.md index 6b3dece2..f6d32d9e 100644 --- a/_opensearch/rest-api/document-apis/update-by-query.md +++ b/_opensearch/rest-api/document-apis/update-by-query.md @@ -44,31 +44,31 @@ All URL parameters are optional. Parameter | Type | Description :--- | :--- | :--- | :--- -<target-index> | String | Comma-separated list of indices to update. To update all indices, use * or omit this parameter. -allow_no_indices | String | If false, the request returns an error if wildcard expressions match closed or missing indices. Default is true. +<index> | String | Comma-separated list of indices to update. To update all indices, use * or omit this parameter. +allow_no_indices | String | Whether to ignore wildcards that don’t match any indices. Default is true. analyzer | String | Analyzer to use in the query string. -analyze_wildcard | Boolean | Whether the operation should include wildcard and prefix queries in the analysis. Default is false. -conflicts | String | Specifies whether the operation should continue if the request runs into version conflicts. Valid options are `abort` and `proceed`. Default is `abort`. -default_operator | String | The default operator the string query should use. Valid options are `AND` and `OR`. Default is `OR`. -df | String | The default field when the query string does not have a field prefix. +analyze_wildcard | Boolean | Whether the update operation should include wildcard and prefix queries in the analysis. Default is false. +conflicts | String | Indicates to OpenSearch what should happen if the update by query operation runs into a version conflict. Valid options are `abort` and `proceed`. Default is `abort`. +default_operator | String | Indicates whether the default operator for a string query should be `AND` or `OR`. Default is `OR`. +df | String | The default field if a field prefix is not provided in the query string. expand_wildcards | String | Specifies the type of index that wildcard expressions can match. Supports comma-separated values. Valid values are `all` (match any index), `open` (match open, non-hidden indices), `closed` (match closed, non-hidden indices), `hidden` (match hidden indices), and `none` (deny wildcard expressions). Default is `open`. from | Integer | The starting index to search from. Default is 0. ignore_unavailable | Boolean | Whether to exclude missing or closed indices in the response. Default is false. -lenient | Boolean | Whether OpenSearch should ignore format-based query failures (for example, querying an integer field for a string). Default is false. -max_docs | Integer | Maximum number of documents the request should process. Default is all documents. +lenient | Boolean | Specifies whether OpenSearch should accept requests if queries have format errors (for example, querying a text field for an integer). Default is false. +max_docs | Integer | How many documents the update by query operation should process at most. Default is all documents. pipeline | String | ID of the pipeline to use to process documents. -preference | String | The node or shard OpenSearch should perform the operation on. -q | String | Query in the Lucene query string syntax. -request_cache | Boolean | Whether OpenSearch should use the request cache for the operation. Default is whether it's enabled in the index's settings. -refresh | Boolean | Specifies whether OpenSearch should refresh shards involved in the operation to make the operation visible to searching. +preference | String | Specifies which shard or node OpenSearch should perform the update by query operation on. +q | String | Lucene query string's query. +request_cache | Boolean | Specifies whether OpenSearch should use the request cache. Default is whether it’s enabled in the index’s settings. +refresh | Boolean | If true, OpenSearch refreshes shards to make the update by query operation available to search results. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`. requests_per_second | Integer | Specifies the request's throttling in sub-requests per second. Default is -1, which means no throttling. -routing | String | Value used to route the operation to a specific shard. +routing | String | Value used to route the update by query operation to a specific shard. scroll | Time | How long to keep the search context open. scroll_size | Integer | Size of the operation's scroll request. Default is 1000. search_type | String | Whether OpenSearch should use global term and document frequencies calculating revelance scores. Valid choices are `query_then_fetch` and `dfs_query_then_fetch`. `query_then_fetch` scores documents using local term and document frequencies for the shard. It’s usually faster but less accurate. `dfs_query_then_fetch` scores documents using global term and document frequencies across all shards. It’s usually slower but more accurate. Default is `query_then_fetch`. -search_timeout | Time | Amount of time until timeout for the search request. Default is no timeout. +search_timeout | Time | How long to wait until OpenSearch deems the request timed out. Default is no timeout. slices | Integer | Number of sub-tasks OpenSearch should divide this task into. Default is 1, which means OpenSearch should not divide this task. -sort | String | A comma-separated list of <field> : <direction> pairs to sort by. +sort | List | A comma-separated list of <field> : <direction> pairs to sort by. _source | String | Whether to include the `_source` field in the response. _source_excludes | String | A comma-separated list of source fields to exclude from the response. _source_includes | String | A comma-separated list of source fields to include in the response. diff --git a/_opensearch/rest-api/document-apis/update-document.md b/_opensearch/rest-api/document-apis/update-document.md index 23b06773..d0144f62 100644 --- a/_opensearch/rest-api/document-apis/update-document.md +++ b/_opensearch/rest-api/document-apis/update-document.md @@ -17,7 +17,7 @@ POST /sample-index1/_update/1 { "doc": { "first_name" : "Bruce", - "last_name" : "Wayne" + "last_name" : "Wayne", } } ``` @@ -28,11 +28,7 @@ POST /sample-index1/_update/1 POST /test-index1/_update/1 { "script" : { - "source": "ctx._source.oldValue += params.newValue", - "lang": "painless", - "params" : { - "newValue" : 10 - } + "source": "ctx._source.secret_identity = \"Batman\"", } } ``` @@ -50,12 +46,12 @@ Parameter | Type | Description | Required <index-name> | String | Name of the index. | Yes <_id> | String | The ID of the document to update. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No -if_primary_term | Integer | Only perform the delete operation if the document has the specified primary term. | No +if_primary_term | Integer | Perform the update operation if the document has the specified primary term. | No lang | String | Language of the script. Default is `painless`. | No require_alias | Boolean | Specifies whether the destination must be an index alias. Default is false. | No -refresh | Enum | If true, OpenSearch refreshes shards to make the operation visible to searching. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is false. | No +refresh | Enum | If true, OpenSearch refreshes shards to make the operation visible to searching. Valid options are `true`, `false`, and `wait_for`, which tells OpenSearch to wait for a refresh before executing the operation. Default is `false`. | No retry_on_conflict | Integer | The amount of times OpenSearch should retry the operation if there's a document conflict. Default is 0. | No -routing | String | Value used to route the operation to a specific shard. | No +routing | String | Value to route the update operation to a specific shard. | No _source | List | Whether to include the `_source` field in the response body. Default is true. | No _source_excludes | List | A comma-separated list of source fields to exclude in the query response. | No _source_includes | List | A comma-separated list of source fields to include in the query response. | No From d941cb6ad7d7a66453c0bfe21dbdfba6369ad122 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:32:24 -0700 Subject: [PATCH 10/37] Fixed typos --- .../rest-api/document-apis/delete-by-query.md | 2 +- .../rest-api/document-apis/delete-document.md | 4 +- _opensearch/rest-api/document-apis/reindex.md | 50 +++++++++++++++++++ .../rest-api/document-apis/update-document.md | 8 +-- 4 files changed, 57 insertions(+), 7 deletions(-) create mode 100644 _opensearch/rest-api/document-apis/reindex.md diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index de717005..adc13c79 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -28,7 +28,7 @@ POST sample-index1/_delete_by_query ## Path and HTTP methods ``` -POST /_delete_by_query +POST /_delete_by_query ``` ## URL parameters diff --git a/_opensearch/rest-api/document-apis/delete-document.md b/_opensearch/rest-api/document-apis/delete-document.md index f67cf280..a1723e0d 100644 --- a/_opensearch/rest-api/document-apis/delete-document.md +++ b/_opensearch/rest-api/document-apis/delete-document.md @@ -19,14 +19,14 @@ DELETE /sample-index1/_doc/1 ## Path and HTTP methods ``` -DELETE //_doc/<_id> +DELETE //_doc/<_id> ``` ## URL parameters Parameter | Type | Description | Required :--- | :--- | :--- | :--- -<index-name> | String | The index to delete from. | Yes +<index> | String | The index to delete from. | Yes <_id> | String | The ID of the document to delete. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Only perform the delete operation if the document has the specified primary term. | No diff --git a/_opensearch/rest-api/document-apis/reindex.md b/_opensearch/rest-api/document-apis/reindex.md new file mode 100644 index 00000000..c2d45603 --- /dev/null +++ b/_opensearch/rest-api/document-apis/reindex.md @@ -0,0 +1,50 @@ +--- +layout: default +title: Reindex +parent: Document APIs +grand_parent: REST API reference +nav_order: 60 +--- + +# Reindex +Introduced 1.0 +{: .label .label-purple} + +You can use the `reindex` operation to copy every document or a subset of documents in your index into another index. + +## Example + +```json + +``` + +## Path and HTTP methods + +``` + +``` + +## URL parameters + + +Parameter | Type | Description | Required +:--- | :--- | :--- | :--- + + +## Request body + +Your request body must contain the information you want to index. + +```json + +``` + +## Response +```json + +``` + +## Response body fields + +Field | Description +:--- | :--- diff --git a/_opensearch/rest-api/document-apis/update-document.md b/_opensearch/rest-api/document-apis/update-document.md index d0144f62..68dab500 100644 --- a/_opensearch/rest-api/document-apis/update-document.md +++ b/_opensearch/rest-api/document-apis/update-document.md @@ -17,7 +17,7 @@ POST /sample-index1/_update/1 { "doc": { "first_name" : "Bruce", - "last_name" : "Wayne", + "last_name" : "Wayne" } } ``` @@ -28,7 +28,7 @@ POST /sample-index1/_update/1 POST /test-index1/_update/1 { "script" : { - "source": "ctx._source.secret_identity = \"Batman\"", + "source": "ctx._source.secret_identity = \"Batman\"" } } ``` @@ -36,14 +36,14 @@ POST /test-index1/_update/1 ## Path and HTTP methods ``` -POST //_update/<_id> +POST //_update/<_id> ``` ## URL parameters Parameter | Type | Description | Required :--- | :--- | :--- | :--- -<index-name> | String | Name of the index. | Yes +<index> | String | Name of the index. | Yes <_id> | String | The ID of the document to update. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Perform the update operation if the document has the specified primary term. | No From edd9d2e31384a52817a528620dccc5ea984859e0 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:34:01 -0700 Subject: [PATCH 11/37] Fixed even more typos --- _opensearch/rest-api/document-apis/delete-by-query.md | 2 +- _opensearch/rest-api/document-apis/multi-get.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index adc13c79..47a53f62 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -3,7 +3,7 @@ layout: default title: Delete by query parent: Document APIs grand_parent: REST API reference -nav_order: 25 +nav_order: 30 --- # Delete by query diff --git a/_opensearch/rest-api/document-apis/multi-get.md b/_opensearch/rest-api/document-apis/multi-get.md index 3890e4a5..1e23b124 100644 --- a/_opensearch/rest-api/document-apis/multi-get.md +++ b/_opensearch/rest-api/document-apis/multi-get.md @@ -3,7 +3,7 @@ layout: default title: Multi-get document parent: Document APIs grand_parent: REST API reference -nav_order: 30 +nav_order: 25 --- # Multi-get documents From 5ddabb88bd14dbdfabd984f72e657dd94fe6b24f Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:35:11 -0700 Subject: [PATCH 12/37] Fixed heading and styling --- _opensearch/rest-api/document-apis/get-documents.md | 2 ++ _opensearch/rest-api/document-apis/multi-get.md | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/_opensearch/rest-api/document-apis/get-documents.md b/_opensearch/rest-api/document-apis/get-documents.md index 896e1717..dce4d322 100644 --- a/_opensearch/rest-api/document-apis/get-documents.md +++ b/_opensearch/rest-api/document-apis/get-documents.md @@ -7,6 +7,8 @@ nav_order: 5 --- # Get document +Introduced 1.0 +{: .label .label-purple} After adding a JSON document to your index, you can use the get document API operation to retrieve the document's information and data. diff --git a/_opensearch/rest-api/document-apis/multi-get.md b/_opensearch/rest-api/document-apis/multi-get.md index 1e23b124..886933cb 100644 --- a/_opensearch/rest-api/document-apis/multi-get.md +++ b/_opensearch/rest-api/document-apis/multi-get.md @@ -16,7 +16,6 @@ The multi-get operation allows you to execute multiple GET operations in one req ```json GET _mget - { "docs": [ { From 7faade1bdf2b4d2b1ed1c358e71ab0cfc0d21c0e Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:38:59 -0700 Subject: [PATCH 13/37] Maybe this can resolve conflicts --- _opensearch/rest-api/document-apis/delete-by-query.md | 2 +- _opensearch/rest-api/document-apis/get-documents.md | 2 -- _opensearch/rest-api/document-apis/multi-get.md | 2 -- 3 files changed, 1 insertion(+), 5 deletions(-) diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index 47a53f62..59bb0516 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -3,7 +3,7 @@ layout: default title: Delete by query parent: Document APIs grand_parent: REST API reference -nav_order: 30 +nav_order: 40 --- # Delete by query diff --git a/_opensearch/rest-api/document-apis/get-documents.md b/_opensearch/rest-api/document-apis/get-documents.md index dce4d322..896e1717 100644 --- a/_opensearch/rest-api/document-apis/get-documents.md +++ b/_opensearch/rest-api/document-apis/get-documents.md @@ -7,8 +7,6 @@ nav_order: 5 --- # Get document -Introduced 1.0 -{: .label .label-purple} After adding a JSON document to your index, you can use the get document API operation to retrieve the document's information and data. diff --git a/_opensearch/rest-api/document-apis/multi-get.md b/_opensearch/rest-api/document-apis/multi-get.md index 886933cb..006ade95 100644 --- a/_opensearch/rest-api/document-apis/multi-get.md +++ b/_opensearch/rest-api/document-apis/multi-get.md @@ -7,8 +7,6 @@ nav_order: 25 --- # Multi-get documents -Introduced 1.0 -{: .label .label-purple } The multi-get operation allows you to execute multiple GET operations in one request, so you can get back all documents that match your criteria. From 26d3dfe351b1aface7bf3b9f82d5c18cd50f015d Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:42:00 -0700 Subject: [PATCH 14/37] Maybe this is the label --- _opensearch/rest-api/document-apis/multi-get.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/_opensearch/rest-api/document-apis/multi-get.md b/_opensearch/rest-api/document-apis/multi-get.md index 006ade95..886933cb 100644 --- a/_opensearch/rest-api/document-apis/multi-get.md +++ b/_opensearch/rest-api/document-apis/multi-get.md @@ -7,6 +7,8 @@ nav_order: 25 --- # Multi-get documents +Introduced 1.0 +{: .label .label-purple } The multi-get operation allows you to execute multiple GET operations in one request, so you can get back all documents that match your criteria. From 36694537f6870b24cc4e01a314ad21ada8c26eed Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:42:52 -0700 Subject: [PATCH 15/37] Space? --- _opensearch/rest-api/document-apis/multi-get.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/rest-api/document-apis/multi-get.md b/_opensearch/rest-api/document-apis/multi-get.md index 886933cb..ab2ab1ec 100644 --- a/_opensearch/rest-api/document-apis/multi-get.md +++ b/_opensearch/rest-api/document-apis/multi-get.md @@ -7,7 +7,7 @@ nav_order: 25 --- # Multi-get documents -Introduced 1.0 +Introduced 1.0 {: .label .label-purple } The multi-get operation allows you to execute multiple GET operations in one request, so you can get back all documents that match your criteria. From f464d0104180e44e762381da197c84b7b96bbed7 Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:44:35 -0700 Subject: [PATCH 16/37] Revert "Fixed typos" This reverts commit d941cb6ad7d7a66453c0bfe21dbdfba6369ad122. --- .../rest-api/document-apis/delete-by-query.md | 2 +- .../rest-api/document-apis/delete-document.md | 4 +- _opensearch/rest-api/document-apis/reindex.md | 50 ------------------- .../rest-api/document-apis/update-document.md | 8 +-- 4 files changed, 7 insertions(+), 57 deletions(-) delete mode 100644 _opensearch/rest-api/document-apis/reindex.md diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index 59bb0516..440734ca 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -28,7 +28,7 @@ POST sample-index1/_delete_by_query ## Path and HTTP methods ``` -POST /_delete_by_query +POST /_delete_by_query ``` ## URL parameters diff --git a/_opensearch/rest-api/document-apis/delete-document.md b/_opensearch/rest-api/document-apis/delete-document.md index a1723e0d..f67cf280 100644 --- a/_opensearch/rest-api/document-apis/delete-document.md +++ b/_opensearch/rest-api/document-apis/delete-document.md @@ -19,14 +19,14 @@ DELETE /sample-index1/_doc/1 ## Path and HTTP methods ``` -DELETE //_doc/<_id> +DELETE //_doc/<_id> ``` ## URL parameters Parameter | Type | Description | Required :--- | :--- | :--- | :--- -<index> | String | The index to delete from. | Yes +<index-name> | String | The index to delete from. | Yes <_id> | String | The ID of the document to delete. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Only perform the delete operation if the document has the specified primary term. | No diff --git a/_opensearch/rest-api/document-apis/reindex.md b/_opensearch/rest-api/document-apis/reindex.md deleted file mode 100644 index c2d45603..00000000 --- a/_opensearch/rest-api/document-apis/reindex.md +++ /dev/null @@ -1,50 +0,0 @@ ---- -layout: default -title: Reindex -parent: Document APIs -grand_parent: REST API reference -nav_order: 60 ---- - -# Reindex -Introduced 1.0 -{: .label .label-purple} - -You can use the `reindex` operation to copy every document or a subset of documents in your index into another index. - -## Example - -```json - -``` - -## Path and HTTP methods - -``` - -``` - -## URL parameters - - -Parameter | Type | Description | Required -:--- | :--- | :--- | :--- - - -## Request body - -Your request body must contain the information you want to index. - -```json - -``` - -## Response -```json - -``` - -## Response body fields - -Field | Description -:--- | :--- diff --git a/_opensearch/rest-api/document-apis/update-document.md b/_opensearch/rest-api/document-apis/update-document.md index 68dab500..d0144f62 100644 --- a/_opensearch/rest-api/document-apis/update-document.md +++ b/_opensearch/rest-api/document-apis/update-document.md @@ -17,7 +17,7 @@ POST /sample-index1/_update/1 { "doc": { "first_name" : "Bruce", - "last_name" : "Wayne" + "last_name" : "Wayne", } } ``` @@ -28,7 +28,7 @@ POST /sample-index1/_update/1 POST /test-index1/_update/1 { "script" : { - "source": "ctx._source.secret_identity = \"Batman\"" + "source": "ctx._source.secret_identity = \"Batman\"", } } ``` @@ -36,14 +36,14 @@ POST /test-index1/_update/1 ## Path and HTTP methods ``` -POST //_update/<_id> +POST //_update/<_id> ``` ## URL parameters Parameter | Type | Description | Required :--- | :--- | :--- | :--- -<index> | String | Name of the index. | Yes +<index-name> | String | Name of the index. | Yes <_id> | String | The ID of the document to update. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Perform the update operation if the document has the specified primary term. | No From 449177c07e83a8d0fb3de1fce5a7066d56773b4c Mon Sep 17 00:00:00 2001 From: keithhc2 Date: Mon, 30 Aug 2021 11:47:02 -0700 Subject: [PATCH 17/37] Fixed typos --- _opensearch/rest-api/document-apis/delete-by-query.md | 2 +- _opensearch/rest-api/document-apis/delete-document.md | 4 ++-- _opensearch/rest-api/document-apis/update-document.md | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index 440734ca..59bb0516 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -28,7 +28,7 @@ POST sample-index1/_delete_by_query ## Path and HTTP methods ``` -POST /_delete_by_query +POST /_delete_by_query ``` ## URL parameters diff --git a/_opensearch/rest-api/document-apis/delete-document.md b/_opensearch/rest-api/document-apis/delete-document.md index f67cf280..a1723e0d 100644 --- a/_opensearch/rest-api/document-apis/delete-document.md +++ b/_opensearch/rest-api/document-apis/delete-document.md @@ -19,14 +19,14 @@ DELETE /sample-index1/_doc/1 ## Path and HTTP methods ``` -DELETE //_doc/<_id> +DELETE //_doc/<_id> ``` ## URL parameters Parameter | Type | Description | Required :--- | :--- | :--- | :--- -<index-name> | String | The index to delete from. | Yes +<index> | String | The index to delete from. | Yes <_id> | String | The ID of the document to delete. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Only perform the delete operation if the document has the specified primary term. | No diff --git a/_opensearch/rest-api/document-apis/update-document.md b/_opensearch/rest-api/document-apis/update-document.md index d0144f62..68dab500 100644 --- a/_opensearch/rest-api/document-apis/update-document.md +++ b/_opensearch/rest-api/document-apis/update-document.md @@ -17,7 +17,7 @@ POST /sample-index1/_update/1 { "doc": { "first_name" : "Bruce", - "last_name" : "Wayne", + "last_name" : "Wayne" } } ``` @@ -28,7 +28,7 @@ POST /sample-index1/_update/1 POST /test-index1/_update/1 { "script" : { - "source": "ctx._source.secret_identity = \"Batman\"", + "source": "ctx._source.secret_identity = \"Batman\"" } } ``` @@ -36,14 +36,14 @@ POST /test-index1/_update/1 ## Path and HTTP methods ``` -POST //_update/<_id> +POST //_update/<_id> ``` ## URL parameters Parameter | Type | Description | Required :--- | :--- | :--- | :--- -<index-name> | String | Name of the index. | Yes +<index> | String | Name of the index. | Yes <_id> | String | The ID of the document to update. | Yes if_seq_no | Integer | Only perform the delete operation if the document's version number matches the specified number. | No if_primary_term | Integer | Perform the update operation if the document has the specified primary term. | No From 94503ea959c740f7ced7a518c6664e33ecf15399 Mon Sep 17 00:00:00 2001 From: Keith Chan <12404772+keithhc2@users.noreply.github.com> Date: Mon, 30 Aug 2021 11:54:46 -0700 Subject: [PATCH 18/37] Language tweaks --- _opensearch/rest-api/update-mapping.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_opensearch/rest-api/update-mapping.md b/_opensearch/rest-api/update-mapping.md index 0d0d451c..0108442f 100644 --- a/_opensearch/rest-api/update-mapping.md +++ b/_opensearch/rest-api/update-mapping.md @@ -47,12 +47,12 @@ All update mapping parameters are optional. Parameter | Data Type | Description :--- | :--- | :--- -allow_no_indices | Boolean | If false, the request returns an error if any wildcard expresion or index alias targets any closed or missing indices. Defaults to false. +allow_no_indices | Boolean | Whether to ignore wildcards that don’t match any indices. Default is true. expand_wildcards | String | Expands wildcard expressions to different indices. Combine multiple values with commas. Available values are `all` (match all indices), `open` (match open indices), `closed` (match closed indices), `hidden` (match hidden indices), and `none` (do not accept wildcard expressions), which must be used with `open`, `closed`, or both. Default is `open`. ignore_unavailable | Boolean | If true, OpenSearch does not include missing or closed indices in the response. master_timeout | Time | How long to wait for a connection to the master node. Default is `30s`. timeout | Time | How long to wait for the response to return. Default is `30s`. -write_index_only | Boolean | If true, the specified mappings are applied only to the write index. +write_index_only | Boolean | Whether OpenSearch should apply mapping updates only to the write index. ## Request body From dc48c6ced5d1a35867e1d3a9f7e9304bbde51ff2 Mon Sep 17 00:00:00 2001 From: ashwinkumar12345 Date: Mon, 30 Aug 2021 12:58:30 -0700 Subject: [PATCH 19/37] added count API --- _opensearch/rest-api/count.md | 103 ++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 _opensearch/rest-api/count.md diff --git a/_opensearch/rest-api/count.md b/_opensearch/rest-api/count.md new file mode 100644 index 00000000..7a1a8568 --- /dev/null +++ b/_opensearch/rest-api/count.md @@ -0,0 +1,103 @@ +--- +layout: default +title: Count +parent: REST API reference +nav_order: 150 +--- + +# Count +Introduced 1.0 +{: .label .label-purple } + +The count API gives you quick access to the number of documents that match a query. +You can also the use the count API to see the total number of documents in an index, a data stream, or an entire cluster. + + +## Example + +To see the number of documents that match a query: + +```json +GET opensearch_dashboards_sample_data_logs/_count +{ + "query": { + "term": { + "response": "200" + } + } +} +``` + +You can also use the search API for the same result: + +```json +GET opensearch_dashboards_sample_data_logs/_search +{ + "query": { + "term": { + "response": "200" + } + }, + "size": 0, + "track_total_hits": true +} +``` + +To see the number of documents in an index: + +```json +GET opensearch_dashboards_sample_data_logs/_count +``` + +To check for the number of documents in a [data stream]({{site.url}}{{site.baseurl}}/opensearch/data-streams/), replace the index name with the data stream name. + +To see the number of documents in your cluster: + +```json +GET _count +``` + +Alternatively, you could use the [cat indices]({{site.url}}{{site.baseurl}}/opensearch/rest-api/cat/cat-indices/) and [cat count]({{site.url}}{{site.baseurl}}/opensearch/rest-api/cat/cat-count/) APIs to see the number of documents per index or data stream. +{: .note } + + +## Path and HTTP methods + +``` +GET /_count/ +POST /_count/ +``` + + +## URL parameters + +All count parameters are optional. + +Parameter | Type | Description +:--- | :--- | :--- +`allow_no_indices` | Boolean | If false, the request returns an error if any wildcard expression or index alias targets any closed or missing indices. Default is false. +`analyzer` | String | The analyzer to use in the query string. +`analyze_wildcard` | Boolean | Specifies whether to analyze wildcard and prefix queries. Default is false. +`default_operator` | String | Indicates whether the default operator for a string query should be AND or OR. Default is OR. +`df` | String | The default field in case a field prefix is not provided in the query string. +`expand_wildcards` | String | Specifies the type of index that wildcard expressions can match. Supports comma-separated values. Valid values are `all` (match any index), `open` (match open, non-hidden indices), `closed` (match closed, non-hidden indices), `hidden` (match hidden indices), and `none` (deny wildcard expressions). Default is `open`. +`ignore_unavailable` | Boolean | Specifies whether to include missing or closed indices in the response. Default is false. +`lenient` | Boolean | Specifies whether OpenSearch should accept requests if queries have format errors (for example, querying a text field for an integer). Default is false. +`min_score` | Float | Include only documents with a minimum `_score` value in the result. +`routing` | String | Value used to route the operation to a specific shard. +`preference` | String | Specifies which shard or node OpenSearch should perform the count operation on. +`terminate_after` | Integer | The maximum number of documents OpenSearch should process before terminating the request. + +## Response + +```json +{ + "count" : 14074, + "_shards" : { + "total" : 1, + "successful" : 1, + "skipped" : 0, + "failed" : 0 + } +} +``` From baa5622f9d4a4910b57bcb05dffbe4ce3ac52cef Mon Sep 17 00:00:00 2001 From: ashwinkumar12345 Date: Tue, 31 Aug 2021 10:29:20 -0700 Subject: [PATCH 20/37] minor changes --- _opensearch/rest-api/count.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/rest-api/count.md b/_opensearch/rest-api/count.md index 7a1a8568..b7b6b12d 100644 --- a/_opensearch/rest-api/count.md +++ b/_opensearch/rest-api/count.md @@ -10,7 +10,7 @@ Introduced 1.0 {: .label .label-purple } The count API gives you quick access to the number of documents that match a query. -You can also the use the count API to see the total number of documents in an index, a data stream, or an entire cluster. +You can also use it to check the document count of an index, data stream, or cluster. ## Example From 60b1859f1e39612deb27d17ac90b51967934a516 Mon Sep 17 00:00:00 2001 From: aetter Date: Tue, 31 Aug 2021 10:43:48 -0700 Subject: [PATCH 21/37] Remove "About data streams," "Date math support for index names," and "Simulate multi-component templates" --- _opensearch/data-streams.md | 26 ------------- _opensearch/date_math_support.md | 60 ---------------------------- _opensearch/index-templates.md | 65 ------------------------------- images/data_stream_indexing.png | Bin 49786 -> 0 bytes images/data_stream_searching.png | Bin 45589 -> 0 bytes 5 files changed, 151 deletions(-) delete mode 100644 _opensearch/date_math_support.md delete mode 100644 images/data_stream_indexing.png delete mode 100644 images/data_stream_searching.png diff --git a/_opensearch/data-streams.md b/_opensearch/data-streams.md index 312e5335..07d8b136 100644 --- a/_opensearch/data-streams.md +++ b/_opensearch/data-streams.md @@ -15,32 +15,6 @@ Data streams simplify this bootstrapping process and enforce a setup that best s A data stream is internally composed of multiple backing indices. Search requests are routed to all the backing indices, while indexing requests are routed to the latest write index. You can use [ISM]({{site.url}}{{site.baseurl}}/im-plugin/ism/index/) policies to automatically handle rollovers or deletion of indices in a data stream, based on your use case. -## About data streams - -A data stream consists of one or more hidden auto-generated backing indices. These backing indices are named using the following convention: - -``` -.ds-- -``` - -For example, `.ds-logs-redis-000003`, where generation-id is a six-digit, zero-padded integer that acts as a cumulative count of the data stream’s rollovers, starting at `000001`. - -The most recently created backing index is the data stream’s write index. You can’t add documents directly to any of the backing indices. You can only add them via the data stream handle: - -![data stream indexing diagram]({{site.url}}{{site.baseurl}}/images/data_stream_indexing.png) - -The data stream routes search requests to all of its backing indices. It uses the timestamp field to intelligently route search requests to the right set of indices and shards: - -![data stream indexing diagram]({{site.url}}{{site.baseurl}}/images/data_stream_searching.png) - -The following operations are not supported on the write index because they might hinder the indexing operation: - -- close -- clone -- delete -- shrink -- split - ## Get started with data streams ### Step 1: Create an index template diff --git a/_opensearch/date_math_support.md b/_opensearch/date_math_support.md deleted file mode 100644 index 2d997904..00000000 --- a/_opensearch/date_math_support.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -layout: default -title: Date math support for index names -nav_order: 92 ---- - -# Date math support for index names - -Date math is shorthand arithmetic for finding relative dates. - -If you're indexing time-series data with the dates mapped in the index names, you can use date math in your queries to filter index names and limit the number of searched indices. - -## Date math syntax - -The date math syntax for an index name is as follows: - -``` - -``` - -- `static_name`: The unchanged or static portion of the index name. To use the characters `{` and `}` in the static part of an index name, escape them with a backslash `\`. -- `date_math_expr`: The changing or dynamic portion of the index name that’s computed by the date math expression. For example, `now+1h` adds one hour, `now-1d` subtracts one hour, and `now/d` rounds down to the nearest day, where `now` represents the current timestamp. -- `date_format`: (Optional) Specify the format for the computed date. The default value is `YYYY.MM.dd`. Make sure that you’re using the correct small or capital letters in the date format. For example, `mm` denotes minute of hour, while `MM` denotes month of year. Similarly, `hh` denotes the hour in the `1-12` range in combination with AM/PM, while `HH` denotes the hour in the `0-23` 24-hour range. -- `time_zone`: (Optional) Specify the timezone offset. The default value is UTC. For example, the UTC time offset for PST is `-08:00`. - -## Date math example - -You must enclose date math index names within angle brackets. - -If today is 22nd March, 2024: - -- `` resolves to `logstash-2024.03.22` -- `` resolves to `logstash-2024.03.01` -- `` resolves to `logstash-2024.03` -- `` resolves to `logstash-2024.02` -- `` resolves to `logstash-2024.03.23` - -You need to encode all special characters in URI format: - -Special characters | URI format -:--- | :--- -`<` | %3C -`>` | %3E -`/` | %2F -`{` | %7B -`}` | %7D -`|` | %7C -`+` | %2B -`:` | %3A -`,` | %2C -`\` | %5C - -If you are searching for errors in your daily logs with the default Logstash index name format `logstash-YYYY.MM.dd`, you can use date math to restrict the search to indices of the past three days: - -``` -# GET ,,/_search -GET %3Clogstash-%7Bnow%2Fd-2d%7D%3E%2C%3Clogstash-%7Bnow%2Fd-1d%7D%3E%2C%3Clogstash-%7Bnow%2Fd%7D%3E/_search -``` - -This date math expression is evaluated at runtime. diff --git a/_opensearch/index-templates.md b/_opensearch/index-templates.md index 8d49b891..c258c518 100644 --- a/_opensearch/index-templates.md +++ b/_opensearch/index-templates.md @@ -328,71 +328,6 @@ GET logs-2020-01-01 } ``` -### Simulate multi-component templates - -For index templates composed of multiple component templates, you can simulate applying a new template to verify whether the settings are applied as you expect. - -To simulate the settings that would be applied to a specific index name: - -```json -POST _index_template/_simulate_index/ -``` - -To simulate the settings that would be applied from an existing template: - -```json -POST _index_template/_simulate/ -``` - -You can also specify a template definition in the simulate request: - -```json -POST _index_template/_simulate -{ - "index_patterns": [ - "logs-2020-01-*" - ], - "template": { - "settings" : { - "index.number_of_shards" : 3 - } - }, - "composed_of": ["component_template_1", "component_template_2"] -} -``` - -The `_simulate` API returns the final settings, mappings, and aliases that will be applied to indices that match the index pattern. You can also see any overlapping templates whose configuration is superseded by the simulated template body or higher priority templates: - -```json -{ - "template" : { - "settings" : { - "index" : { - "number_of_shards" : "3" - } - }, - "mappings" : { - "properties" : { - "@timestamp" : { - "type" : "date" - }, - "ip_address" : { - "type" : "ip" - } - } - }, - "aliases" : { } - }, - "overlapping" : [ - { - "name" : "daily_logs", - "index_patterns" : [ - "logs-2020-01-*" - ] - } - ] -} -``` ## Index template options diff --git a/images/data_stream_indexing.png b/images/data_stream_indexing.png deleted file mode 100644 index 7bd21ac0738c76ce580c5c95ae65becd8ceddbd5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49786 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 C9TR;3 From ffe3f7799378d61aece932d24982231dcf0ddf38 Mon Sep 17 00:00:00 2001 From: aetter Date: Tue, 31 Aug 2021 10:50:48 -0700 Subject: [PATCH 22/37] Light edits to data streams --- _opensearch/data-streams.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_opensearch/data-streams.md b/_opensearch/data-streams.md index 07d8b136..ff06d6e1 100644 --- a/_opensearch/data-streams.md +++ b/_opensearch/data-streams.md @@ -8,11 +8,11 @@ nav_order: 13 If you're ingesting continuously generated time-series data such as logs, events, and metrics into OpenSearch, you're likely in a scenario where the number of documents grows rapidly and you don't need to update older documents. -A typical workflow to manage time-series data involves multiple steps such as creating a rollover index alias, defining a write index, and defining common mappings and settings for the backing indices. +A typical workflow to manage time-series data involves multiple steps, such as creating a rollover index alias, defining a write index, and defining common mappings and settings for the backing indices. -Data streams simplify this bootstrapping process and enforce a setup that best suits time-series data, such as being designed primarily for append-only data, and ensuring that each document has a timestamp field. +Data streams simplify this process and enforce a setup that best suits time-series data, such as being designed primarily for append-only data and ensuring that each document has a timestamp field. -A data stream is internally composed of multiple backing indices. Search requests are routed to all the backing indices, while indexing requests are routed to the latest write index. You can use [ISM]({{site.url}}{{site.baseurl}}/im-plugin/ism/index/) policies to automatically handle rollovers or deletion of indices in a data stream, based on your use case. +A data stream is internally composed of multiple backing indices. Search requests are routed to all the backing indices, while indexing requests are routed to the latest write index. [ISM]({{site.url}}{{site.baseurl}}/im-plugin/ism/index/) policies let you automatically handle index rollovers or deletions. ## Get started with data streams From cda046f727dd071caded8c0feeffa8359d83b80f Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 1 Sep 2021 11:25:39 -0700 Subject: [PATCH 23/37] Version bumps for 1.0.1 --- README.md | 2 +- _config.yml | 2 +- _dashboards/install/plugins.md | 45 ++++++++++-------------------- _opensearch/install/plugins.md | 50 ++++++++++++---------------------- version-history.md | 1 + 5 files changed, 35 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index 175730e0..093941af 100644 --- a/README.md +++ b/README.md @@ -196,7 +196,7 @@ If you're making major changes to the documentation and need to see the rendered ## New releases 1. Branch. -1. Change the `opensearch_version` and `opensearch_major_version` variables in `_config.yml`. +1. Change the `opensearch_version` and `opensearch_major_minor_version` variables in `_config.yml`. 1. Start up a new cluster using the updated Docker Compose file in `docs/install/docker.md`. 1. Update the version table in `version-history.md`. diff --git a/_config.yml b/_config.yml index 0b56bce3..3c01797d 100644 --- a/_config.yml +++ b/_config.yml @@ -5,7 +5,7 @@ baseurl: "/docs" # the subpath of your site, e.g. /blog url: "https://opensearch.org" # the base hostname & protocol for your site, e.g. http://example.com permalink: /:path/ -opensearch_version: 1.0.0 +opensearch_version: 1.0.1 opensearch_major_minor_version: 1.0 # Build settings diff --git a/_dashboards/install/plugins.md b/_dashboards/install/plugins.md index 805423c9..06b3c4c9 100644 --- a/_dashboards/install/plugins.md +++ b/_dashboards/install/plugins.md @@ -28,6 +28,21 @@ If you don't want to use the all-in-one installation options, you can install th + + 1.0.1 + +

alertingDashboards          1.0.0.0
+anomalyDetectionDashboards  1.0.0.0
+ganttChartDashboards        1.0.0.0
+indexManagementDashboards   1.0.1.0
+notebooksDashboards         1.0.0.0
+queryWorkbenchDashboards    1.0.0.0
+reportsDashboards           1.0.1.0
+securityDashboards          1.0.1.0
+traceAnalyticsDashboards    1.0.0.0
+
+ + 1.0.0 @@ -40,36 +55,6 @@ queryWorkbenchDashboards 1.0.0.0 reportsDashboards 1.0.0.0 securityDashboards 1.0.0.0 traceAnalyticsDashboards 1.0.0.0 - - - - - 1.0.0-rc1 - -
alertingDashboards          1.0.0.0-rc1
-anomalyDetectionDashboards  1.0.0.0-rc1
-ganttChartDashboards        1.0.0.0-rc1
-indexManagementDashboards   1.0.0.0-rc1
-notebooksDashboards         1.0.0.0-rc1
-queryWorkbenchDashboards    1.0.0.0-rc1
-reportsDashboards           1.0.0.0-rc1
-securityDashboards          1.0.0.0-rc1
-traceAnalyticsDashboards    1.0.0.0-rc1
-
- - - - 1.0.0-beta1 - -
alertingDashboards          1.0.0.0-beta1
-anomalyDetectionDashboards  1.0.0.0-beta1
-ganttChartDashboards        1.0.0.0-beta1
-indexManagementDashboards   1.0.0.0-beta1
-notebooksDashboards         1.0.0.0-beta1
-queryWorkbenchDashboards    1.0.0.0-beta1
-reportsDashboards           1.0.0.0-beta1
-securityDashboards          1.0.0.0-beta1
-traceAnalyticsDashboards    1.0.0.0-beta1
 
diff --git a/_opensearch/install/plugins.md b/_opensearch/install/plugins.md index 800ab2f7..40fdefc7 100644 --- a/_opensearch/install/plugins.md +++ b/_opensearch/install/plugins.md @@ -29,6 +29,23 @@ If you don't want to use the all-in-one OpenSearch installation options, you can + + 1.0.1 + +
opensearch-alerting             1.0.0.0
+opensearch-anomaly-detection    1.0.0.0
+opensearch-asynchronous-search  1.0.0.0
+opensearch-index-management     1.0.1.0
+opensearch-job-scheduler        1.0.0.0
+opensearch-knn                  1.0.0.0
+opensearch-notebooks            1.0.0.0
+opensearch-performance-analyzer 1.0.1.0
+opensearch-reports-scheduler    1.0.0.0
+opensearch-security             1.0.1.0
+opensearch-sql                  1.0.0.0
+
+ + 1.0.0 @@ -43,39 +60,6 @@ opensearch-performance-analyzer 1.0.0.0 opensearch-reports-scheduler 1.0.0.0 opensearch-security 1.0.0.0 opensearch-sql 1.0.0.0 - - - - - 1.0.0-rc1 - -
opensearch-alerting             1.0.0.0-rc1
-opensearch-anomaly-detection    1.0.0.0-rc1
-opensearch-asynchronous-search  1.0.0.0-rc1
-opensearch-index-management     1.0.0.0-rc1
-opensearch-job-scheduler        1.0.0.0-rc1
-opensearch-knn                  1.0.0.0-rc1
-opensearch-notebooks            1.0.0.0-rc1
-opensearch-performance-analyzer 1.0.0.0-rc1
-opensearch-reports-scheduler    1.0.0.0-rc1
-opensearch-security             1.0.0.0-rc1
-opensearch-sql                  1.0.0.0-rc1
-
- - - - 1.0.0-beta1 - -
opensearch-alerting             1.0.0.0-beta1
-opensearch-anomaly-detection    1.0.0.0-beta1
-opensearch-asynchronous-search  1.0.0.0-beta1
-opensearch-index-management     1.0.0.0-beta1
-opensearch-job-scheduler        1.0.0.0-beta1
-opensearch-knn                  1.0.0.0-beta1
-opensearch-performance-analyzer 1.0.0.0-beta1
-opensearch-reports-scheduler    1.0.0.0-beta1
-opensearch-security             1.0.0.0-beta1
-opensearch-sql                  1.0.0.0-beta1
 
diff --git a/version-history.md b/version-history.md index 7b4f165b..bb67d8b9 100644 --- a/version-history.md +++ b/version-history.md @@ -9,6 +9,7 @@ permalink: /version-history/ OpenSearch version | Release highlights | Release date :--- | :--- | :--- | :--- +[1.0.1](https://github.com/opensearch-project/opensearch-build/tree/main/release-notes/opensearch-release-notes-1.0.1.md) | Bug fixes. | 1 September 2021 [1.0.0](https://github.com/opensearch-project/opensearch-build/tree/main/release-notes/opensearch-release-notes-1.0.0.md) | General availability release. Adds compatibility setting for clients that require a version check before connecting. | 12 July 2021 [1.0.0-rc1](https://github.com/opensearch-project/opensearch-build/tree/main/release-notes/opensearch-release-notes-1.0.0-rc1.md) | First release candidate. | 7 June 2021 [1.0.0-beta1](https://github.com/opensearch-project/opensearch-build/tree/main/release-notes/opensearch-release-notes-1.0.0-beta1.md) | Initial beta release. Refactors plugins to work with OpenSearch. | 13 May 2021 From ecea83707d2576f07ec0b63a54e406eaafcf1b47 Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 1 Sep 2021 11:37:54 -0700 Subject: [PATCH 24/37] Adds Lucene version variable, minor improvements to REST API and query DSL --- _config.yml | 1 + _opensearch/metric-agg.md | 4 +- _opensearch/query-dsl/full-text.md | 14 +-- _opensearch/query-dsl/term.md | 10 +- _opensearch/rest-api/document-apis/bulk.md | 2 +- .../rest-api/document-apis/delete-by-query.md | 3 +- .../rest-api/document-apis/update-by-query.md | 2 +- _opensearch/rest-api/explain.md | 2 +- _opensearch/rest-api/multi-search.md | 95 ++++++++++++------- _opensearch/rest-api/scroll.md | 2 +- _opensearch/rest-api/update-mapping.md | 2 +- _search-plugins/async/index.md | 8 +- _search-plugins/knn/approximate-knn.md | 2 +- 13 files changed, 92 insertions(+), 55 deletions(-) diff --git a/_config.yml b/_config.yml index 3c01797d..ae992e6d 100644 --- a/_config.yml +++ b/_config.yml @@ -7,6 +7,7 @@ permalink: /:path/ opensearch_version: 1.0.1 opensearch_major_minor_version: 1.0 +lucene_version: 8_8_2 # Build settings markdown: kramdown diff --git a/_opensearch/metric-agg.md b/_opensearch/metric-agg.md index 13f82bc8..9211aacc 100644 --- a/_opensearch/metric-agg.md +++ b/_opensearch/metric-agg.md @@ -88,8 +88,8 @@ GET opensearch_dashboards_sample_data_ecommerce/_search } ``` -The cardinality count is approximate. -If you had tens of thousands of products in your store, an accurate cardinality calculation requires loading all the values into a hash set and returning its size. This approach doesn't scale well because it requires more memory and causes high latency. +Cardinality count is approximate. +If you have tens of thousands of products in your hypothetical store, an accurate cardinality calculation requires loading all the values into a hash set and returning its size. This approach doesn't scale well; it requires huge amounts of memory and can cause high latencies. You can control the trade-off between memory and accuracy with the `precision_threshold` setting. This setting defines the threshold below which counts are expected to be close to accurate. Above this value, counts might become a bit less accurate. The default value of `precision_threshold` is 3,000. The maximum supported value is 40,000. diff --git a/_opensearch/query-dsl/full-text.md b/_opensearch/query-dsl/full-text.md index c751ee3d..f834f31f 100644 --- a/_opensearch/query-dsl/full-text.md +++ b/_opensearch/query-dsl/full-text.md @@ -21,7 +21,7 @@ This page lists all full-text query types and common options. Given the sheer nu ## Match -Creates a [boolean query](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/search/BooleanQuery.html) that returns results if the search term is present in the field. +Creates a [boolean query](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/BooleanQuery.html) that returns results if the search term is present in the field. The most basic form of the query provides only a field (`title`) and a term (`wind`): @@ -126,7 +126,7 @@ GET _search ## Match boolean prefix -Similar to [match](#match), but creates a [prefix query](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/search/PrefixQuery.html) out of the last term in the query string. +Similar to [match](#match), but creates a [prefix query](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/PrefixQuery.html) out of the last term in the query string. ```json GET _search @@ -164,7 +164,7 @@ GET _search ## Match phrase -Creates a [phrase query](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/search/PhraseQuery.html) that matches a sequence of terms. +Creates a [phrase query](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/PhraseQuery.html) that matches a sequence of terms. ```json GET _search @@ -198,7 +198,7 @@ GET _search ## Match phrase prefix -Similar to [match phrase](#match-phrase), but creates a [prefix query](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/search/PrefixQuery.html) out of the last term in the query string. +Similar to [match phrase](#match-phrase), but creates a [prefix query](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/PrefixQuery.html) out of the last term in the query string. ```json GET _search @@ -410,7 +410,7 @@ Option | Valid values | Description `allow_leading_wildcard` | Boolean | Whether `*` and `?` are allowed as the first character of a search term. The default is true. `analyze_wildcard` | Boolean | Whether OpenSearch should attempt to analyze wildcard terms. Some analyzers do a poor job at this task, so the default is false. `analyzer` | `standard, simple, whitespace, stop, keyword, pattern, , fingerprint` | The analyzer you want to use for the query. Different analyzers have different character filters, tokenizers, and token filters. The `stop` analyzer, for example, removes stop words (e.g. "an," "but," "this") from the query string. -`auto_generate_synonyms_phrase_query` | Boolean | A value of true (default) automatically generates [phrase queries](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/search/PhraseQuery.html) for multi-term synonyms. For example, if you have the synonym `"ba, batting average"` and search for "ba," OpenSearch searches for `ba OR "batting average"` (if this option is true) or `ba OR (batting AND average)` (if this option is false). +`auto_generate_synonyms_phrase_query` | Boolean | A value of true (default) automatically generates [phrase queries](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/PhraseQuery.html) for multi-term synonyms. For example, if you have the synonym `"ba, batting average"` and search for "ba," OpenSearch searches for `ba OR "batting average"` (if this option is true) or `ba OR (batting AND average)` (if this option is false). `boost` | Floating-point | Boosts the clause by the given multiplier. Useful for weighing clauses in compound queries. The default is 1.0. `cutoff_frequency` | Between `0.0` and `1.0` or a positive integer | This value lets you define high and low frequency terms based on number of occurrences in the index. Numbers between 0 and 1 are treated as a percentage. For example, 0.10 is 10%. This value means that if a word occurs within the search field in more than 10% of the documents on the shard, OpenSearch considers the word "high frequency" and deemphasizes it when calculating search score.

Because this setting is *per shard*, testing its impact on search results can be challenging unless a cluster has many documents. `enable_position_increments` | Boolean | When true, result queries are aware of position increments. This setting is useful when the removal of stop words leaves an unwanted "gap" between terms. The default is true. @@ -420,7 +420,7 @@ Option | Valid values | Description `fuzzy_transpositions` | Boolean | Setting `fuzzy_transpositions` to true (default) adds swaps of adjacent characters to the insert, delete, and substitute operations of the `fuzziness` option. For example, the distance between `wind` and `wnid` is 1 if `fuzzy_transpositions` is true (swap "n" and "i") and 2 if it is false (delete "n", insert "n").

If `fuzzy_transpositions` is false, `rewind` and `wnid` have the same distance (2) from `wind`, despite the more human-centric opinion that `wnid` is an obvious typo. The default is a good choice for most use cases. `lenient` | Boolean | Setting `lenient` to true lets you ignore data type mismatches between the query and the document field. For example, a query string of "8.2" could match a field of type `float`. The default is false. `low_freq_operator` | `and, or` | The operator for low-frequency terms. The default is `or`. See [Common terms](#common-terms) queries and `operator` in this table. -`max_determinized_states` | Positive integer | The maximum number of "[states](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/util/automaton/Operations.html#DEFAULT_MAX_DETERMINIZED_STATES)" (a measure of complexity) that Lucene can create for query strings that contain regular expressions (e.g. `"query": "/wind.+?/"`). Larger numbers allow for queries that use more memory. The default is 10,000. +`max_determinized_states` | Positive integer | The maximum number of "[states](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/util/automaton/Operations.html#DEFAULT_MAX_DETERMINIZED_STATES)" (a measure of complexity) that Lucene can create for query strings that contain regular expressions (e.g. `"query": "/wind.+?/"`). Larger numbers allow for queries that use more memory. The default is 10,000. `max_expansions` | Positive integer | Fuzzy queries "expand to" a number of matching terms that are within the distance specified in `fuzziness`. Then OpenSearch tries to match those terms against its indices. `max_expansions` specifies the maximum number of terms that the fuzzy query expands to. The default is 50. `minimum_should_match` | Positive or negative integer, positive or negative percentage, combination | If the query string contains multiple search terms and you used the `or` operator, the number of terms that need to match for the document to be considered a match. For example, if `minimum_should_match` is 2, "wind often rising" does not match "The Wind Rises." If `minimum_should_match` is 1, it matches. This option also has `low_freq` and `high_freq` properties for [Common terms](#common-terms) queries. `operator` | `or, and` | If the query string contains multiple search terms, whether all terms need to match (`and`) or only one term needs to match (`or`) for a document to be considered a match. @@ -428,7 +428,7 @@ Option | Valid values | Description `prefix_length` | `0` (default) or a positive integer | The number of leading characters that are not considered in fuzziness. `quote_field_suffix` | String | This option lets you search different fields depending on whether terms are wrapped in quotes. For example, if `quote_field_suffix` is `".exact"` and you search for `"lightly"` (in quotes) in the `title` field, OpenSearch searches the `title.exact` field. This second field might use a different type (e.g. `keyword` rather than `text`) or a different analyzer. The default is null. `rewrite` | `constant_score, scoring_boolean, constant_score_boolean, top_terms_N, top_terms_boost_N, top_terms_blended_freqs_N` | Determines how OpenSearch rewrites and scores multi-term queries. The default is `constant_score`. -`slop` | `0` (default) or a positive integer | Controls the degree to which words in a query can be misordered and still be considered a match. From the [Lucene documentation](https://lucene.apache.org/core/8_4_0/core/org/apache/lucene/search/PhraseQuery.html#getSlop--): "The number of other words permitted between words in query phrase. For example, to switch the order of two words requires two moves (the first move places the words atop one another), so to permit re-orderings of phrases, the slop must be at least two. A value of zero requires an exact match." +`slop` | `0` (default) or a positive integer | Controls the degree to which words in a query can be misordered and still be considered a match. From the [Lucene documentation](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/PhraseQuery.html#getSlop--): "The number of other words permitted between words in query phrase. For example, to switch the order of two words requires two moves (the first move places the words atop one another), so to permit re-orderings of phrases, the slop must be at least two. A value of zero requires an exact match." `tie_breaker` | `0.0` (default) to `1.0` | Changes the way OpenSearch scores searches. For example, a `type` of `best_fields` typically uses the highest score from any one field. If you specify a `tie_breaker` value between 0.0 and 1.0, the score changes to highest score + `tie_breaker` * score for all other matching fields. If you specify a value of 1.0, OpenSearch adds together the scores for all matching fields (effectively defeating the purpose of `best_fields`). `time_zone` | UTC offset | The time zone to use (e.g. `-08:00`) if the query string contains a date range (e.g. `"query": "wind rises release_date[2012-01-01 TO 2014-01-01]"`). The default is `UTC`. `type` | `best_fields, most_fields, cross-fields, phrase, phrase_prefix` | Determines how OpenSearch executes the query and scores the results. The default is `best_fields`. diff --git a/_opensearch/query-dsl/term.md b/_opensearch/query-dsl/term.md index e2bcb8ee..72c71bd5 100644 --- a/_opensearch/query-dsl/term.md +++ b/_opensearch/query-dsl/term.md @@ -430,7 +430,7 @@ Wildcard queries tend to be slow because they need to iterate over a lot of term ## Regex -Use the `regex` query to search for terms that match a regular expression. +Use the `regexp` query to search for terms that match a regular expression. This regular expression matches any single uppercase or lowercase letter: @@ -439,12 +439,14 @@ GET shakespeare/_search { "query": { "regexp": { - "play_name": "H[a-zA-Z]+mlet" + "play_name": "[a-zA-Z]amlet" } } } ``` -Regular expressions are applied to the terms in the field and not the entire value of the field. +A few important notes: -The efficiency of your regular expression depends a lot on the patterns you write. Make sure that you write `regex` queries with either a prefix or suffix to improve performance. +- Regular expressions are applied to the terms in the field (i.e. tokens), not the entire field. +- Regular expressions use the Lucene syntax, which differs from more standardized implementations. Test thoroughly to ensure that you receive the results you expect. To learn more, see [the Lucene documentation](https://lucene.apache.org/core/{{site.lucene_version}}/core/index.html). +- `regexp` queries can be expensive operations and require the `search.allow_expensive_queries` setting to be set to `true`. Before making frequent `regexp` queries, test their impact on cluster performance and examine alternative queries for achieving similar results. diff --git a/_opensearch/rest-api/document-apis/bulk.md b/_opensearch/rest-api/document-apis/bulk.md index 4139471e..c10a3932 100644 --- a/_opensearch/rest-api/document-apis/bulk.md +++ b/_opensearch/rest-api/document-apis/bulk.md @@ -32,7 +32,7 @@ POST _bulk ``` POST _bulk -POST {index}/_bulk +POST /_bulk ``` Specifying the index in the path means you don't need to include it in the [request body]({{site.url}}{{site.baseurl}}/opensearch/rest-api/document-apis/bulk/#request-body). diff --git a/_opensearch/rest-api/document-apis/delete-by-query.md b/_opensearch/rest-api/document-apis/delete-by-query.md index 59bb0516..e858d1d1 100644 --- a/_opensearch/rest-api/document-apis/delete-by-query.md +++ b/_opensearch/rest-api/document-apis/delete-by-query.md @@ -38,8 +38,7 @@ All URL parameters are optional. Parameter | Type | Description :--- | :--- | :--- | :--- <index> | String | Name or list of the data streams, indices, or aliases to delete from. Supports wildcards. If left blank, OpenSearch searches all indices. -allow_no_indices - Whether to ignore wildcards that don’t match any indices. Default is `true`. -allow_no_indices | Boolean | False indicates to OpenSearch the request should return an error if any wildcard expression or index alias targets only missing or closed indices. Default is true. +allow_no_indices | Boolean | Whether to ignore wildcards that don’t match any indices. Default is `true`. analyzer | String | The analyzer to use in the query string. analyze_wildcard | Boolean | Specifies whether to analyze wildcard and prefix queries. Default is false. conflicts | String | Indicates to OpenSearch what should happen if the delete by query operation runs into a version conflict. Valid options are `abort` and `proceed`. Default is `abort`. diff --git a/_opensearch/rest-api/document-apis/update-by-query.md b/_opensearch/rest-api/document-apis/update-by-query.md index f6d32d9e..0e66d1ae 100644 --- a/_opensearch/rest-api/document-apis/update-by-query.md +++ b/_opensearch/rest-api/document-apis/update-by-query.md @@ -45,7 +45,7 @@ All URL parameters are optional. Parameter | Type | Description :--- | :--- | :--- | :--- <index> | String | Comma-separated list of indices to update. To update all indices, use * or omit this parameter. -allow_no_indices | String | Whether to ignore wildcards that don’t match any indices. Default is true. +allow_no_indices | Boolean | Whether to ignore wildcards that don’t match any indices. Default is `true`. analyzer | String | Analyzer to use in the query string. analyze_wildcard | Boolean | Whether the update operation should include wildcard and prefix queries in the analysis. Default is false. conflicts | String | Indicates to OpenSearch what should happen if the update by query operation runs into a version conflict. Valid options are `abort` and `proceed`. Default is `abort`. diff --git a/_opensearch/rest-api/explain.md b/_opensearch/rest-api/explain.md index 1d56dbd7..cbc7c5b0 100644 --- a/_opensearch/rest-api/explain.md +++ b/_opensearch/rest-api/explain.md @@ -11,7 +11,7 @@ Introduced 1.0 Wondering why a specific document ranks higher (or lower) for a query? You can use the explain API for an explanation of how the relevance score (`_score`) is calculated for every result. -OpenSearch uses a probabilistic ranking framework called [Okapi BM25](https://en.wikipedia.org/wiki/Okapi_BM25) to calculate relevance scores. Okapi BM25 is based on the original [TF/IDF](http://lucene.apache.org/core/4_0_0/core/org/apache/lucene/search/package-summary.html#scoring) framework used by Apache Lucene. +OpenSearch uses a probabilistic ranking framework called [Okapi BM25](https://en.wikipedia.org/wiki/Okapi_BM25) to calculate relevance scores. Okapi BM25 is based on the original [TF/IDF](http://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/search/package-summary.html#scoring) framework used by Apache Lucene. The explain API is an expensive operation in terms of both resources and time. On production clusters, we recommend using it sparingly for the purpose of troubleshooting. {: .warning } diff --git a/_opensearch/rest-api/multi-search.md b/_opensearch/rest-api/multi-search.md index 674c222c..ecdfb26d 100644 --- a/_opensearch/rest-api/multi-search.md +++ b/_opensearch/rest-api/multi-search.md @@ -1,63 +1,94 @@ --- layout: default -title: Multi search +title: Multi-search parent: REST API reference nav_order: 130 --- -# Multi search +# Multi-search Introduced 1.0 {: .label .label-purple } -The multi-search operation lets you bundle multiple search requests and send them to your OpenSearch cluster in a single request. This operation executes searches in parallel, so you get back the response more quickly as compared to independent search requests. It also executes each request independently, so the failure of one request doesn't affect the others. +As the name suggests, the multi-search operation lets you bundle multiple search requests into a single request. OpenSearch then executes the searches in parallel, so you get back the response more quickly compared to sending one request per search. OpenSearch executes each search independently, so the failure of one doesn't affect the others. -The multi-search request body follows this pattern: - -``` -header\n -body\n -header\n -body\n -``` - -OpenSearch uses newline characters to parse multi-search requests and requires that each request ends with a newline character. ## Example ```json GET _msearch -{"index":"opensearch_dashboards_sample_data_logs"} -{"query":{"match_all":{}},"from":0,"size":10} -{"index":"opensearch_dashboards_sample_data_ecommerce","search_type":"dfs_query_then_fetch"} -{"query":{"match_all":{}}} +{ "index": "opensearch_dashboards_sample_data_logs"} +{ "query": { "match_all": {} }, "from": 0, "size": 10} +{ "index": "opensearch_dashboards_sample_data_ecommerce", "search_type": "dfs_query_then_fetch"} +{ "query": { "match_all": {} } } + ``` + ## Path and HTTP methods ``` -GET /_msearch +GET _msearch +GET /_msearch +POST _msearch +POST /_msearch ``` -## URL parameters -All multi-search URL parameters are optional. +## Request body -Parameter | Type | Description +The multi-search request body follows this pattern: + +``` +Metadata\n +Query\n +Metadata\n +Query\n + +``` + +- Metadata lines include options, such as which indices to search and the type of search. +- Query lines use the [query DSL]({{site.url}}{{site.baseurl}}/opensearch/query-dsl/). + +Just like the [bulk]({{site.url}}{{site.baseurl}}/opensearch/rest-api/document-apis/bulk/) operation, the JSON doesn't need to be minified---spaces are fine---but it does need to be on a single line. OpenSearch uses newline characters to parse multi-search requests and requires that the request body end with a newline character. + + +## URL parameters and metadata options + +All multi-search URL parameters are optional. Some can also be applied per-search as part of each metadata line. + +Parameter | Type | Description | Supported in metadata line :--- | :--- | :--- -`allow_no_indices` | Boolean | Whether to ignore wildcards that don't match any indices. Default is `true`. -`css_minimize_roundtrips` | Boolean | If true, network roundtrips between the local node and remote clusters are minimized for cross-cluster search requests. Default is `true`. -`expand_wildcards` | Enum | Expands wildcard expressions to concrete indices. Combine multiple values with commas. Supported values are `all`, `open`, `closed`, `hidden`, and `none`. Default is `open`. -`ignore_unavailable` | Boolean | If an index from the indices list doesn’t exist, whether to ignore it rather than fail the query. Default is `false`. -`max_concurrent_searches` | Integer | Maximum number of searches executed in parallel. Default is `max(1, (number of of data nodes * min(search thread pool size, 10)))`. -`max_concurrent_shard_requests` | Integer | Maximum number of concurrent shard requests that each sub-search request executes per node. Default is 5. If you have an environment where a very low number of concurrent search requests is expected, a higher value of this parameter might improve performance. -`pre_filter_shard_size` | Integer | Defines a threshold that enforces a round-trip to pre-filter search shards that cannot possibly match. This filter phase can limit the number of searched shards significantly. For instance, if a date range filter is applied, then all indices that don't contain documents within that date range are skipped. Default is 128. -`rest_total_hits_as_int` | String | Whether the `hits.total` property is returned as an integer or an object. Default is `false`. -`search_type` | String | Whether global term and document frequencies are used when calculating the relevance score. Valid choices are `query_then_fetch` and `dfs_query_then_fetch`. `query_then_fetch` scores documents using local term and document frequencies for the shard. It's usually faster but less accurate. `dfs_query_then_fetch` scores documents using global term and document frequencies across all shards. It's usually slower but more accurate. Default is `query_then_fetch`. -`typed_keys` | Boolean | Whether aggregation names are prefixed by their internal types in the response. Default is `false`. +allow_no_indices | Boolean | Whether to ignore wildcards that don't match any indices. Default is `true`. | Yes +css_minimize_roundtrips | Boolean | Whether OpenSearch should try to minimize the number of network round trips between the coordinating node and remote clusters (only applicable to cross-cluster search requests). Default is `true`. | No +expand_wildcards | Enum | Expands wildcard expressions to concrete indices. Combine multiple values with commas. Supported values are `all`, `open`, `closed`, `hidden`, and `none`. Default is `open`. | Yes +ignore_unavailable | Boolean | If an index from the indices list doesn’t exist, whether to ignore it rather than fail the query. Default is `false`. | Yes +max_concurrent_searches | Integer | The maximum number of concurrent searches. The default depends on your node count and search thread pool size. Higher values can improve performance, but risk overloading the cluster. | No +max_concurrent_shard_requests | Integer | Maximum number of concurrent shard requests that each search executes per node. Default is 5. Higher values can improve performance, but risk overloading the cluster. | No +pre_filter_shard_size | Integer | Default is 128. | No +rest_total_hits_as_int | String | Whether the `hits.total` property is returned as an integer (`true`) or an object (`false`). Default is `false`. | No +search_type | String | Affects relevance score. Valid options are `query_then_fetch` and `dfs_query_then_fetch`. `query_then_fetch` scores documents using term and document frequencies for the shard (faster, less accurate), whereas `dfs_query_then_fetch` uses term and document frequencies across all shards (slower, more accurate). Default is `query_then_fetch`. | Yes +typed_keys | Boolean | Whether to prefix aggregation names with their internal types in the response. Default is `false`. | No + +{% comment %}Regarding `pre_filter_shard_size`: The description from the REST API specification is unintelligible---to me, anyway. I wasn't able to learn anything from reading the source code, either, so I've included the default value and nothing else in the table above. - aetter + +From the REST API specification: A threshold that enforces a pre-filter round trip to prefilter search shards based on query rewriting if the number of shards the search request expands to exceeds the threshold. This filter roundtrip can limit the number of shards significantly if for instance a shard can not match any documents based on its rewrite method ie. if date filters are mandatory to match but the shard bounds and the query are disjoint.{% endcomment %} + + +## Metadata-only options + +Some options can't be applied as URL parameters to the entire request. Instead, you can apply them per-search as part of each metadata line. All are optional. + +Option | Type | Description +:--- | :--- | :--- +index | String, string array | If you don't specify an index or multiple indices as part of the URL (or want to override the URL value for an individual search), you can include it here. Examples include `"logs-*"` and `["my-store", "sample_data_ecommerce"]`. +preference | String | The nodes or shards that you'd like to perform the search. This setting can be useful for testing, but in most situations, the default behavior provides the best search latencies. Options include `_local`, `_only_local`, `_prefer_nodes`, `_only_nodes`, and `_shards`. These last three options accept a list of nodes or shards. Examples include `"_only_nodes:data-node1,data-node2"` and `"_shards:0,1`. +request_cache | Boolean | Whether to cache results, which can improve latency for repeat searches. Default is to use the `index.requests.cache.enable` setting for the index (which defaults to `true` for new indices). +routing | String | Comma-separated custom routing values (e.g. `"routing": "value1,value2,value3"`. + ## Response -You get back the responses in an array form, where the search response for each search request matches its order in the original multi-search request. +OpenSearch returns an array with the results of each search in the same order as the multi-search request. ```json { diff --git a/_opensearch/rest-api/scroll.md b/_opensearch/rest-api/scroll.md index beffb655..42317200 100644 --- a/_opensearch/rest-api/scroll.md +++ b/_opensearch/rest-api/scroll.md @@ -98,7 +98,7 @@ Parameter | Type | Description :--- | :--- | :--- scroll | Time | Specifies the amount of time the search context is maintained. scroll_id | String | The scroll ID for the search. -rest_total_hits_as_int | Boolean | Whether the `hits.total` property is returned as an integer or an object. Default is false. +rest_total_hits_as_int | Boolean | Whether the `hits.total` property is returned as an integer (`true`) or an object (`false`). Default is `false`. ## Response diff --git a/_opensearch/rest-api/update-mapping.md b/_opensearch/rest-api/update-mapping.md index 0108442f..d39fbcb0 100644 --- a/_opensearch/rest-api/update-mapping.md +++ b/_opensearch/rest-api/update-mapping.md @@ -47,7 +47,7 @@ All update mapping parameters are optional. Parameter | Data Type | Description :--- | :--- | :--- -allow_no_indices | Boolean | Whether to ignore wildcards that don’t match any indices. Default is true. +allow_no_indices | Boolean | Whether to ignore wildcards that don’t match any indices. Default is `true`. expand_wildcards | String | Expands wildcard expressions to different indices. Combine multiple values with commas. Available values are `all` (match all indices), `open` (match open indices), `closed` (match closed indices), `hidden` (match hidden indices), and `none` (do not accept wildcard expressions), which must be used with `open`, `closed`, or both. Default is `open`. ignore_unavailable | Boolean | If true, OpenSearch does not include missing or closed indices in the response. master_timeout | Time | How long to wait for a connection to the master node. Default is `30s`. diff --git a/_search-plugins/async/index.md b/_search-plugins/async/index.md index 552c6a96..2a3f51cf 100644 --- a/_search-plugins/async/index.md +++ b/_search-plugins/async/index.md @@ -194,12 +194,16 @@ For asynchronous searches with `keep_on_completion` as `true` and a sufficiently Introduced 1.0 {: .label .label-purple } -You can use the DELETE API operation to delete any ongoing asynchronous search by its ID. If the search is still running, it’s canceled. If the search is complete, the saved search results are deleted. +To delete an asynchronous search: -```json +``` DELETE _plugins/_asynchronous_search/?pretty ``` +- If the search is still running, OpenSearch cancels it. +- If the search is complete, OpenSearch deletes the saved results. + + #### Sample response ```json diff --git a/_search-plugins/knn/approximate-knn.md b/_search-plugins/knn/approximate-knn.md index 9b32bc7a..90691b37 100644 --- a/_search-plugins/knn/approximate-knn.md +++ b/_search-plugins/knn/approximate-knn.md @@ -11,7 +11,7 @@ has_math: true The approximate k-NN method uses [nmslib's](https://github.com/nmslib/nmslib/) implementation of the Hierarchical Navigable Small World (HNSW) algorithm to power k-NN search. In this case, approximate means that for a given search, the neighbors returned are an estimate of the true k-nearest neighbors. Of the three methods, this method offers the best search scalability for large data sets. Generally speaking, once the data set gets into the hundreds of thousands of vectors, this approach is preferred. -The k-NN plugin builds an HNSW graph of the vectors for each "knn-vector field"/ "Lucene segment" pair during indexing that can be used to efficiently find the k-nearest neighbors to a query vector during search. To learn more about Lucene segments, please refer to [Apache Lucene's documentation](https://lucene.apache.org/core/8_7_0/core/org/apache/lucene/codecs/lucene87/package-summary.html#package.description). These graphs are loaded into native memory during search and managed by a cache. To learn more about pre-loading graphs into memory, refer to the [warmup API]({{site.url}}{{site.baseurl}}/search-plugins/knn/api#warmup-operation). Additionally, you can see what graphs are already loaded in memory, which you can learn more about in the [stats API section]({{site.url}}{{site.baseurl}}/search-plugins/knn/api#stats). +The k-NN plugin builds an HNSW graph of the vectors for each "knn-vector field"/ "Lucene segment" pair during indexing that can be used to efficiently find the k-nearest neighbors to a query vector during search. To learn more about Lucene segments, see the [Apache Lucene documentation](https://lucene.apache.org/core/{{site.lucene_version}}/core/org/apache/lucene/codecs/lucene87/package-summary.html#package.description). These graphs are loaded into native memory during search and managed by a cache. To learn more about pre-loading graphs into memory, refer to the [warmup API]({{site.url}}{{site.baseurl}}/search-plugins/knn/api#warmup-operation). Additionally, you can see what graphs are already loaded in memory, which you can learn more about in the [stats API section]({{site.url}}{{site.baseurl}}/search-plugins/knn/api#stats). Because the graphs are constructed during indexing, it is not possible to apply a filter on an index and then use this search method. All filters are applied on the results produced by the approximate nearest neighbor search. From 34068f01bd7e31856519c4dda0b1e9bd3153c647 Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 1 Sep 2021 16:29:19 -0700 Subject: [PATCH 25/37] Add note about enabling compatibility setting during upgrade --- _clients/agents-and-ingestion-tools/index.md | 6 ++++++ _upgrade-to/upgrade-to.md | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/_clients/agents-and-ingestion-tools/index.md b/_clients/agents-and-ingestion-tools/index.md index 7b9ca7fb..ed326279 100644 --- a/_clients/agents-and-ingestion-tools/index.md +++ b/_clients/agents-and-ingestion-tools/index.md @@ -27,6 +27,12 @@ PUT _cluster/settings } ``` +[Just like any other setting]({{site.url}}{{site.baseurl}}/opensearch/configuration/), the alternative is to add the following line to `opensearch.yml` on each node and then restart the node: + +```yml +compatibility.override_main_response_version: true +``` + ## Downloads diff --git a/_upgrade-to/upgrade-to.md b/_upgrade-to/upgrade-to.md index 1fed63f3..a415b621 100644 --- a/_upgrade-to/upgrade-to.md +++ b/_upgrade-to/upgrade-to.md @@ -144,6 +144,12 @@ If you are upgrading an Open Distro for Elasticsearch cluster, we recommend firs 1. Port your settings from `elasticsearch.yml` to `opensearch.yml`. Most settings use the same names. At a minimum, specify `cluster.name`, `node.name`, `discovery.seed_hosts`, and `cluster.initial_master_nodes`. + 1. (Optional) If you're actively connecting to the cluster with legacy clients that check for a particular version number, such as Logstash OSS, add a [compatibility setting]({{site.url}}{{site.baseurl}}/clients/agents-and-ingestion-tools/) to `opensearch.yml`: + + ```yml + compatibility.override_main_response_version: true + ``` + 1. (Optional) Add your certificates to your `config` directory, add them to `opensearch.yml`, and initialize the security plugin. 1. Start OpenSearch on the node (rolling) or all nodes (cluster restart). From b1d3a5906b578eb47985f357ca614ac1c0718860 Mon Sep 17 00:00:00 2001 From: Keith Chan <12404772+keithhc2@users.noreply.github.com> Date: Wed, 1 Sep 2021 19:13:23 -0700 Subject: [PATCH 26/37] Language tweaks to create-index --- _opensearch/rest-api/create-index.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/_opensearch/rest-api/create-index.md b/_opensearch/rest-api/create-index.md index 38170c37..9ff027f0 100644 --- a/_opensearch/rest-api/create-index.md +++ b/_opensearch/rest-api/create-index.md @@ -83,9 +83,8 @@ index.number_of_routing_shards | The number of routing shards used to split an i index.shard.check_on_startup | Whether the index's shards should be checked for corruption. Available options are `false` (do not check for corruption), `checksum` (check for physical corruption), and `true` (check for both physical and logical corruption). Default is `false`. index.codec | The compression type to use to compress stored data. Available values are `best_compression` and `default`. index.routing_partition_size | The number of shards a custom routing value can go to. Routing helps an imbalanced cluster by relocating values to a subset of shards rather than just a single shard. To enable, set this value to greater than 1 but less than `index.number_of_shards`. Default is 1. -index.soft_deletes_enabled | Whether to retain a history of operations performed on the index. index.soft_deletes.retention_lease.period | The maximum amount of time to retain a shard's history of operations. Default is `12h`. -index.load_fixed_bitset_filters_eagerly | Indicates whether cached filters should be pre-loaded for nested queries. Available options are `true` and `false`. Default is `true`. +index.load_fixed_bitset_filters_eagerly | Whether OpenSearch should pre-load cached filters. Available options are `true` and `false`. Default is `true`. index.hidden | Whether the index should be hidden. Hidden indices are not returned as part of queries that have wildcards. Available options are `true` and `false`. Default is `false`. #### Dynamic index Settings @@ -93,23 +92,24 @@ index.hidden | Whether the index should be hidden. Hidden indices are not return Setting | Description :--- | :--- index.number_of_replicas | The number of replica shards each primary shard should have. For example, if you have 4 primary shards and set `index.number_of_replicas` to 3, the index has 12 replica shards. Default is 1. -index.auto_expand_replicas | Automatically expands the number of replicas based on the amount of data nodes in the cluster. Specify a lower bound and upper limit (for example, 0-9), or `all` for the upper limit. For example, if you have 5 data nodes and set `index.auto_expand_replicas` to 0-3, then the cluster does not autoamtically add another replica shard. However, if you set this value to `0-all` and add 2 more nodes for a total of 7, the cluster will expand to now have 6 replica shards. Default is disabled. +index.auto_expand_replicas | Whether the cluster should automatically add replica shards based on the number of data nodes. Specify a lower bound and upper limit (for example, 0-9), or `all` for the upper limit. For example, if you have 5 data nodes and set `index.auto_expand_replicas` to 0-3, then the cluster does not autoamtically add another replica shard. However, if you set this value to `0-all` and add 2 more nodes for a total of 7, the cluster will expand to now have 6 replica shards. Default is disabled. index.search.idle.after | Amount of time a shard should wait for a search or get request until it goes idle. Default is `30s`. index.refresh_interval | How often the index should refresh, which publishes its most recent changes and makes them available for searching. Can be set to `-1` to disable refreshing. Default is `1s`. index.max_result_window | The maximum value of `from` + `size` for searches to the index. `from` is the starting index to search from, and `size` is the amount of results to return. Default: 10000. -index.max_inner_result_window | The maximum value of `from` + `size` for inner hits definitions and top hits aggregations to the index. `from` is the starting index to search from, and `size` is the amount of top hits to return. Default is 100. +index.max_inner_result_window | aximum value of `from` + `size` to return nested search hits and most relevant document aggregated during the query. `from` is the starting index to search from, and `size` is the amount of top hits to return. Default is 100. index.max_rescore_window | The maximum value of `window_size` for rescore requests to the index. Rescore requests reorder the index's documents and return a new score, which can be more precise. Default is the same as index.max_inner_result_window or 10000 by default. index.max_docvalue_fields_search | Maximum amount of `docvalue_fields` allowed in a query. Default is 100. -index.max_script_fields | Maximum amount of `script_fields` allowed in a query. Default is 32. -index.max_ngram_diff | Maximum allowed difference between `min_gram` and `max_gram` values for `NGramTokenizer` and `NGramTokenFilter`. Default is 1. -index.max_shingle_diff | Maximum allowed difference between `max_shingle_size` and `min_shingle_size` for the `shingle` token filter. Default is 3. -index.max_refresh_listeners | Maximum amount of refresh listeners available on the index's shards. +index.max_script_fields | Maximum amount of`script_fields` allowed in a query. Default is 32. +index.max_ngram_diff | Maximum difference between `min_gram` and `max_gram` values for `NGramTokenizer` and `NGramTokenFilter` fields. Default is 1. +index.max_shingle_diff | Maximum difference between `max_shingle_size` and `min_shingle_size` to feed into the `shingle` token filter. Default is 3. +index.max_refresh_listeners | Maximum amount of refresh listeners each shard is allowed to have. index.analyze.max_token_count | Maximum amount of tokens that can return from the `_analyze` API operation. Default is 10000. -index.highlight.max_analyzed_offset | The maximum amount of characters that will be analyzed in a highlight request. Default is 1000000. -index.max_terms_count | The maximum amount of terms that can be used in a terms query. Default is 65536. +index.highlight.max_analyzed_offset | The amount of characters a highlight request can analyze. Default is 1000000. +index.max_terms_count | The maximum amount of terms a terms query can accept. Default is 65536. index.max_regex_length | The maximum character length of regex that can be in a regexp query. Default is 1000. index.query.default_field | A field or list of fields that OpenSearch uses in queries in case a field isn't specified in the parameters. -index.routing.allocation.enable | Specifies options for the index's shard allocation. Available options are `all` (allow shard allocation for all shards), `primaries` (allow shard allocation only for primary shards), `new_primaries` (allow shard allocaiton only for new primary shards), and `none` (do not allow shard allocation). Default is `all`. +index.routing.allocation.enable | Specifies options for the index’s shard allocation. Available options are all (allow allocation for all shards), primaries (allow allocation only for primary shards), new_primaries (allow allocation only for new primary shards), and none (do not allow allocation). Default is all. +index.routing.rebalance.enable - Shard rebalancing for the index. Available options are `all` (allow rebalancing for all shards), `primaries` (allow rebalancing only for primary shards), `replicas` (allow rebalancing only for replicas), and `none` (do not allow rebalancing). Default is `all`. index.routing.rebalance.enable | Enables shard rebalancing for the index. Available options are `all` (allow shard rebalancing for all shards), `primaries`, (allow shard rebalancing only for primary shards), `replicas` (allow shard rebalancing only for replicas), and `none` (do not allow shard rebalancing). Default is `all`. index.gc_deletes | Amount of time to retain a deleted document's version number. Default is `60s`. index.default_pipeline | The default ingest node pipeline for the index. If the default pipeline is set and the pipeline does not exist, then index requests fail. The pipeline name `_none` specifies that the index does not have an ingest pipeline. From eaba608cfd2898cbf2554886568c6e2dc0ebc6d3 Mon Sep 17 00:00:00 2001 From: aetter Date: Tue, 7 Sep 2021 15:28:29 -0700 Subject: [PATCH 27/37] Update some Dashboards settings paths --- .../access-control/multi-tenancy.md | 20 +++++++++---------- .../access-control/users-roles.md | 2 +- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/_security-plugin/access-control/multi-tenancy.md b/_security-plugin/access-control/multi-tenancy.md index 537841c2..5b7ed3f5 100644 --- a/_security-plugin/access-control/multi-tenancy.md +++ b/_security-plugin/access-control/multi-tenancy.md @@ -47,21 +47,21 @@ Setting | Description opensearch.username: kibanaserver opensearch.password: kibanaserver opensearch.requestHeadersWhitelist: ["securitytenant","Authorization"] -plugins.security.multitenancy.enabled: true -plugins.security.multitenancy.tenants.enable_global: true -plugins.security.multitenancy.tenants.enable_private: true -plugins.security.multitenancy.tenants.preferred: ["Private", "Global"] -plugins.security.multitenancy.enable_filter: false +opensearch_security.multitenancy.enabled: true +opensearch_security.multitenancy.tenants.enable_global: true +opensearch_security.multitenancy.tenants.enable_private: true +opensearch_security.multitenancy.tenants.preferred: ["Private", "Global"] +opensearch_security.multitenancy.enable_filter: false ``` Setting | Description :--- | :--- `opensearch.requestHeadersWhitelist` | OpenSearch Dashboards requires that you whitelist all HTTP headers that it passes to OpenSearch. Multi-tenancy uses a specific header, `securitytenant`, that must be present with the standard `Authorization` header. If the `securitytenant` header is not whitelisted, OpenSearch Dashboards starts with a red status. -`plugins.security.multitenancy.enabled` | Enables or disables multi-tenancy in OpenSearch Dashboards. Default is true. -`plugins.security.multitenancy.tenants.enable_global` | Enables or disables the global tenant. Default is true. -`plugins.security.multitenancy.tenants.enable_private` | Enables or disables the private tenant. Default is true. -`plugins.security.multitenancy.tenants.preferred` | Lets you change ordering in the **Tenants** tab of OpenSearch Dashboards. By default, the list starts with global and private (if enabled) and then proceeds alphabetically. You can add tenants here to move them to the top of the list. -`plugins.security.multitenancy.enable_filter` | If you have many tenants, you can add a search bar to the top of the list. Default is false. +`opensearch_security.multitenancy.enabled` | Enables or disables multi-tenancy in OpenSearch Dashboards. Default is true. +`opensearch_security.multitenancy.tenants.enable_global` | Enables or disables the global tenant. Default is true. +`opensearch_security.multitenancy.tenants.enable_private` | Enables or disables the private tenant. Default is true. +`opensearch_security.multitenancy.tenants.preferred` | Lets you change ordering in the **Tenants** tab of OpenSearch Dashboards. By default, the list starts with global and private (if enabled) and then proceeds alphabetically. You can add tenants here to move them to the top of the list. +`opensearch_security.multitenancy.enable_filter` | If you have many tenants, you can add a search bar to the top of the list. Default is false. ## Add tenants diff --git a/_security-plugin/access-control/users-roles.md b/_security-plugin/access-control/users-roles.md index 445e1e63..b4e58c7a 100644 --- a/_security-plugin/access-control/users-roles.md +++ b/_security-plugin/access-control/users-roles.md @@ -109,7 +109,7 @@ Role | Description `anomaly_full_access` | Grants full permissions to all anomaly detection actions. `anomaly_read_access` | Grants permissions to view detectors, but not create, modify, or delete detectors. `all_access` | Grants full access to the cluster: all cluster-wide operations, write to all indices, write to all tenants. -`kibana_read_only` | A special role that prevents users from making changes to visualizations, dashboards, and other OpenSearch Dashboards objects. See `plugins.security.readonly_mode.roles` in `opensearch_dashboards.yml`. Pair with the `kibana_user` role. +`kibana_read_only` | A special role that prevents users from making changes to visualizations, dashboards, and other OpenSearch Dashboards objects. See `opensearch_security.readonly_mode.roles` in `opensearch_dashboards.yml`. Pair with the `kibana_user` role. `kibana_user` | Grants permissions to use OpenSearch Dashboards: cluster-wide searches, index monitoring, and write to various OpenSearch Dashboards indices. `logstash` | Grants permissions for Logstash to interact with the cluster: cluster-wide searches, cluster monitoring, and write to the various Logstash indices. `manage_snapshots` | Grants permissions to manage snapshot repositories, take snapshots, and restore snapshots. From 243c7315e439bc4d08218c105e0d08424ee4a77f Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 8 Sep 2021 08:34:57 -0700 Subject: [PATCH 28/37] Update generate-certificates.md --- _security-plugin/configuration/generate-certificates.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_security-plugin/configuration/generate-certificates.md b/_security-plugin/configuration/generate-certificates.md index 69945d7e..da73f7ec 100755 --- a/_security-plugin/configuration/generate-certificates.md +++ b/_security-plugin/configuration/generate-certificates.md @@ -42,10 +42,10 @@ You can optionally add the `-aes256` option to encrypt the key using the AES-256 Next, use the key to generate a self-signed certificate for the root CA: ```bash -openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem -days 30 +openssl req -new -x509 -sha256 -key root-ca-key.pem -out root-ca.pem -days 730 ``` -Change `-days 30` to 3650 (10 years) or some other number to set a non-default expiration date. The default value of 30 days is best for testing purposes. +The default `-days` value of 30 is only useful for testing purposes. This sample command specifies 730 (two years) for the certificate expiration date, but use whatever value makes sense for your organization. - The `-x509` option specifies that you want a self-signed certificate rather than a certificate request. - The `-sha256` option sets the hash algorithm to SHA-256. SHA-256 is the default in later versions of OpenSSL, but earlier versions might use SHA-1. @@ -78,7 +78,7 @@ Follow the prompts to fill in the details. You don't need to specify a challenge Finally, generate the certificate itself: ```bash -openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 30 +openssl x509 -req -in admin.csr -CA root-ca.pem -CAkey root-ca-key.pem -CAcreateserial -sha256 -out admin.pem -days 730 ``` Just like the root certificate, use the `-days` option to specify an expiration date of longer than 30 days. From 2c713e43adf9ee0ac39679eb0c6b5c4067dcd085 Mon Sep 17 00:00:00 2001 From: aetter Date: Wed, 8 Sep 2021 10:08:33 -0700 Subject: [PATCH 29/37] Update index.md --- _opensearch/query-dsl/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/_opensearch/query-dsl/index.md b/_opensearch/query-dsl/index.md index 3d1b7de8..ac55e7ea 100644 --- a/_opensearch/query-dsl/index.md +++ b/_opensearch/query-dsl/index.md @@ -5,8 +5,11 @@ nav_order: 27 has_children: true redirect_from: - /opensearch/query-dsl/ + - /docs/opensearch/query-dsl/ --- +{%- comment -%}The `/docs/opensearch/query-dsl/` redirect is specifically to support the UI links in OpenSearch Dashboards 1.0.0.{%- endcomment -%} + # Query DSL While you can use HTTP request parameters to perform simple searches, you can also use the OpenSearch query domain-specific language (DSL), which provides a wider range of search options. The query DSL uses the HTTP request body, so you can more easily customize your queries to get the exact results that you want. From c507de5b9fb5ccc437cc815fd94f214e49855b00 Mon Sep 17 00:00:00 2001 From: aetter Date: Thu, 9 Sep 2021 11:22:13 -0700 Subject: [PATCH 30/37] Minor wording changes for Beats OSS --- _clients/agents-and-ingestion-tools/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_clients/agents-and-ingestion-tools/index.md b/_clients/agents-and-ingestion-tools/index.md index ed326279..04adfb1e 100644 --- a/_clients/agents-and-ingestion-tools/index.md +++ b/_clients/agents-and-ingestion-tools/index.md @@ -38,7 +38,7 @@ compatibility.override_main_response_version: true You can download the OpenSearch output plugin for Logstash from [OpenSearch downloads](https://opensearch.org/downloads.html). The Logstash output plugin is compatible with OpenSearch and Elasticsearch OSS (7.10.2 or lower). -These versions of Beats offer the best compatibility with OpenSearch. For more information, see the [compatibility matrices](#compatibility-matrices). +These are the latest versions of Beats OSS with OpenSearch compatibility. For more information, see the [compatibility matrices](#compatibility-matrices). - [Filebeat OSS 7.12.1](https://www.elastic.co/downloads/past-releases/filebeat-oss-7-12-1) - [Metricbeat OSS 7.12.1](https://www.elastic.co/downloads/past-releases/metricbeat-oss-7-12-1) @@ -47,7 +47,7 @@ These versions of Beats offer the best compatibility with OpenSearch. For more i - [Winlogbeat OSS 7.12.1](https://www.elastic.co/downloads/past-releases/winlogbeat-oss-7-12-1) - [Auditbeat OSS 7.12.1](https://elastic.co/downloads/past-releases/auditbeat-oss-7-12-1) -Some users report compatibility issues with ingest pipelines on these versions of Beats. If you use ingest pipelines with OpenSearch, consider using the 7.10.2 versions of Beats OSS instead. +Some users report compatibility issues with ingest pipelines on these versions of Beats. If you use ingest pipelines with OpenSearch, consider using the 7.10.2 versions of Beats instead. {: .note } From b0301949812f929eb0d0dfc7d2a0933b8aea0e01 Mon Sep 17 00:00:00 2001 From: ashwinkumar12345 Date: Fri, 10 Sep 2021 14:25:00 -0700 Subject: [PATCH 31/37] incorporated feedback --- _opensearch/rest-api/count.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/rest-api/count.md b/_opensearch/rest-api/count.md index b7b6b12d..c3463a08 100644 --- a/_opensearch/rest-api/count.md +++ b/_opensearch/rest-api/count.md @@ -28,7 +28,7 @@ GET opensearch_dashboards_sample_data_logs/_count } ``` -You can also use the search API for the same result: +The following call to the search API produces equivalent results: ```json GET opensearch_dashboards_sample_data_logs/_search From 2a0cf500cc8de02f9f46a611707e789f88945e62 Mon Sep 17 00:00:00 2001 From: ashwinkumar12345 Date: Tue, 14 Sep 2021 11:10:11 -0700 Subject: [PATCH 32/37] updated helm project path --- _opensearch/install/helm.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/_opensearch/install/helm.md b/_opensearch/install/helm.md index a5bc7d50..55458626 100644 --- a/_opensearch/install/helm.md +++ b/_opensearch/install/helm.md @@ -31,16 +31,16 @@ The default Helm chart deploys a three-node cluster. We recommend that you have ## Install OpenSearch using Helm -1. Clone the [opensearch-devops](https://github.com/opensearch-project/opensearch-devops/) repository: +1. Clone the [helm-charts](https://github.com/opensearch-project/helm-charts) repository: ```bash - git clone https://github.com/opensearch-project/opensearch-devops.git + git clone https://github.com/opensearch-project/helm-charts ``` 1. Change to the `opensearch` directory: ```bash - cd Helm/opensearch + cd charts/opensearch ``` 1. Package the Helm chart: From 35a7b186fc0e1d955e28ca1e8ae9d69e306cee76 Mon Sep 17 00:00:00 2001 From: Keith Chan <12404772+keithhc2@users.noreply.github.com> Date: Tue, 14 Sep 2021 14:03:29 -0700 Subject: [PATCH 33/37] Fixed broken link --- _opensearch/rest-api/document-apis/update-by-query.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_opensearch/rest-api/document-apis/update-by-query.md b/_opensearch/rest-api/document-apis/update-by-query.md index 0e66d1ae..bb7ebe2b 100644 --- a/_opensearch/rest-api/document-apis/update-by-query.md +++ b/_opensearch/rest-api/document-apis/update-by-query.md @@ -80,7 +80,7 @@ wait_for_active_shards | String | The number of shards that must be active befor ## Request body -To update your indices and documents by query, you must include a [query]({{site.baseurl}}{{site.url}}/opensearch/query-dsl/index) and a script in the request body that OpenSearch can run to update your documents. If you don't specify a query, then every document in the index gets updated. +To update your indices and documents by query, you must include a [query]({{site.url}}{{site.baseurl}}/opensearch/query-dsl/index) and a script in the request body that OpenSearch can run to update your documents. If you don't specify a query, then every document in the index gets updated. ```json { From ba9f43262276530ada4eb08e1de7e6199d0a0426 Mon Sep 17 00:00:00 2001 From: aetter Date: Thu, 16 Sep 2021 14:38:01 -0700 Subject: [PATCH 34/37] Fix table --- _opensearch/rest-api/create-index.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_opensearch/rest-api/create-index.md b/_opensearch/rest-api/create-index.md index 9ff027f0..87dc7591 100644 --- a/_opensearch/rest-api/create-index.md +++ b/_opensearch/rest-api/create-index.md @@ -96,10 +96,10 @@ index.auto_expand_replicas | Whether the cluster should automatically add replic index.search.idle.after | Amount of time a shard should wait for a search or get request until it goes idle. Default is `30s`. index.refresh_interval | How often the index should refresh, which publishes its most recent changes and makes them available for searching. Can be set to `-1` to disable refreshing. Default is `1s`. index.max_result_window | The maximum value of `from` + `size` for searches to the index. `from` is the starting index to search from, and `size` is the amount of results to return. Default: 10000. -index.max_inner_result_window | aximum value of `from` + `size` to return nested search hits and most relevant document aggregated during the query. `from` is the starting index to search from, and `size` is the amount of top hits to return. Default is 100. +index.max_inner_result_window | Maximum value of `from` + `size` to return nested search hits and most relevant document aggregated during the query. `from` is the starting index to search from, and `size` is the amount of top hits to return. Default is 100. index.max_rescore_window | The maximum value of `window_size` for rescore requests to the index. Rescore requests reorder the index's documents and return a new score, which can be more precise. Default is the same as index.max_inner_result_window or 10000 by default. index.max_docvalue_fields_search | Maximum amount of `docvalue_fields` allowed in a query. Default is 100. -index.max_script_fields | Maximum amount of`script_fields` allowed in a query. Default is 32. +index.max_script_fields | Maximum amount of `script_fields` allowed in a query. Default is 32. index.max_ngram_diff | Maximum difference between `min_gram` and `max_gram` values for `NGramTokenizer` and `NGramTokenFilter` fields. Default is 1. index.max_shingle_diff | Maximum difference between `max_shingle_size` and `min_shingle_size` to feed into the `shingle` token filter. Default is 3. index.max_refresh_listeners | Maximum amount of refresh listeners each shard is allowed to have. @@ -109,12 +109,12 @@ index.max_terms_count | The maximum amount of terms a terms query can accept. De index.max_regex_length | The maximum character length of regex that can be in a regexp query. Default is 1000. index.query.default_field | A field or list of fields that OpenSearch uses in queries in case a field isn't specified in the parameters. index.routing.allocation.enable | Specifies options for the index’s shard allocation. Available options are all (allow allocation for all shards), primaries (allow allocation only for primary shards), new_primaries (allow allocation only for new primary shards), and none (do not allow allocation). Default is all. -index.routing.rebalance.enable - Shard rebalancing for the index. Available options are `all` (allow rebalancing for all shards), `primaries` (allow rebalancing only for primary shards), `replicas` (allow rebalancing only for replicas), and `none` (do not allow rebalancing). Default is `all`. -index.routing.rebalance.enable | Enables shard rebalancing for the index. Available options are `all` (allow shard rebalancing for all shards), `primaries`, (allow shard rebalancing only for primary shards), `replicas` (allow shard rebalancing only for replicas), and `none` (do not allow shard rebalancing). Default is `all`. +index.routing.rebalance.enable | Enables shard rebalancing for the index. Available options are `all` (allow rebalancing for all shards), `primaries` (allow rebalancing only for primary shards), `replicas` (allow rebalancing only for replicas), and `none` (do not allow rebalancing). Default is `all`. index.gc_deletes | Amount of time to retain a deleted document's version number. Default is `60s`. index.default_pipeline | The default ingest node pipeline for the index. If the default pipeline is set and the pipeline does not exist, then index requests fail. The pipeline name `_none` specifies that the index does not have an ingest pipeline. index.final_pipeline | The final ingest node pipeline for the index. If the final pipeline is set and the pipeline does not exist, then index requests fail. The pipeline name `_none` specifies that the index does not have an ingest pipeline. + ### Mappings Mappings define how a documents and its fields are stored and indexed. If you're just starting to build out your cluster and data, you may not know exactly how your data should be stored. In those cases, you can use dynamic mappings, which tell OpenSearch to dynamically add data and their fields. However, if you know exactly what types your data fall under and want to enforce that standard, then you can use explicit mappings. From 21ae64aac987263d5700b843ee6502f22939b7b9 Mon Sep 17 00:00:00 2001 From: aetter Date: Fri, 17 Sep 2021 14:17:21 -0700 Subject: [PATCH 35/37] Move to h2 --- _security-plugin/configuration/generate-certificates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_security-plugin/configuration/generate-certificates.md b/_security-plugin/configuration/generate-certificates.md index da73f7ec..8206e2fa 100755 --- a/_security-plugin/configuration/generate-certificates.md +++ b/_security-plugin/configuration/generate-certificates.md @@ -91,7 +91,7 @@ Follow the steps in [Generate an admin certificate](#generate-an-admin-certifica If you generate node certificates and have `plugins.security.ssl.transport.enforce_hostname_verification` set to `true` (default), be sure to specify a common name (CN) for the certificate that matches the hostname of the intended node. If you want to use the same node certificate on all nodes (not recommended), set hostname verification to `false`. For more information, see [Configure TLS certificates]({{site.url}}{{site.baseurl}}/security-plugin/configuration/tls#advanced-hostname-verification-and-dns-lookup). -### Sample script +## Sample script If you already know the certificate details and don't want to specify them interactively, use the `-subj` option in your `root-ca.pem` and CSR commands. This script creates a root certificate, admin certificate, two node certificates, and a client certificate, all with an expiration dates of two years (730 days): From 4ffdce637741c9b0bd8d5c3ea1a98277343d30a4 Mon Sep 17 00:00:00 2001 From: aetter Date: Tue, 21 Sep 2021 11:34:44 -0700 Subject: [PATCH 36/37] Minor improvements Troubleshooting expired certificates, settings, broken link, etc. --- _monitoring-plugins/pa/dashboards.md | 2 +- _monitoring-plugins/pa/index.md | 4 ++-- _opensearch/configuration.md | 8 +++++++ _troubleshoot/index.md | 31 +++++++++++++++++++--------- 4 files changed, 32 insertions(+), 13 deletions(-) diff --git a/_monitoring-plugins/pa/dashboards.md b/_monitoring-plugins/pa/dashboards.md index 2d8c9ec9..561f6fa3 100644 --- a/_monitoring-plugins/pa/dashboards.md +++ b/_monitoring-plugins/pa/dashboards.md @@ -1,6 +1,6 @@ --- layout: default -title: Create Dashboards +title: Create PerfTop Dashboards parent: Performance Analyzer nav_order: 2 --- diff --git a/_monitoring-plugins/pa/index.md b/_monitoring-plugins/pa/index.md index c83df772..006af045 100644 --- a/_monitoring-plugins/pa/index.md +++ b/_monitoring-plugins/pa/index.md @@ -48,11 +48,11 @@ Otherwise, just specify the OpenSearch endpoint: ./opensearch-perf-top-macos --dashboard dashboards/.json --endpoint my-cluster.my-domain.com ``` -PerfTop has four pre-built dashboards in the `dashboards` directory, but you can also [create your own]({{site.url}}{{site.baseurl}}/dashboards/). +PerfTop has four pre-built dashboards in the `dashboards` directory, but you can also [create your own]({{site.url}}{{site.baseurl}}/monitoring-plugins/pa/dashboards/). You can also load the pre-built dashboards (ClusterOverview, ClusterNetworkMemoryAnalysis, ClusterThreadAnalysis, or NodeAnalysis) without the JSON files, such as `--dashboard ClusterThreadAnalysis`. -PerfTop has no interactivity. Start the application, monitor the dashboard, and press esc, q, or Ctrl + C to quit. +PerfTop has no interactivity. Start the application, monitor the dashboard, and press Esc, Q, or Ctrl + C to quit. {: .note } diff --git a/_opensearch/configuration.md b/_opensearch/configuration.md index a6a0f995..d28767bf 100755 --- a/_opensearch/configuration.md +++ b/_opensearch/configuration.md @@ -65,4 +65,12 @@ PUT _cluster/settings You can find `opensearch.yml` in `/usr/share/opensearch/config/opensearch.yml` (Docker) or `/etc/opensearch/opensearch.yml` (most Linux distributions) on each node. +You don't mark settings in `opensearch.yml` as persistent or transient, and settings use the flat form: + +```yml +cluster.name: my-application +action.auto_create_index: true +compatibility.override_main_response_version: true +``` + The demo configuration includes a number of settings for the security plugin that you should modify before using OpenSearch for a production workload. To learn more, see [Security]({{site.url}}{{site.baseurl}}/security-plugin/). diff --git a/_troubleshoot/index.md b/_troubleshoot/index.md index 76a03551..fc11a6b6 100644 --- a/_troubleshoot/index.md +++ b/_troubleshoot/index.md @@ -11,16 +11,32 @@ redirect_from: /troubleshoot/ This page contains a list of common issues and workarounds. -## Java error during startup - -You might see `[ERROR][c.a.o.s.s.t.OpenSearchSecuritySSLNettyTransport] [opensearch-node1] SSL Problem Insufficient buffer remaining for AEAD cipher fragment (2). Needs to be more than tag size (16)` when starting OpenSearch. This problem is a [known issue with Java](https://bugs.openjdk.java.net/browse/JDK-8221218) and doesn't affect the operation of the cluster. - - ## OpenSearch Dashboards fails to start If you encounter the error `FATAL Error: Request Timeout after 30000ms` during startup, try running OpenSearch Dashboards on a more powerful machine. We recommend four CPU cores and 8 GB of RAM. +## Multi-tenancy issues in OpenSearch Dashboards + +If you're testing multiple users in OpenSearch Dashboards and encounter unexpected changes in tenant, use Google Chrome in an Incognito window or Firefox in a Private window. + + +## Expired certificates + +If your certificates have expired, you might receive the following error or something similar: + +``` +ERROR org.opensearch.security.ssl.transport.SecuritySSLNettyTransport - Exception during establishing a SSL connection: javax.net.ssl.SSLHandshakeException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed +Caused by: java.security.cert.CertificateExpiredException: NotAfter: Thu Sep 16 11:27:55 PDT 2021 +``` + +To check the expiration date for a certificate, run this command: + +```bash +openssl x509 -enddate -noout -in +``` + + ## Encryption at rest The operating system for each OpenSearch node handles encryption of data at rest. To enable encryption at rest in most Linux distributions, use the `cryptsetup` command: @@ -85,8 +101,3 @@ The security plugin blocks the update by script operation (`POST /_update ## Illegal reflective access operation in logs This is a known issue with Performance Analyzer that shouldn't affect functionality. - - -## Multi-tenancy issues in OpenSearch Dashboards - -If you're testing multiple users in OpenSearch Dashboards and encounter unexpected changes in tenant, use Google Chrome in an Incognito window or Firefox in a Private window. From 30378f0076a0a09859233a28f5fe2085165b5ded Mon Sep 17 00:00:00 2001 From: aetter Date: Tue, 21 Sep 2021 12:34:59 -0700 Subject: [PATCH 37/37] Sentence case access control page names --- _security-plugin/access-control/api.md | 2 +- _security-plugin/access-control/cross-cluster-search.md | 4 ++-- _security-plugin/access-control/default-action-groups.md | 4 ++-- _security-plugin/access-control/document-level-security.md | 4 ++-- _security-plugin/access-control/field-level-security.md | 4 ++-- _security-plugin/access-control/field-masking.md | 4 ++-- _security-plugin/access-control/impersonation.md | 4 ++-- _security-plugin/access-control/index.md | 2 +- _security-plugin/access-control/multi-tenancy.md | 4 ++-- _security-plugin/access-control/permissions.md | 2 +- _security-plugin/access-control/users-roles.md | 4 ++-- 11 files changed, 19 insertions(+), 19 deletions(-) diff --git a/_security-plugin/access-control/api.md b/_security-plugin/access-control/api.md index f3c0c685..19dd46ec 100644 --- a/_security-plugin/access-control/api.md +++ b/_security-plugin/access-control/api.md @@ -1,7 +1,7 @@ --- layout: default title: API -parent: Access Control +parent: Access control nav_order: 90 --- diff --git a/_security-plugin/access-control/cross-cluster-search.md b/_security-plugin/access-control/cross-cluster-search.md index 288c82ff..060ad624 100644 --- a/_security-plugin/access-control/cross-cluster-search.md +++ b/_security-plugin/access-control/cross-cluster-search.md @@ -1,7 +1,7 @@ --- layout: default -title: Cross-Cluster Search -parent: Access Control +title: Cross-cluster search +parent: Access control nav_order: 40 --- diff --git a/_security-plugin/access-control/default-action-groups.md b/_security-plugin/access-control/default-action-groups.md index a8793aff..025791b6 100644 --- a/_security-plugin/access-control/default-action-groups.md +++ b/_security-plugin/access-control/default-action-groups.md @@ -1,7 +1,7 @@ --- layout: default -title: Default Action Groups -parent: Access Control +title: Default action groups +parent: Access control nav_order: 51 --- diff --git a/_security-plugin/access-control/document-level-security.md b/_security-plugin/access-control/document-level-security.md index 04db5fa2..a6d9390f 100644 --- a/_security-plugin/access-control/document-level-security.md +++ b/_security-plugin/access-control/document-level-security.md @@ -1,7 +1,7 @@ --- layout: default -title: Document-Level Security -parent: Access Control +title: Document-level security +parent: Access control nav_order: 10 --- diff --git a/_security-plugin/access-control/field-level-security.md b/_security-plugin/access-control/field-level-security.md index b79dc7ec..e306c951 100644 --- a/_security-plugin/access-control/field-level-security.md +++ b/_security-plugin/access-control/field-level-security.md @@ -1,7 +1,7 @@ --- layout: default -title: Field-Level Security -parent: Access Control +title: Field-level security +parent: Access control nav_order: 11 --- diff --git a/_security-plugin/access-control/field-masking.md b/_security-plugin/access-control/field-masking.md index 991edfc9..e00233dd 100644 --- a/_security-plugin/access-control/field-masking.md +++ b/_security-plugin/access-control/field-masking.md @@ -1,7 +1,7 @@ --- layout: default -title: Field Masking -parent: Access Control +title: Field masking +parent: Access control nav_order: 12 --- diff --git a/_security-plugin/access-control/impersonation.md b/_security-plugin/access-control/impersonation.md index cc995785..82966389 100644 --- a/_security-plugin/access-control/impersonation.md +++ b/_security-plugin/access-control/impersonation.md @@ -1,7 +1,7 @@ --- layout: default -title: User Impersonation -parent: Access Control +title: User impersonation +parent: Access control nav_order: 20 --- diff --git a/_security-plugin/access-control/index.md b/_security-plugin/access-control/index.md index 99c081e6..6275487f 100644 --- a/_security-plugin/access-control/index.md +++ b/_security-plugin/access-control/index.md @@ -1,6 +1,6 @@ --- layout: default -title: Access Control +title: Access control nav_order: 10 has_children: true has_toc: false diff --git a/_security-plugin/access-control/multi-tenancy.md b/_security-plugin/access-control/multi-tenancy.md index 5b7ed3f5..bb092851 100644 --- a/_security-plugin/access-control/multi-tenancy.md +++ b/_security-plugin/access-control/multi-tenancy.md @@ -1,7 +1,7 @@ --- layout: default -title: OpenSearch Dashboards Multi-Tenancy -parent: Access Control +title: OpenSearch Dashboards multi-tenancy +parent: Access control nav_order: 30 --- diff --git a/_security-plugin/access-control/permissions.md b/_security-plugin/access-control/permissions.md index 192e8a7b..6e222fbe 100644 --- a/_security-plugin/access-control/permissions.md +++ b/_security-plugin/access-control/permissions.md @@ -1,7 +1,7 @@ --- layout: default title: Permissions -parent: Access Control +parent: Access control nav_order: 50 --- diff --git a/_security-plugin/access-control/users-roles.md b/_security-plugin/access-control/users-roles.md index b4e58c7a..d7bb9b8a 100644 --- a/_security-plugin/access-control/users-roles.md +++ b/_security-plugin/access-control/users-roles.md @@ -1,7 +1,7 @@ --- layout: default -title: Users and Roles -parent: Access Control +title: Users and roles +parent: Access control nav_order: 1 ---