3.5.19.2.Elasticsearch语言开发(Node.js)
创作人:姜康
审稿人:亢伟楠
简介
本节介绍如何使用 JavaScript(Node.js) 操作 Elasticsearch(简称 ES ),将从以下几个方面进行阐述:
l 客户端介绍
l 配置及初始化
l 常见 API 使用
l 完整示例
一、客户端功能介绍
Elasticsearch 官方提供了 Node.js 的客户端 @elastic/elasticsearch,目的是为了给使用
JavaScript 代码操作 ES 提供统一、可扩展的编程接口。
官方提供的 Node.js 客户端的功能也非常完善:
l 与 REST API 一一对应
l 通用、可插拔的架构
l 可配置、自动发现集群节点
l 持久保持活动的连接
l 跨所有节点进行负载均衡
l child client 支持
l 开箱即用的 Typescript 支持
需要注意的是,从 ES v7 版本以后,官方提供了一些较大功能变更,因而用户在使用新版本客户端的时候,要关注如下几点:
l 调整了 node.js 的版本支持,ES v7.11 最低支持 Node.js v8.x,ES v7.12 最低支持 Node.js v10.x
l 不再支持 browser
l 重构了代码,使用 ts 重写,加强对类型的支持
l 调整了接口调用的返回值的形式(具体讲解见下一节)
l 废弃了请求参数中的 body 参数
l type 被正式废弃
二、代码语法介绍
Node.js 客户端提供了 callback API 与 promise API 两种写法:
l Callback 写法
client.search({ index: 'my-index', body: { query: { match: { hello: 'world' } } } }, (err, result) => { if (err) console.log(err) }) // 此外需要注意的是 body 参数已经被废弃,并将在 ES V8 中被删除,因而在以后版本中,代码更推荐写为: client.search({ index: 'my-index', query: { match: { hello: 'world' } } }, (err, result) => { if (err) console.log(err) }) // Promise API 也应如此
l Promise 写法
const result = await client.search({ index: 'my-index', body: { query: { match: { hello: 'world' } } } })
在上一节中提到的调用接口返回格式的改变,参考 @elastic-transport-js 库中的代码注释(官方文档还未明确提示):
/** * Warning: If you set meta to true the result will no longer be * the response body, but an object containing the body, statusCode, * headers and meta keys. * You can use the destructuring assignment to update your code without * refactoring the entire code base: * From: * ``` * const result = await client.method(params) * ``` * To: * ``` * const { * body: result, * statusCode, * headers, * meta * } = await client.method(params, { meta: true }) * ``` */
以 Promise API 举例,新的语法规则下的代码可以写为:
const { body, result, statusCode, headers, meta } = await client.search( { index: 'my-index', query: { match: { hello: 'world' }, }, }, { meta: true } );
此外,因为新版客户端使用了 Typescript 重写,因而也提供了更为良好的 Typescript 语法支持。
Typescript 类型的集成方式相较之前版本也更为简洁:
// 之前版本的类型使用 const response = await client.search<SearchResponse<Source>, SearchBody>({ index: 'test', body: {query: { match: { foo: 'bar' } } } }) // 新版本的类型使用 const response = await client.search<Source>({ index: 'test', body: { query: { match: { foo: 'bar' } } } })
《Elastic Stack 实战手册》——三、产品能力——3.5 进阶篇——3.5.19.Elasticsearch语言开发(Python/Nodejs/Java)——3.5.19.2.Elasticsearch语言开发(Node.js)(中) https://developer.aliyun.com/article/1226589