elasticsearch elasticsearch scroll API的rxjs流生成空结果集
我的目标是将
elasticsearch elasticsearch scroll API的rxjs流生成空结果集,
elasticsearch,rxjs,
elasticsearch,Rxjs,我的目标是将elasticsearch结果转换为rxjs流,并考虑使用scrollAPI在每次调用时获取1个数据点。但是,对于第二个弹性查询(searchElastic),我的rxjs流似乎没有返回任何结果 下面是我的代码示例: import * as Rx from 'rxjs'; import {elasticClient} from '../Helpers.ts'; function searchElastic({query, sort}) { const body: any =
elasticsearch
结果转换为rxjs
流,并考虑使用scroll
API在每次调用时获取1个数据点。但是,对于第二个弹性查询(searchElastic
),我的rxjs
流似乎没有返回任何结果
下面是我的代码示例:
import * as Rx from 'rxjs';
import {elasticClient} from '../Helpers.ts';
function searchElastic({query, sort}) {
const body: any = {
size: 1,
query,
_source: { excludes: ['logbookType', 'editable', 'availabilityTag'] },
sort
};
// keep the search results "scrollable" for 30 secs
const scroll = '30s';
return Rx.Observable
.fromPromise(elasticClient.search({ index: 'data', body, scroll }))
.concatMap(({_scroll_id, hits: {hits}}) => {
const subject = new Rx.Subject();
if(hits.length) {
// initial data
subject.onNext(hits[0]._source as ElasticDoc);
console.log(hits[0]._id);
const handleDoc = (err, res) => {
if(err) {
subject.onError(err);
return;
}
const {_scroll_id, hits: {hits}} = res;
if(!hits.length) {
subject.onCompleted();
} else {
subject.onNext(hits[0]._source as ElasticDoc);
console.log(hits[0]._id);
setImmediate(() =>
elasticClient.scroll({scroll, scrollId: _scroll_id},
handleDoc));
}
};
setImmediate(() =>
elasticClient.scroll({scroll, scrollId: _scroll_id},
handleDoc));
} else {
subject.onCompleted();
}
return subject.asObservable();
});
}
function getEntries() {
const entriesQuery = {
query: {
filtered: {
filter: {
bool: {
must: [{
range: {
creationTimestamp: {
gte: "2018-04-01T07:55:59.915Z",
lte: "2018-04-01T07:57:08.915Z"
}
}
}, {
query: {
query_string: {
query: "+type:*scan*"
}
}
}]
}
}
}
},
sort: [{
creationTimestamp: {
order: "asc"
},
id: {
order: "asc"
}
}]
};
return searchElastic(entriesQuery)
.concatMap(entry => {
// all entries are logged correctly
console.log(entry.id);
// array that contains MongoDB _ids as strings
const ancestors = entry.ancestors || [];
// if no parents => doesn't match
if(!ancestors.length) {
return Rx.Observable.empty();
}
const parentsQuery = {
query: {
filtered: {
filter: {
bool: {
must: [{
range: {
creationTimestamp: {
gte: "2018-04-01T07:55:59.915Z",
lte: "2018-04-01T07:57:08.915Z"
}
}
}, {
query: {
query_string: {
query: "+type:*block* +name:*Report*"
}
}
}]
}
}
}
},
sort: [{
creationTimestamp: {
order: "asc"
},
id: {
order: "asc"
}
}]
};
parentsQuery.query.filtered.filter.bool.must.push({
terms: {
id: ancestors
}
});
// fetch parent entries
return searchElastic(parentsQuery)
.count()
.concatMap(count => {
// count is always 0 even though entries are logged
// in the searchElastic console.logs
console.log(entry.id, count);
return Rx.Observable.just(entry);
});
});
}
function executeQuery() {
try {
getEntries()
.subscribe(
(x) => console.log(x.id),
err => console.error(err),
() => {}
)
} catch(e) {
console.error(e);
}
}
看起来这是一个rxjs
问题,因为所有祖先条目都会被记录,但count
始终返回0
另外,使用
elasticsearch
v1.7在与受试者玩了一对rxjs
示例后,似乎在观察者订阅之前,受试者已经完成了(onCompleted
)
工作示例
var subject=new Rx.subject();
var subscription=subject.subscripte(
功能(x){
console.log('onNext:'+x);
},
职能(e){
console.log('onError:'+e.message);
},
函数(){
console.log('onCompleted');
});
主题.onNext(1);
//=>onNext:1
主题.onNext(2);
//=>onNext:2
subject.onCompleted();
//=>未完成
JS-Bin