From 6e4c7baf96342662f617fd25c453d4f887ceea3f Mon Sep 17 00:00:00 2001 From: "Daniel (dB.) Doubrovkine" Date: Sun, 23 Jun 2024 21:07:27 -0400 Subject: [PATCH] Added cancel_after_time_interval and phase_took in _search. (#353) * Added tests for basic _search. Signed-off-by: dblock * Added support for cancel_after_time_interval and phase_took in _search. Signed-off-by: dblock --------- Signed-off-by: dblock --- .cspell | 1 + CHANGELOG.md | 1 + spec/namespaces/_core.yaml | 177 +++++++++++++++++++-------------- spec/schemas/_common.yaml | 22 ++++ spec/schemas/_core.search.yaml | 2 + tests/_core/search.yaml | 100 +++++++++++++++++++ 6 files changed, 227 insertions(+), 76 deletions(-) create mode 100644 tests/_core/search.yaml diff --git a/.cspell b/.cspell index 3acd4364..1588dfc8 100644 --- a/.cspell +++ b/.cspell @@ -19,6 +19,7 @@ Kuromoji Lovins Lucene Millis +Moneyball Multisearch Nanos Nori diff --git a/CHANGELOG.md b/CHANGELOG.md index 53beddde..d0aeb5d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) - Added `created_time` and `last_updated_time` to `ml.get_model_group@200` ([#342](https://github.com/opensearch-project/opensearch-api-specification/pull/342)) - Added spellcheck linter ([#341](https://github.com/opensearch-project/opensearch-api-specification/pull/341)) - Added tests for response payload ([#347](https://github.com/opensearch-project/opensearch-api-specification/pull/347)) +- Added `cancel_after_time_interval` and `phase_took` in `_search` ([#353](https://github.com/opensearch-project/opensearch-api-specification/pull/353)) ### Changed diff --git a/spec/namespaces/_core.yaml b/spec/namespaces/_core.yaml index a2c35ef5..67f81210 100644 --- a/spec/namespaces/_core.yaml +++ b/spec/namespaces/_core.yaml @@ -643,50 +643,52 @@ paths: externalDocs: url: https://opensearch.org/docs/latest/api-reference/search/ parameters: - - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query._source_excludes' + - $ref: '#/components/parameters/search::query._source_includes' + - $ref: '#/components/parameters/search::query._source' + - $ref: '#/components/parameters/search::query.allow_no_indices' + - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.analyze_wildcard' + - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query.batched_reduce_size' + - $ref: '#/components/parameters/search::query.cancel_after_time_interval' - $ref: '#/components/parameters/search::query.ccs_minimize_roundtrips' - $ref: '#/components/parameters/search::query.default_operator' - $ref: '#/components/parameters/search::query.df' - - $ref: '#/components/parameters/search::query.explain' - - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.docvalue_fields' + - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.explain' - $ref: '#/components/parameters/search::query.from' - - $ref: '#/components/parameters/search::query.ignore_unavailable' - $ref: '#/components/parameters/search::query.ignore_throttled' - - $ref: '#/components/parameters/search::query.allow_no_indices' - - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.ignore_unavailable' + - $ref: '#/components/parameters/search::query.include_named_queries_score' - $ref: '#/components/parameters/search::query.lenient' + - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' + - $ref: '#/components/parameters/search::query.phase_took' + - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - $ref: '#/components/parameters/search::query.preference' - $ref: '#/components/parameters/search::query.q' + - $ref: '#/components/parameters/search::query.request_cache' + - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - $ref: '#/components/parameters/search::query.routing' - $ref: '#/components/parameters/search::query.scroll' + - $ref: '#/components/parameters/search::query.search_pipeline' - $ref: '#/components/parameters/search::query.search_type' + - $ref: '#/components/parameters/search::query.seq_no_primary_term' - $ref: '#/components/parameters/search::query.size' - $ref: '#/components/parameters/search::query.sort' - - $ref: '#/components/parameters/search::query._source' - - $ref: '#/components/parameters/search::query._source_excludes' - - $ref: '#/components/parameters/search::query._source_includes' - - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.stats' + - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.suggest_field' - $ref: '#/components/parameters/search::query.suggest_mode' - $ref: '#/components/parameters/search::query.suggest_size' - $ref: '#/components/parameters/search::query.suggest_text' + - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.timeout' - $ref: '#/components/parameters/search::query.track_scores' - $ref: '#/components/parameters/search::query.track_total_hits' - - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.typed_keys' - $ref: '#/components/parameters/search::query.version' - - $ref: '#/components/parameters/search::query.seq_no_primary_term' - - $ref: '#/components/parameters/search::query.request_cache' - - $ref: '#/components/parameters/search::query.batched_reduce_size' - - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' - - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - - $ref: '#/components/parameters/search::query.search_pipeline' - - $ref: '#/components/parameters/search::query.include_named_queries_score' requestBody: $ref: '#/components/requestBodies/search' responses: @@ -700,50 +702,52 @@ paths: externalDocs: url: https://opensearch.org/docs/latest/api-reference/search/ parameters: - - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query._source_excludes' + - $ref: '#/components/parameters/search::query._source_includes' + - $ref: '#/components/parameters/search::query._source' + - $ref: '#/components/parameters/search::query.allow_no_indices' + - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.analyze_wildcard' + - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query.batched_reduce_size' + - $ref: '#/components/parameters/search::query.cancel_after_time_interval' - $ref: '#/components/parameters/search::query.ccs_minimize_roundtrips' - $ref: '#/components/parameters/search::query.default_operator' - $ref: '#/components/parameters/search::query.df' - - $ref: '#/components/parameters/search::query.explain' - - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.docvalue_fields' + - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.explain' - $ref: '#/components/parameters/search::query.from' - - $ref: '#/components/parameters/search::query.ignore_unavailable' - $ref: '#/components/parameters/search::query.ignore_throttled' - - $ref: '#/components/parameters/search::query.allow_no_indices' - - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.ignore_unavailable' + - $ref: '#/components/parameters/search::query.include_named_queries_score' - $ref: '#/components/parameters/search::query.lenient' + - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' + - $ref: '#/components/parameters/search::query.phase_took' + - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - $ref: '#/components/parameters/search::query.preference' - $ref: '#/components/parameters/search::query.q' + - $ref: '#/components/parameters/search::query.request_cache' + - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - $ref: '#/components/parameters/search::query.routing' - $ref: '#/components/parameters/search::query.scroll' + - $ref: '#/components/parameters/search::query.search_pipeline' - $ref: '#/components/parameters/search::query.search_type' + - $ref: '#/components/parameters/search::query.seq_no_primary_term' - $ref: '#/components/parameters/search::query.size' - $ref: '#/components/parameters/search::query.sort' - - $ref: '#/components/parameters/search::query._source' - - $ref: '#/components/parameters/search::query._source_excludes' - - $ref: '#/components/parameters/search::query._source_includes' - - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.stats' + - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.suggest_field' - $ref: '#/components/parameters/search::query.suggest_mode' - $ref: '#/components/parameters/search::query.suggest_size' - $ref: '#/components/parameters/search::query.suggest_text' + - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.timeout' - $ref: '#/components/parameters/search::query.track_scores' - $ref: '#/components/parameters/search::query.track_total_hits' - - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.typed_keys' - $ref: '#/components/parameters/search::query.version' - - $ref: '#/components/parameters/search::query.seq_no_primary_term' - - $ref: '#/components/parameters/search::query.request_cache' - - $ref: '#/components/parameters/search::query.batched_reduce_size' - - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' - - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - - $ref: '#/components/parameters/search::query.search_pipeline' - - $ref: '#/components/parameters/search::query.include_named_queries_score' requestBody: $ref: '#/components/requestBodies/search' responses: @@ -1667,50 +1671,52 @@ paths: url: https://opensearch.org/docs/latest/api-reference/search/ parameters: - $ref: '#/components/parameters/search::path.index' - - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query._source_excludes' + - $ref: '#/components/parameters/search::query._source_includes' + - $ref: '#/components/parameters/search::query._source' + - $ref: '#/components/parameters/search::query.allow_no_indices' + - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.analyze_wildcard' + - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query.batched_reduce_size' + - $ref: '#/components/parameters/search::query.cancel_after_time_interval' - $ref: '#/components/parameters/search::query.ccs_minimize_roundtrips' - $ref: '#/components/parameters/search::query.default_operator' - $ref: '#/components/parameters/search::query.df' - - $ref: '#/components/parameters/search::query.explain' - - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.docvalue_fields' + - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.explain' - $ref: '#/components/parameters/search::query.from' - - $ref: '#/components/parameters/search::query.ignore_unavailable' - $ref: '#/components/parameters/search::query.ignore_throttled' - - $ref: '#/components/parameters/search::query.allow_no_indices' - - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.ignore_unavailable' + - $ref: '#/components/parameters/search::query.include_named_queries_score' - $ref: '#/components/parameters/search::query.lenient' + - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' + - $ref: '#/components/parameters/search::query.phase_took' + - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - $ref: '#/components/parameters/search::query.preference' - $ref: '#/components/parameters/search::query.q' + - $ref: '#/components/parameters/search::query.request_cache' + - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - $ref: '#/components/parameters/search::query.routing' - $ref: '#/components/parameters/search::query.scroll' + - $ref: '#/components/parameters/search::query.search_pipeline' - $ref: '#/components/parameters/search::query.search_type' + - $ref: '#/components/parameters/search::query.seq_no_primary_term' - $ref: '#/components/parameters/search::query.size' - $ref: '#/components/parameters/search::query.sort' - - $ref: '#/components/parameters/search::query._source' - - $ref: '#/components/parameters/search::query._source_excludes' - - $ref: '#/components/parameters/search::query._source_includes' - - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.stats' + - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.suggest_field' - $ref: '#/components/parameters/search::query.suggest_mode' - $ref: '#/components/parameters/search::query.suggest_size' - $ref: '#/components/parameters/search::query.suggest_text' + - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.timeout' - $ref: '#/components/parameters/search::query.track_scores' - $ref: '#/components/parameters/search::query.track_total_hits' - - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.typed_keys' - $ref: '#/components/parameters/search::query.version' - - $ref: '#/components/parameters/search::query.seq_no_primary_term' - - $ref: '#/components/parameters/search::query.request_cache' - - $ref: '#/components/parameters/search::query.batched_reduce_size' - - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' - - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - - $ref: '#/components/parameters/search::query.search_pipeline' - - $ref: '#/components/parameters/search::query.include_named_queries_score' requestBody: $ref: '#/components/requestBodies/search' responses: @@ -1725,50 +1731,52 @@ paths: url: https://opensearch.org/docs/latest/api-reference/search/ parameters: - $ref: '#/components/parameters/search::path.index' - - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query._source_excludes' + - $ref: '#/components/parameters/search::query._source_includes' + - $ref: '#/components/parameters/search::query._source' + - $ref: '#/components/parameters/search::query.allow_no_indices' + - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.analyze_wildcard' + - $ref: '#/components/parameters/search::query.analyzer' + - $ref: '#/components/parameters/search::query.batched_reduce_size' + - $ref: '#/components/parameters/search::query.cancel_after_time_interval' - $ref: '#/components/parameters/search::query.ccs_minimize_roundtrips' - $ref: '#/components/parameters/search::query.default_operator' - $ref: '#/components/parameters/search::query.df' - - $ref: '#/components/parameters/search::query.explain' - - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.docvalue_fields' + - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.explain' - $ref: '#/components/parameters/search::query.from' - - $ref: '#/components/parameters/search::query.ignore_unavailable' - $ref: '#/components/parameters/search::query.ignore_throttled' - - $ref: '#/components/parameters/search::query.allow_no_indices' - - $ref: '#/components/parameters/search::query.expand_wildcards' + - $ref: '#/components/parameters/search::query.ignore_unavailable' + - $ref: '#/components/parameters/search::query.include_named_queries_score' - $ref: '#/components/parameters/search::query.lenient' + - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' + - $ref: '#/components/parameters/search::query.phase_took' + - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - $ref: '#/components/parameters/search::query.preference' - $ref: '#/components/parameters/search::query.q' + - $ref: '#/components/parameters/search::query.request_cache' + - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - $ref: '#/components/parameters/search::query.routing' - $ref: '#/components/parameters/search::query.scroll' + - $ref: '#/components/parameters/search::query.search_pipeline' - $ref: '#/components/parameters/search::query.search_type' + - $ref: '#/components/parameters/search::query.seq_no_primary_term' - $ref: '#/components/parameters/search::query.size' - $ref: '#/components/parameters/search::query.sort' - - $ref: '#/components/parameters/search::query._source' - - $ref: '#/components/parameters/search::query._source_excludes' - - $ref: '#/components/parameters/search::query._source_includes' - - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.stats' + - $ref: '#/components/parameters/search::query.stored_fields' - $ref: '#/components/parameters/search::query.suggest_field' - $ref: '#/components/parameters/search::query.suggest_mode' - $ref: '#/components/parameters/search::query.suggest_size' - $ref: '#/components/parameters/search::query.suggest_text' + - $ref: '#/components/parameters/search::query.terminate_after' - $ref: '#/components/parameters/search::query.timeout' - $ref: '#/components/parameters/search::query.track_scores' - $ref: '#/components/parameters/search::query.track_total_hits' - - $ref: '#/components/parameters/search::query.allow_partial_search_results' - $ref: '#/components/parameters/search::query.typed_keys' - $ref: '#/components/parameters/search::query.version' - - $ref: '#/components/parameters/search::query.seq_no_primary_term' - - $ref: '#/components/parameters/search::query.request_cache' - - $ref: '#/components/parameters/search::query.batched_reduce_size' - - $ref: '#/components/parameters/search::query.max_concurrent_shard_requests' - - $ref: '#/components/parameters/search::query.pre_filter_shard_size' - - $ref: '#/components/parameters/search::query.rest_total_hits_as_int' - - $ref: '#/components/parameters/search::query.search_pipeline' - - $ref: '#/components/parameters/search::query.include_named_queries_score' requestBody: $ref: '#/components/requestBodies/search' responses: @@ -5405,6 +5413,15 @@ components: schema: $ref: '../schemas/_common.yaml#/components/schemas/Routing' style: form + search::query.cancel_after_time_interval: + in: query + name: cancel_after_time_interval + description: |- + The time after which the search request will be canceled. + Request-level parameter takes precedence over `cancel_after_time_interval` cluster setting. + schema: + $ref: '../schemas/_common.yaml#/components/schemas/Duration' + style: form search::query.scroll: in: query name: scroll @@ -5567,6 +5584,14 @@ components: schema: type: boolean style: form + search::query.phase_took: + name: phase_took + in: query + description: Indicates whether to return phase-level `took` time values in the response. + schema: + type: boolean + default: false + style: form search_shards::path.index: in: path name: index diff --git a/spec/schemas/_common.yaml b/spec/schemas/_common.yaml index ce7510e2..451427e2 100644 --- a/spec/schemas/_common.yaml +++ b/spec/schemas/_common.yaml @@ -1820,3 +1820,25 @@ components: - minimum_index_compatibility_version - minimum_wire_compatibility_version - number + PhaseTook: + type: object + properties: + dfs_pre_query: + $ref: '#/components/schemas/uint' + query: + $ref: '#/components/schemas/uint' + fetch: + $ref: '#/components/schemas/uint' + dfs_query: + $ref: '#/components/schemas/uint' + expand: + $ref: '#/components/schemas/uint' + can_match: + $ref: '#/components/schemas/uint' + required: + - dfs_pre_query + - query + - fetch + - dfs_query + - expand + - can_match \ No newline at end of file diff --git a/spec/schemas/_core.search.yaml b/spec/schemas/_core.search.yaml index 935fbd7f..6e3ed1f7 100644 --- a/spec/schemas/_core.search.yaml +++ b/spec/schemas/_core.search.yaml @@ -851,6 +851,8 @@ components: type: boolean _shards: $ref: '_common.yaml#/components/schemas/ShardStatistics' + phase_took: + $ref: '_common.yaml#/components/schemas/PhaseTook' hits: $ref: '#/components/schemas/HitsMetadata' aggregations: diff --git a/tests/_core/search.yaml b/tests/_core/search.yaml new file mode 100644 index 00000000..f92613c7 --- /dev/null +++ b/tests/_core/search.yaml @@ -0,0 +1,100 @@ +$schema: ../../json_schemas/test_story.schema.yaml + +skip: false +description: Test search endpoint. +prologues: + - path: /movies/_doc + method: POST + parameters: + refresh: true + request_body: + payload: + director: Bennett Miller + title: Moneyball + year: 2011 + response: + status: 201 +epilogues: + - path: /movies + method: DELETE + status: [200, 404] +chapters: + - synopsis: Search with size=0. + path: /{index}/_search + parameters: + index: movies + method: POST + request_body: + payload: + size: 0 + response: + status: 200 + payload: + timed_out: false + hits: + total: + value: 1 + relation: eq + max_score: null + hits: [] + - synopsis: Search with size=1. + path: /{index}/_search + parameters: + index: movies + method: POST + request_body: + payload: + size: 1 + query: + match_all: {} + response: + status: 200 + payload: + timed_out: false + hits: + total: + value: 1 + relation: eq + max_score: 1 + hits: + - _index: movies + _score: 1 + _source: + director: Bennett Miller + title: Moneyball + year: 2011 + - synopsis: Search with multi_match query. + path: /{index}/_search + parameters: + index: movies + method: POST + request_body: + payload: + size: 1 + query: + multi_match: + query: miller + fields: ["title^2", "director"] + response: + status: 200 + payload: + timed_out: false + hits: + total: + value: 1 + relation: eq + hits: + - _index: movies + _source: + director: Bennett Miller + title: Moneyball + year: 2011 + - synopsis: Search with parameters. + path: /{index}/_search + parameters: + index: movies + cancel_after_time_interval: 10s + phase_took: true + method: POST + response: + status: 200