Skip to content

Commit 8950bef

Browse files
committed
Crea mappeos de índices con geometrías basados en los
originales. [force reindex]
1 parent 00c02e0 commit 8950bef

File tree

6 files changed

+135
-53
lines changed

6 files changed

+135
-53
lines changed

deploy/travis.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#!/bin/bash
22
# script de deploy TravisCI para georef-ar-api
33

4-
readonly reindex_regex="\[force_reindex\]"
4+
readonly reindex_regex="\[force reindex\]"
55

66
echo "- Iniciando el script de deploy para georef-ar-api..."
77

docs/src/georef-api-development.md

+8
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,11 @@ Cualquiera de las dos opciones también permite indexar datos selectivamente: se
165165
Los nombres de los índices disponibles son:
166166

167167
- `provincias`
168+
- `provincias-geometria`
168169
- `departamentos`
170+
- `departamentos-geometria`
169171
- `municipios`
172+
- `municipios-geometria`
170173
- `localidades`
171174
- `calles`
172175

@@ -177,6 +180,11 @@ Correr la API de Georef utilizando un servidor de prueba (no apto para producci
177180
(venv) $ make start_dev_server
178181
```
179182

183+
O También:
184+
```bash
185+
(venv) $ make start_gunicorn_dev_server
186+
```
187+
180188
#### Entornos productivos
181189
##### 7.1 Configurar servicio `georef-api` para `systemd`
182190
Copiar el archivo [`config/georef-api.service`](https://github.com/datosgobar/georef-ar-api/blob/master/config/georef-api.service) a `/etc/systemd/system/` y configurarlo. Notar los campos marcados entre '`<`' y '`>`', que deben ser reemplazados por el usuario.

service/data.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ def search_places(es, index, params_list):
234234
searches = [ElasticsearchSearch(build_place_search(**params))
235235
for params in params_list]
236236

237-
ElasticsearchSearch.run_searches(es, index, searches)
237+
ElasticsearchSearch.run_searches(es, N.GEOM_INDEX.format(index), searches)
238238
return [search.result for search in searches]
239239

240240

service/management/elasticsearch_mappings.py

+43-21
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,47 @@
1+
"""Mappeos de entidades para Elasticsearch
2+
"""
3+
4+
import copy
5+
16
from .elasticsearch_params import LOWCASE_ASCII_NORMALIZER
27
from .elasticsearch_params import NAME_ANALYZER
38
from .elasticsearch_params import NAME_ANALYZER_SYNONYMS
49

5-
# Mapeos de entidades para Elasticsearch
6-
# El excluimiento del campo 'geometria' en _source se debe a que las geometrías
7-
# tienden a aumentar significativamente el tamaño de los documentos, por lo que
8-
# la performance de la búsqueda por id/texto/etc se ve disminuida.
9-
# https://www.elastic.co/guide/en/elasticsearch/reference/current/general-recommendations.html#maximum-document-size
10+
11+
def with_geom(original):
12+
"""Dado un mappeo de una entidad, crea una copia con un campo 'geometria'
13+
agregado.
14+
15+
Por cada entidad geográfica con geometría, se crean dos mappeos: uno sin
16+
geometría y otro con. Esto se debe a que las geometría aumentan
17+
significativamente el tamaño de los documentos, lo cual hace que la
18+
performance de búsqueda por nombre/id/etc. se vea disminuida (incluso si no
19+
se incluye la geometría en los resultados). Una forma de evitar este
20+
problema es indexar las geometrías, pero no incluirlas en los documentos
21+
almacenados (utilizando _source 'excludes'). El problema de esta solución
22+
es que no permite utilizar queries como GeoShape con los datos indexados,
23+
ya que las geometrías originales se perdieron.
24+
25+
Para más información, ver:
26+
https://www.elastic.co/guide/en/elasticsearch/reference/current/general-recommendations.html#maximum-document-size
27+
28+
Args:
29+
original (dict): Mappeo Elasticsearch de una entidad.
30+
31+
Returns:
32+
dict: Mappeo basado en el original, con campo 'geometria' adicional.
33+
34+
"""
35+
mapping = copy.deepcopy(original)
36+
mapping['_doc']['properties']['geometria'] = {
37+
'type': 'geo_shape'
38+
}
39+
40+
return mapping
41+
1042

1143
MAP_STATE = {
1244
'_doc': {
13-
'_source': {
14-
'excludes': ['geometria']
15-
},
1645
'properties': {
1746
'id': {'type': 'keyword'},
1847
'nombre': {
@@ -26,7 +55,6 @@
2655
}
2756
}
2857
},
29-
'geometria': {'type': 'geo_shape'},
3058
'centroide': {
3159
'type': 'object',
3260
'dynamic': 'strict',
@@ -39,11 +67,10 @@
3967
}
4068
}
4169

70+
MAP_STATE_GEOM = with_geom(MAP_STATE)
71+
4272
MAP_DEPT = {
4373
'_doc': {
44-
'_source': {
45-
'excludes': ['geometria']
46-
},
4774
'properties': {
4875
'id': {'type': 'keyword'},
4976
'nombre': {
@@ -65,7 +92,6 @@
6592
'lon': {'type': 'float', 'index': False}
6693
}
6794
},
68-
'geometria': {'type': 'geo_shape'},
6995
'provincia': {
7096
'type': 'object',
7197
'dynamic': 'strict',
@@ -88,11 +114,10 @@
88114
}
89115
}
90116

117+
MAP_DEPT_GEOM = with_geom(MAP_DEPT)
118+
91119
MAP_MUNI = {
92120
'_doc': {
93-
'_source': {
94-
'excludes': ['geometria']
95-
},
96121
'properties': {
97122
'id': {'type': 'keyword'},
98123
'nombre': {
@@ -106,7 +131,6 @@
106131
}
107132
}
108133
},
109-
'geometria': {'type': 'geo_shape'},
110134
'centroide': {
111135
'type': 'object',
112136
'dynamic': 'strict',
@@ -137,11 +161,10 @@
137161
}
138162
}
139163

164+
MAP_MUNI_GEOM = with_geom(MAP_MUNI)
165+
140166
MAP_LOCALITY = {
141167
'_doc': {
142-
'_source': {
143-
'excludes': ['geometria']
144-
},
145168
'properties': {
146169
'id': {'type': 'keyword'},
147170
'nombre': {
@@ -156,7 +179,6 @@
156179
}
157180
},
158181
'tipo': {'type': 'keyword'},
159-
'geometria': {'type': 'geo_shape'},
160182
'centroide': {
161183
'type': 'object',
162184
'dynamic': 'strict',

0 commit comments

Comments
 (0)