|
| 1 | +"""Mappeos de entidades para Elasticsearch |
| 2 | +""" |
| 3 | + |
| 4 | +import copy |
| 5 | + |
1 | 6 | from .elasticsearch_params import LOWCASE_ASCII_NORMALIZER
|
2 | 7 | from .elasticsearch_params import NAME_ANALYZER
|
3 | 8 | from .elasticsearch_params import NAME_ANALYZER_SYNONYMS
|
4 | 9 |
|
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 | + |
10 | 42 |
|
11 | 43 | MAP_STATE = {
|
12 | 44 | '_doc': {
|
13 |
| - '_source': { |
14 |
| - 'excludes': ['geometria'] |
15 |
| - }, |
16 | 45 | 'properties': {
|
17 | 46 | 'id': {'type': 'keyword'},
|
18 | 47 | 'nombre': {
|
|
26 | 55 | }
|
27 | 56 | }
|
28 | 57 | },
|
29 |
| - 'geometria': {'type': 'geo_shape'}, |
30 | 58 | 'centroide': {
|
31 | 59 | 'type': 'object',
|
32 | 60 | 'dynamic': 'strict',
|
|
39 | 67 | }
|
40 | 68 | }
|
41 | 69 |
|
| 70 | +MAP_STATE_GEOM = with_geom(MAP_STATE) |
| 71 | + |
42 | 72 | MAP_DEPT = {
|
43 | 73 | '_doc': {
|
44 |
| - '_source': { |
45 |
| - 'excludes': ['geometria'] |
46 |
| - }, |
47 | 74 | 'properties': {
|
48 | 75 | 'id': {'type': 'keyword'},
|
49 | 76 | 'nombre': {
|
|
65 | 92 | 'lon': {'type': 'float', 'index': False}
|
66 | 93 | }
|
67 | 94 | },
|
68 |
| - 'geometria': {'type': 'geo_shape'}, |
69 | 95 | 'provincia': {
|
70 | 96 | 'type': 'object',
|
71 | 97 | 'dynamic': 'strict',
|
|
88 | 114 | }
|
89 | 115 | }
|
90 | 116 |
|
| 117 | +MAP_DEPT_GEOM = with_geom(MAP_DEPT) |
| 118 | + |
91 | 119 | MAP_MUNI = {
|
92 | 120 | '_doc': {
|
93 |
| - '_source': { |
94 |
| - 'excludes': ['geometria'] |
95 |
| - }, |
96 | 121 | 'properties': {
|
97 | 122 | 'id': {'type': 'keyword'},
|
98 | 123 | 'nombre': {
|
|
106 | 131 | }
|
107 | 132 | }
|
108 | 133 | },
|
109 |
| - 'geometria': {'type': 'geo_shape'}, |
110 | 134 | 'centroide': {
|
111 | 135 | 'type': 'object',
|
112 | 136 | 'dynamic': 'strict',
|
|
137 | 161 | }
|
138 | 162 | }
|
139 | 163 |
|
| 164 | +MAP_MUNI_GEOM = with_geom(MAP_MUNI) |
| 165 | + |
140 | 166 | MAP_LOCALITY = {
|
141 | 167 | '_doc': {
|
142 |
| - '_source': { |
143 |
| - 'excludes': ['geometria'] |
144 |
| - }, |
145 | 168 | 'properties': {
|
146 | 169 | 'id': {'type': 'keyword'},
|
147 | 170 | 'nombre': {
|
|
156 | 179 | }
|
157 | 180 | },
|
158 | 181 | 'tipo': {'type': 'keyword'},
|
159 |
| - 'geometria': {'type': 'geo_shape'}, |
160 | 182 | 'centroide': {
|
161 | 183 | 'type': 'object',
|
162 | 184 | 'dynamic': 'strict',
|
|
0 commit comments