ElasticSearch查询过滤掉某些相机

时间:2016-09-20 18:51:08

标签: javascript jquery mongodb elasticsearch

我需要创建一个过滤器,它将占用我的所有相机并过滤掉与“蓝图”相关联的相机。它位于MongoDB中我的相机的属性中。我想过滤掉没有"BluePrint"类型的相机。

我认为我需要解决的部分是方法query中的getAllCameras部分。

self.evaluateCameras = function() {
    self.getAllCameras(function(err, cameras) {
        if(err) {
            console.log(err);
        }
        else {
            // -- publish newly included cameras
            cameras.forEach(function(camera) {
                if(self.includedCameras[camera._id] == undefined) {
                    camera._source.entityId = camera._id;
                    camera._source.systemType = camera._type;
                    self.publish(camera._source, "create")
                    // -- to scale this need to do caching in Redis shared cache across processes
                    self.includedCameras[camera._id] = camera;
                }
            });
        }

        // process any messages received while initializing stream
        self.initComplete = true;
        for(var j = 0; j < self.tempMessageCache.length; j++) {
            var cacheMsg = self.tempMessageCache[j];
            self.evalPublish(cacheMsg);
        }
        self.tempMessageCache = [];

    });
};

self.getAllCameras = function(callback) {
    self.q = {
        "from": 0,
        "size": 10000, // -- todo: implement some kind of paging
        "sort": [
            {'properties.name': 'asc'},
            {'properties.cameraId': 'asc'}
        ],
        "query": {
            "filtered": {
                "query": {
                    "match_all": {}
                },
                "filter": {
                    "and": [
                        {
                            "exists": {"field": "properties.geoRef"}
                        },
                        {
                            "geo_shape": {
                                "properties.geoRef": {
                                    "shape": {
                                        "coordinates": properties.geoRef.coordinates,
                                        "type": "point"
                                    }
                                }
                            }
                        }
                    ]
                }
            }
        }
    };
    elasticClient.search({
        index: 'myproject-now',
        type: 'system.camera',
        body: self.q
    }, function (err, response) {
        if (err)
            callback(err, null);
        else {
            callback(null, response.hits.hits);
        }
    });
};

1 个答案:

答案 0 :(得分:0)

经过对弹性搜索的一些研究后,这就是我提出的解决方案:

self.getAllCameras = function(callback) {
    self.q = {
        "from": 0,
        "size": 10000, // -- todo: implement some kind of paging
        "sort": [
            {'properties.name': 'asc'},
            {'properties.cameraId': 'asc'}
        ],
        "query": {
            "filtered": {
                "query": {
                    "match_all": {}
                },
                "filter": {
                    "and": [
                        {
                            "exists": {"field": "properties.geoRef"}
                        },
                        {
                            "not": {
                                "term": {
                                    "properties.geoRef.type" : "floorplan"
                                }
                            }
                        }
                    ]
                }
            }
        }
    };
    elasticClient.search({
        index: 'myproject-now',
        type: 'system.camera',
        body: self.q
    }, function (err, response) {
        if (err)
            callback(err, null);
        else {
            callback(null, response.hits.hits);
        }
    });
};