示例#1
0
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
示例#2
0
 def __init__(self, query):
     super().__init__(es_config.geom_index_for(N.MUNICIPALITIES), query)
示例#3
0
 def __init__(self, query):
     super().__init__(es_config.geom_index_for(N.DEPARTMENTS), query)
示例#4
0
 def __init__(self, query):
     super().__init__(es_config.geom_index_for(N.STATES), query)