Elasticsearch Client for Deno Runtime


Getting Started

Connect and Check the Health of Elasticsearch

import { Client as ElasticsearchClient } from 'https://deno.land/x/elasticsearch@v7.16.1/mod.ts'
import type { HealthResponse } from 'https://deno.land/x/elasticsearch@v7.16.1/mod.ts'

const client = new ElasticsearchClient({ node: 'http://localhost:9200' })

const health: HealthResponse = await client.health()

Connect with Auth

const username = Deno.env.get('ELASTIC_USERNAME')!
const password = Deno.env.get('ELASTIC_PASSWORD')!

const client = new ElasticsearchClient({
    node: 'https://deno-elastic.es.us-central1.gcp.cloud.es.io:9243',
    auth: {
        username,
        password
    }
})

import type { SearchResponse } from 'https://deno.land/x/elasticsearch@v7.16.1/mod.ts'

interface Source {
    title: string
}

const res: SearchResponse<Source> = await client.search<Source>({
    target: 'test-index',
    body: {
        query: {
            match_all: {}
        }
    }
})

const mres: MSearchResponse<Source> = await client.msearch<{ title: string }>({
    // target: 'test-index',
    body: [
        { index: 'test-index' },
        { query: { match: { title: 'Deno' } } },
        { index: 'test-index' },
        { query: { match: { title: 'Node' } } },
        { index: 'other-test-index' },
        { query: { match: { title: 'Rust' } } },
    ]
})

// msearch will not throw an error on not found like search does
// so you have to check if each response has object 'hits' or 'error'
mres.responses.forEach((m) => {
    if ('hits' in m) {
        console.log(m.status)
    } else if ('error' in m) {
        console.log(m.error.root_cause[0].reason)
    }
})

Indices

const indices = await client.indices.getAll({
    queryParams: {
        health: 'yellow'
    }
})

const indice = await client.indices.get({
    target: 'test-index',
    queryParams: {}
})

await client.indices.create({
    index: 'test-index',
    body: {},
    queryParams: {}
})

await client.indices.delete({
    index: 'test-index',
    queryParams: {}
})

const exists = await client.indices.exists({
    target: 'test-index',
    queryParams: {}
})

await client.indices.close({
    index: 'test-index',
    queryParams: {}
})

await client.indices.open({
    target: 'test-index',
    queryParams: {}
})

const settings = await client.indices.settings({
    target: 'test-index',
    setting: '',
    queryParams: {}
})

Documents

const doc = await client.documents.get<Source>({
    index: 'test-index',
    _id: '1',
    queryParams: {}
})

const docs = await client.documents.mget<Source>({
    // index: 'test-index',
    body: {
        docs: [
            {
                _id: '1',
                _index: 'test-index'
            },
            {
                _id: '2',
                _index: 'test-index'
            }
        ]
    },
    queryParams: {}
})

await client.documents.index({
    target: 'test-index',
    _id: '1',
    body: { title: 'Node' },
    queryParams: {}
})

await client.documents.upsert({
    target: 'test-index',
    _id: '1',
    body: { title: 'Deno' },
    queryParams: {}
})

await client.documents.delete({
    index: 'test-index',
    _id: '1',
    queryParams: {}
})

await client.documents.bulk({
    // target: 'test-index',
    body: [
        { index: { _index: 'test-index2', _id: '2', } },
        { title: 'Node is great' },
        { index: { _index: 'test-index2', _id: '3', } },
        { title: 'Deno is also great' },
        { update: { _id: '3', _index: "test-index2" } },
        { doc: { title: 'Deno is much better than node' } }
    ],
    queryParams: {}
})

const exists = await client.documents.exists({
    index: 'test-index',
    _id: '1',
    queryParams: {}
})