# User Guide - [User Guide](#user-guide) - [Initializing a Client](#initializing-a-client) - [Authenticate with Amazon OpenSearch Service](#authenticate-with-amazon-opensearch-service) - [Using AWS V2 SDK](#using-aws-v2-sdk) - [Using AWS V3 SDK](#using-aws-v3-sdk) - [Enable Handling of Long Numerals](#enable-handling-of-long-numerals) - [Create an Index](#create-an-index) - [Add a Document to the Index](#add-a-document-to-the-index) - [Search for the Document](#search-for-the-document) - [Delete the document](#delete-the-document) - [Delete the index](#delete-the-index) - [Empty all Pool Connections](#empty-all-pool-connections) ## Initializing a Client ```javascript 'use strict'; var host = 'localhost'; var protocol = 'https'; var port = 9200; var auth = 'admin:admin'; // For testing only. Don't store credentials in code. var ca_certs_path = '/full/path/to/root-ca.pem'; // Optional client certificates if you don't want to use HTTP basic authentication. // var client_cert_path = '/full/path/to/client.pem' // var client_key_path = '/full/path/to/client-key.pem' // Create a client with SSL/TLS enabled. var { Client } = require('@opensearch-project/opensearch'); var fs = require('fs'); var client = new Client({ node: protocol + '://' + auth + '@' + host + ':' + port, ssl: { ca: fs.readFileSync(ca_certs_path), // You can turn off certificate verification (rejectUnauthorized: false) if you're using self-signed certificates with a hostname mismatch. // cert: fs.readFileSync(client_cert_path), // key: fs.readFileSync(client_key_path) }, }); ``` ### Authenticate with Amazon OpenSearch Service #### Using AWS V2 SDK ```javascript const AWS = require('aws-sdk'); // V2 SDK. const { Client } = require('@opensearch-project/opensearch'); const { AwsSigv4Signer } = require('@opensearch-project/opensearch/aws'); const client = new Client({ ...AwsSigv4Signer({ region: 'us-west-2', service: 'es', // 'aoss' for OpenSearch Serverless // Must return a Promise that resolve to an AWS.Credentials object. // This function is used to acquire the credentials when the client start and // when the credentials are expired. // The Client will refresh the Credentials only when they are expired. // With AWS SDK V2, Credentials.refreshPromise is used when available to refresh the credentials. // Example with AWS SDK V2: getCredentials: () => new Promise((resolve, reject) => { // Any other method to acquire a new Credentials object can be used. AWS.config.getCredentials((err, credentials) => { if (err) { reject(err); } else { resolve(credentials); } }); }), }), node: 'https://search-xxx.region.es.amazonaws.com', // OpenSearch domain URL // node: "https://xxx.region.aoss.amazonaws.com" for OpenSearch Serverless }); ``` #### Using AWS V3 SDK ```javascript const { defaultProvider } = require('@aws-sdk/credential-provider-node'); // V3 SDK. const { Client } = require('@opensearch-project/opensearch'); const { AwsSigv4Signer } = require('@opensearch-project/opensearch/aws'); const client = new Client({ ...AwsSigv4Signer({ region: 'us-east-1', service: 'es', // 'aoss' for OpenSearch Serverless // Must return a Promise that resolve to an AWS.Credentials object. // This function is used to acquire the credentials when the client start and // when the credentials are expired. // The Client will refresh the Credentials only when they are expired. // With AWS SDK V2, Credentials.refreshPromise is used when available to refresh the credentials. // Example with AWS SDK V3: getCredentials: () => { // Any other method to acquire a new Credentials object can be used. const credentialsProvider = defaultProvider(); return credentialsProvider(); }, }), node: 'https://search-xxx.region.es.amazonaws.com', // OpenSearch domain URL // node: "https://xxx.region.aoss.amazonaws.com" for OpenSearch Serverless }); ``` ### Enable Handling of Long Numerals JavaScript can safely work with integers from -(253 - 1) to 253 - 1. However, serialized JSON texts from other languages can potentially have numeric values beyond that range and the native serialization and deserialization methods of JavaScript's JSON, incapable of parsing them with precision; these values get rounded to fit the IEEE-754 representation. The `Client` can be configured to appropriately deserialize long numerals as `BigInt` values and vice versa: ```javascript const client = new Client({ enableLongNumeralSupport: true, }); ``` ## Create an Index ```javascript console.log('Creating index:'); var index_name = 'books'; var settings = { settings: { index: { number_of_shards: 4, number_of_replicas: 3, }, }, }; var response = await client.indices.create({ index: index_name, body: settings, }); console.log(response.body); ``` ## Add a Document to the Index ```javascript console.log('Adding document:'); var document = { title: 'The Outsider', author: 'Stephen King', year: '2018', genre: 'Crime fiction', }; var id = '1'; var response = await client.index({ id: id, index: index_name, body: document, refresh: true, }); console.log(response.body); ``` ## Search for the Document ```javascript console.log('Search results:'); var query = { query: { match: { title: { query: 'The Outsider', }, }, }, }; var response = await client.search({ index: index_name, body: query, }); console.log(response.body.hits); ``` ## Delete the document ```javascript console.log('Deleting document:'); var response = await client.delete({ index: index_name, id: id, }); console.log(response.body); ``` ## Delete the index ```javascript console.log('Deleting index:'); var response = await client.indices.delete({ index: index_name, }); console.log(response.body); ``` ## Create a Point in Time ```javascript console.log('Creating a PIT:'); var response = await client.createPit({ index: 'books*', keep_alive: '100m', expand_wildcards: 'all', }); console.log(response.body); ``` ## Get all PITs ```javascript console.log('Getting all PITs:'); var response = await client.getAllPits(); console.log(response.body); ``` ## Delete a Point in Time ```javascript console.log('Deleting a PIT:'); var response = await client.deletePit({ body: { pit_id: [ 'o463QQEPbXktaW5kZXgtMDAwMDAxFkhGN09fMVlPUkVPLXh6MUExZ1hpaEEAFjBGbmVEZHdGU1EtaFhhUFc4ZkR5cWcAAAAAAAAAAAEWaXBPNVJtZEhTZDZXTWFFR05waXdWZwEWSEY3T18xWU9SRU8teHoxQTFnWGloQQAA', ], }, }); console.log(response.body); ``` ## Delete all PITs ```javascript console.log('Deleting all PITs:'); var response = await client.deleteAllPits(); console.log(response.body); ``` ## Empty all Pool Connections ```javascript var pool = new ConnectionPool({ Connection }); pool.addConnection('http://localhost:9200/'); pool.addConnection('http://localhost:9201/'); pool.empty(); // OR pool.empty(() => { // Do something after emptying the pool }); ```