2016-09-20 98 views
1

我需要创建一个过滤器,它将取走我所有的相机并过滤掉与“蓝图”相关联的相机。这是位于我的相机在MongoDB的属性。我想过滤掉没有类型"BluePrint"的相机。ElasticSearch查询过滤掉某些相机

我相信我需要修复的部分是方法getAllCameras中的query部分。

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); 
     } 
    }); 
}; 

回答

0

一些研究elasticsearch这之后是我想出了解决方案:

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); 
     } 
    }); 
};