docs/src/main/sphinx/connector/opensearch.md
The OpenSearch connector allows access to OpenSearch data from Trino. This document describes how to configure a catalog with the OpenSearch connector to run SQL queries against OpenSearch.
To configure the OpenSearch connector, create a catalog properties file
etc/catalog/example.properties with the following content, replacing the
properties as appropriate for your setup:
connector.name=opensearch
opensearch.host=search.example.com
opensearch.port=9200
opensearch.default-schema-name=default
The following table details all general configuration properties:
:::{list-table} OpenSearch configuration properties :widths: 35, 55, 10 :header-rows: 1
opensearch.hostopensearch.port9200opensearch.default-schema-namedefaultopensearch.scroll-size1000opensearch.scroll-timeout1mopensearch.request-timeout10sopensearch.connect-timeout1sopensearch.backoff-init-delay500msopensearch.backoff-max-delay20sopensearch.max-retry-time30sopensearch.node-refresh-interval1mopensearch.ignore-publish-addressfalseopensearch.projection-pushdown-enabledSELECT queriestrue
:::The connection to OpenSearch can use AWS or password authentication.
To enable AWS authentication and authorization using IAM policies, the
opensearch.security option must be set to AWS. Additionally, the
following options must be configured:
:::{list-table} :widths: 40, 60 :header-rows: 1
opensearch.aws.regionopensearch.aws.access-keyopensearch.aws.secret-keyopensearch.aws.iam-roleopensearch.aws.external-idopensearch.aws.deployment-typePROVISIONED & SERVERLESS. This option is required.
:::To enable password authentication, the opensearch.security option must be set
to PASSWORD. Additionally the following options must be configured:
:::{list-table} :widths: 45, 55 :header-rows: 1
opensearch.auth.useropensearch.auth.passwordThe connector provides additional security options to connect to OpenSearch clusters with TLS enabled.
If your cluster uses globally-trusted certificates, you only need to enable TLS. If you require custom configuration for certificates, the connector supports key stores and trust stores in P12 (PKCS) or Java Key Store (JKS) format.
The available configuration values are listed in the following table:
:::{list-table} TLS configuration properties :widths: 40, 60 :header-rows: 1
opensearch.tls.enabledfalse.opensearch.tls.keystore-pathopensearch.tls.truststore-pathopensearch.tls.keystore-passwordopensearch.tls.keystore-path.opensearch.tls.truststore-passwordopensearch.tls.truststore-path.opensearch.tls.verify-hostnamestrue.
:::(opensearch-type-mapping)=
Because Trino and OpenSearch each support types that the other does not, the connector maps some types when reading data.
The connector maps OpenSearch types to the corresponding Trino types according to the following table:
:::{list-table} OpenSearch type to Trino type mapping :widths: 30, 30, 50 :header-rows: 1
BOOLEANBOOLEANDOUBLEDOUBLEFLOATREALBYTETINYINTSHORTSMALLINTINTEGERINTEGERLONGBIGINTKEYWORDVARCHARTEXTVARCHARIPADDRESSIP:::
No other types are supported.
(opensearch-array-types)=
Fields in OpenSearch can contain zero or more values, but there is no dedicated array type. To indicate a field contains an array, it can be annotated in a Trino-specific structure in the _meta section of the index mapping in OpenSearch.
For example, you can have an OpenSearch index that contains documents with the following structure:
{
"array_string_field": ["trino","the","lean","machine-ohs"],
"long_field": 314159265359,
"id_field": "564e6982-88ee-4498-aa98-df9e3f6b6109",
"timestamp_field": "2025-09-17T06:22:48.000Z",
"object_field": {
"array_int_field": [86,75,309],
"int_field": 2
}
}
The array fields of this structure can be defined by using the following command
to add the field property definition to the _meta.trino property of the target
index mapping with OpenSearch available at search.example.com:9200:
curl --request PUT \
--url search.example.com:9200/doc/_mapping \
--header 'content-type: application/json' \
--data '
{
"_meta": {
"trino":{
"array_string_field":{
"isArray":true
},
"object_field":{
"array_int_field":{
"isArray":true
}
},
}
}
}'
:::{note}
It is not allowed to use asRawJson and isArray flags simultaneously for the same column.
:::
(opensearch-date-types)=
The OpenSearch connector supports only the default date type. All other
OpenSearch date formats including built-in date formats and custom date
formats are not supported. Dates with the format property are ignored.
Documents in OpenSearch can include more complex structures that are not
represented in the mapping. For example, a single keyword field can have
widely different content including a single keyword value, an array, or a
multidimensional keyword array with any level of nesting.
The following command configures array_string_field mapping with OpenSearch
available at search.example.com:9200:
curl --request PUT \
--url search.example.com:9200/doc/_mapping \
--header 'content-type: application/json' \
--data '
{
"properties": {
"array_string_field":{
"type": "keyword"
}
}
}'
All the following documents are legal for OpenSearch with array_string_field
mapping:
[
{
"array_string_field": "trino"
},
{
"array_string_field": ["trino","is","the","best"]
},
{
"array_string_field": ["trino",["is","the","best"]]
},
{
"array_string_field": ["trino",["is",["the","best"]]]
}
]
See the OpenSearch array documentation for more details.
Further, OpenSearch supports types, such as k-NN
vector,
that are not supported in Trino. These and other types can cause parsing
exceptions for users that use of these types in OpenSearch. To manage all of
these scenarios, you can transform fields to raw JSON by annotating it in a
Trino-specific structure in the
_meta section of the
OpenSearch index mapping. This indicates to Trino that the field, and all nested
fields beneath, must be cast to a VARCHAR field that contains the raw JSON
content. These fields can be defined by using the following command to add the
field property definition to the _meta.trino property of the target index
mapping.
curl --request PUT \
--url search.example.com:9200/doc/_mapping \
--header 'content-type: application/json' \
--data '
{
"_meta": {
"trino":{
"array_string_field":{
"asRawJson":true
}
}
}
}'
The preceding configuration causes Trino to return the array_string_field
field as a VARCHAR containing raw JSON. You can parse these fields with the
built-in JSON functions.
:::{note}
It is not allowed to use asRawJson and isArray flags simultaneously for the same column.
:::
The following hidden columns are available:
:::{list-table} :widths: 25, 75 :header-rows: 1
_id_score_source(opensearch-sql-support)=
The connector provides globally available and read operation statements to access data and metadata in the OpenSearch catalog.
The connector provides support to query multiple tables using a concise wildcard table notation.
SELECT *
FROM example.web."page_views_*";
The connector provides specific table functions to access OpenSearch.
(opensearch-raw-query-function)=
raw_query(varchar) -> tableThe raw_query function allows you to query the underlying database directly
using the OpenSearch Query
DSL syntax. The full DSL
query is pushed down and processed in OpenSearch. This can be useful for
accessing native features which are not available in Trino, or for improving
query performance in situations where running a query natively may be faster.
The raw_query function requires three parameters:
schema: The schema in the catalog that the query is to be executed on.index: The index in OpenSearch to search.query: The query to execute, written in OpenSearch Query DSL.Once executed, the query returns a single row containing the resulting JSON payload returned by OpenSearch.
For example, query the example catalog and use the raw_query table function
to search for documents in the orders index where the country name is
ALGERIA as defined as a JSON-formatted query matcher and passed to the
raw_query table function in the query parameter:
SELECT
*
FROM
TABLE(
example.system.raw_query(
schema => 'sales',
index => 'orders',
query => '{
"query": {
"match": {
"name": "ALGERIA"
}
}
}'
)
);
The connector includes a number of performance improvements, detailed in the following sections.
The connector requests data from multiple nodes of the OpenSearch cluster for query processing in parallel.
The connector supports predicate push down for the following data types:
:::{list-table} :widths: 50, 50 :header-rows: 1
booleanBOOLEANdoubleDOUBLEfloatREALbyteTINYINTshortSMALLINTintegerINTEGERlongBIGINTkeywordVARCHARdateTIMESTAMP
:::No other data types are supported for predicate push down.