def _build_geo_indexed_shape_query(field, index, entity_id, entity_geom_path, relation): """Crea una condición de búsqueda por relación geométrica con una geometría pre-indexada. La geometría debe pertenecer a una entidad de tipo provincia, departamento o municipio. Args: field (str): Campo de la condición. index (str): Índice donde está almacenada la geometría pre-indexada. entity_id (str): ID del documento con la geometría a utilizar. entity_geom_path (str): Campo del documento donde se encuentra la geometría. relation (str): Tipo de búsqueda por geometrías a realizar. Ver la documentación de Elasticsearch GeoShape Query para más detalles. Returns: Query: Condición para Elasticsearch. """ if index not in INTERSECTION_PARAM_TYPES: raise ValueError('Invalid entity type') options = { 'indexed_shape': { 'index': es_config.geom_index_for(index), 'type': es_config.DOC_TYPE, 'id': entity_id, 'path': entity_geom_path }, 'relation': relation } # Debido a la forma en la que Elasticsearch indexa geometrías, es posible # obtener falsos positivos en las búsquedas por intersección de geometrías. # Una forma simple de resolver este problema es agregar un filtro Prefix # adicional, que remueva todos los resultados que no pertenezcan a la misma # provincia que la entidad con ID == entity_id, ya que dos geometrías de # provincias distintas nunca pueden tener una intersección (sin importar el # tipo de entidad). prefix_query = Prefix(**{N.ID: entity_id[:constants.STATE_ID_LEN]}) # En caso de estar buscando entidades en un índice utilizando geometrías de # entidades en el mismo índice, asegurarse de que los resultados no traigan # la entidad que utilizamos como geometría (el dato de que una geometría # intersecciona con si misma no es útil). exclude_self_query = ~_build_terms_query(N.ID, [entity_id]) return GeoShape(**{field: options}) & prefix_query & exclude_self_query
def __init__(self, query): super().__init__(es_config.geom_index_for(N.MUNICIPALITIES), query)
def __init__(self, query): super().__init__(es_config.geom_index_for(N.DEPARTMENTS), query)
def __init__(self, query): super().__init__(es_config.geom_index_for(N.STATES), query)