def search_records(request): """Search model records.""" model_id = request.matchdict['model_id'] try: request.db.get_model_definition(model_id) except ModelNotFound: request.response.status = "404 Not Found" return {"msg": "%s: model not found" % model_id} # So far we just support query from body query = request.body # Parameters can come from query string params = request.GET # In case request body arrives as bytes under python 3 if isinstance(query, six.binary_type): query = query.decode('utf-8') try: results = request.index.search(model_id, query, params=params) return results except Exception as e: logger.error(e) request.response.status = "502 Bad Gateway" return {"msg": "Could not obtain response from indexing service"}
def on_model_updated(self, event): logger.debug("Update mapping of model '%s'" % event.model_id) try: self.client.indices.delete_mapping(index=self.prefix( event.model_id), doc_type=event.model_id) except ElasticsearchException as e: logger.error(e) definition = event.request.db.get_model_definition(event.model_id) self.__put_mapping(event.model_id, definition)
def on_record_deleted(self, event): logger.debug("Unindex record %s of model '%s'" % (event.record_id, event.model_id)) try: self.client.delete(index=self.prefix(event.model_id), doc_type=event.model_id, id=event.record_id, refresh=True) except ElasticsearchException as e: logger.error(e)
def delete_indices(self): logger.debug("Drop the index on database deleted event.") try: fullnames = self.client.cat.indices().split('\n')[:-1] indices = [x.split()[1] for x in fullnames] prefixed_indices = [indice for indice in indices if indice.startswith(self.prefix(''))] if len(prefixed_indices) > 0: self.client.indices.delete(index=','.join(prefixed_indices)) except ElasticsearchException as e: logger.error(e)
def on_model_updated(self, event): logger.debug("Update mapping of model '%s'" % event.model_id) try: self.client.indices.delete_mapping( index=self.prefix(event.model_id), doc_type=event.model_id ) except ElasticsearchException as e: logger.error(e) definition = event.request.db.get_model_definition(event.model_id) self.__put_mapping(event.model_id, definition)
def on_model_created(self, event): indexname = self.prefix(event.model_id) try: if not self.client.indices.exists(index=indexname): logger.debug("Create index for model '%s'" % event.model_id) self.client.indices.create(index=self.prefix(event.model_id)) except ElasticsearchException as e: logger.error(e) logger.debug("Create mapping for model '%s'" % event.model_id) definition = event.request.db.get_model_definition(event.model_id) self.__put_mapping(event.model_id, definition)
def __put_mapping(self, model_id, definition): """ Transforms the model definition into an Elasticsearch mapping, and associate to its index. """ mapping_definition = self._definition_as_mapping(definition) try: mapping = self.client.indices.put_mapping( index=self.prefix(model_id), doc_type=model_id, body=mapping_definition) return mapping except ElasticsearchException as e: logger.error(e)
def search(self, model_id, query, params): supported_params = ['sort', 'from', 'source', 'fields', 'size'] params = dict([p for p in params.items() if p[0] in supported_params]) try: return self.client.search(index=self.prefix(model_id), doc_type=model_id, body=query, **params) except RequestError as e: raise SearchError(*e.args) except ElasticsearchException as e: logger.error(e) # big fail raise
def delete_indices(self): logger.debug("Drop the index on database deleted event.") try: fullnames = self.client.cat.indices().split('\n')[:-1] indices = [x.split()[1] for x in fullnames] prefixed_indices = [ indice for indice in indices if indice.startswith(self.prefix('')) ] if len(prefixed_indices) > 0: self.client.indices.delete(index=','.join(prefixed_indices)) except ElasticsearchException as e: logger.error(e)
def __put_mapping(self, model_id, definition): """ Transforms the model definition into an Elasticsearch mapping, and associate to its index. """ mapping_definition = self._definition_as_mapping(definition) try: mapping = self.client.indices.put_mapping( index=self.prefix(model_id), doc_type=model_id, body=mapping_definition ) return mapping except ElasticsearchException as e: logger.error(e)
def __index(self, model_id, definition, record_id, record): """ Transforms the record to an ElasticSearch record compatible with the mapping built from its model definition. """ mapping_record = self._record_as_mapping(definition, record) try: index = self.client.index(index=self.prefix(model_id), doc_type=model_id, id=record_id, body=mapping_record, refresh=True) return index except ElasticsearchException as e: logger.error(e)
def on_model_deleted(self, event): logger.debug("Delete index of model '%s'" % event.model_id) try: self.client.indices.delete(index=self.prefix(event.model_id)) except ElasticsearchException as e: logger.error(e)