Elasticsearch Client for Deno Runtime
Getting Started
Connect
import { Client as ElasticsearchClient } from 'https://deno.land/x/elasticsearch@v8.2.0/mod.ts'
const client = new ElasticsearchClient({
node: 'http://localhost:9200',
/*
auth: {
username: 'elastic',
password: 'password'
}
*/
})
Search APIs
import type { SearchResponse } from 'https://deno.land/x/elasticsearch@v8.2.0/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)
}
})
SQL Search API
import type { SqlSearchResponse } from 'https://deno.land/x/elasticsearch@v8.2.0/mod.ts'
const res: SqlSearchResponse = await client.sql.search({
body: {
query: "SELECT * FROM test_index"
},
queryParams: {}
})
res.rows.forEach((row) => {
console.log(row)
})
const resAsync = await client.sql.getAsyncSearch({
searchId: 'FjdMX1JpMUFOVGVpOHJfUmJtcXdnLXcbZjBQdkR2bUNTUkNRdmR2Z0NJSWdIQToxMzgx',
queryParams: {}
})
Cluster APIs
const health = await client.cluster.health({
target: '',
queryParams: {}
})
const settings = await client.cluster.settings({
queryParams: {}
})
Cat APIs
const indices = await client.cat.indices({
target: '*',
queryParams: {}
})
const aliases = await client.cat.aliases({
alias: '*',
queryParams: {}
})
const count = await client.cat.count({
target: '*',
queryParams: {}
})
const allocation = await client.cat.allocation({
nodeId: '*',
queryParams: {}
})
const fielddata = await client.cat.fielddata({
field: '*',
queryParams: {}
})
Index APIs
const indices = await client.indices.get({
target: '*',
queryParams: {}
})
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: {}
})
await client.indices.clone({
index: 'test-index',
targetIndex: 'cloned-test-index',
body: {},
queryParams: {}
})
await client.indices.refresh({
target: 'test-index',
queryParams: {}
})
Document APIs
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-index', _id: '2', } },
{ title: 'Node is great' },
{ index: { _index: 'test-index', _id: '3', } },
{ title: 'Deno is also great' },
{ update: { _id: '3', _index: "test-index" } },
{ doc: { title: 'Deno is much better than node' } }
],
queryParams: {}
})
const exists = await client.documents.exists({
index: 'test-index',
_id: '1',
queryParams: {}
})
Notes
If you get a promise to an error responses, wrap your code within try catch:
error: Uncaught (in promise) #<Object>
Docker
Start an Elasticsearch 8 Container
docker run -p 9200:9200 --name deno-elasticsearch -e "discovery.type=single-node" -d -it docker.elastic.co/elasticsearch/elasticsearch:8.2.0
Reset the password for elastic
user
docker exec -it deno-elasticsearch /usr/share/elasticsearch/bin/elasticsearch-reset-password -u elastic
Copy the Security Certificate from Docker Container to Your Local Machine
docker cp deno-elasticsearch:/usr/share/elasticsearch/config/certs/http_ca.crt .
Run Application with Certificate (remember to connect client with auth object)
deno run --allow-net --cert http_ca.crt app.ts
Tests
Don’t forget to change password for elastic user in
tests/deps.ts
deno test tests --allow-net --cert http_ca.crt