typescript的封装
es有官方的js api, 但是官方的body构造比较复杂, github上有第三方的bodybuilder组件专门用来构造DSL的查询部分
比如:
/*
-> POST http://localhost:9200/*scanstatistics* /_count
{
"query": {
"bool": {
"must": [
{
"match": {
"systemID": "987654321098"
}
},
{
"range": {
"timeStamp": {
"gte": "now/M"
}
}
}
]
}
}
}
<- 200
{
"count": 30,
"_shards": {
"total": 15,
"successful": 15,
"skipped": 0,
"failed": 0
}
}
*/
getScanCount2(systemID: string, dateRange: any, indices: any = '*scanstatistics*'): Observable<SearchResponse<{}>> {
const body = bodybuilder()
.addQuery('match', 'systemID', systemID)
.addQuery('range', 'timeStamp', dateRange)
.build();
return fromPromise(<Promise<SearchResponse<{}>>>
this._client.count({ index: indices, body: body, method: 'POST' })
);
}
说明:
-
es的js api可以调试构造的消息和返回的消息详细信息, 具体是在构造es 的client时指定log: 'trace'
-
可以用ping来判断es的service的状态是否正常工作, 可以指定requestTimeout为Infinity
-
es的js api有search方法, 用来从es中查询过滤数据, 具体可以指定es的index、http方法、请求的body、filterPath等。filterPath用来指定返回的结果的元素节点。
-
body中可以指定返回的数量size、排序sort、分类aggregation、以及基本的查询query等
-
分类aggregation中可以指定以什么分类, 以及分类中的值如何统计, 比如是平均avg、求和sum等。普通类用'terms'; 时间分类用'date_histogram',并可以指定时间间隔interval、时间格式format
-
es的js api默认的接口都是返回promise, 可以通过rxjs转为Observable
import { Observable } from 'rxjs/rx';
import { fromPromise } from 'rxjs/observable/fromPromise';
import { Client, SearchResponse } from 'elasticsearch';
//返回值用
Observable<SearchResponse<{}>> 包装
//通过