elasticsearch elasticsearch scroll API的rxjs流生成空结果集,elasticsearch,rxjs,elasticsearch,Rxjs" /> elasticsearch elasticsearch scroll API的rxjs流生成空结果集,elasticsearch,rxjs,elasticsearch,Rxjs" />

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