Git Cookbook, diferencias entre el directorio de trabajo la staging area y el repositorio local

Git

Como sabemos cada vez que hacemos una modificación de un fichero y lo damos por bueno, lo siguiente que hacemos es presentarlo a la staging area. Finalmente cuando terminamos con todas las modificaciones lo subiremos al repositorio local realizando un commit.

Vamos a ver el uso del comando git diff para ver los cambios de 1 fichero en cada una de estas fases.

git diff, muestra los cambios realizados en nuestro directorio de trabajo y que todavía no han sido presentados en la staging area.

git diff –cached, muestra los cambios presentados en la staging area y que todavía no hemos realizado el commit en nuestro repositorio local.

git diff HEAD, muestra los cambios realizados en nuestro directorio de trabajo con respecto al repositorio local.

Ejemplo

En el siguiente ejemplo vamos a ver el comportamiento y la salida de cada uno de estos comandos.

Sigue leyendo

Anuncios

Git Cookbook, diferencias entre ficheros del repositorio local y remoto

Git

Una vez hemos hecho cambios en nuestro working directory, los pasamos a la staging area y finalmente hacemos el commit en nuestro repositorio local. Como paso final mandaremos los cambios locales de nuestro repositorio local al repositorio remoto.

En este punto a veces nos interesa saber los cambios que hemos realizado de alguno de nuestros ficheros o de todos ellos con respecto a la versión que tenemos en el repositorio remoto. El comando que hace esto es el siguiente.

Ver todas las diferencias entre el repositorio local y el repositorio remoto

$ git diff origin/master

Ver todas la diferencia de un fichero entre el repositorio local y el repositorio remoto

$ git diff origin/master:PATH_TO_FILE_REMOTE PATH_TO_FILE_LOCAL
$ git diff origin/master README.md
$ git diff origin/master:README.md README.md

elasticsearch Cookbook, error ElasticsearchIllegalArgumentException, Can’t update non dynamic settings … for open indices

Elasticsearch

Este error se produce en ciertas ocasiones cuando intentamos modificar la configuración o settings de un índice. ElasticsearchIllegalArgumentException es una excepción genérica por lo que para entender el problema tenemos que fijarnos en la descripción que le acompaña. En este caso el error es bastante descriptivo y claro, no podemos modificar la configuración de este índice al estar abierto.

{
   "error": "ElasticsearchIllegalArgumentException
   [
        Can't update non dynamic settings
        [
            [
            index.analysis.filter.stemmer_por_defecto.type, 
            index.analysis.analyzer.sin_acentos.filter.2, 
            index.analysis.analyzer.sin_acentos.filter.1, 
            index.analysis.analyzer.sin_acentos.tokenizer, 
            index.analysis.analyzer.sin_acentos.filter.0, 
            index.analysis.filter.stemmer_por_defecto.name
            ]
        ] 
        for open indices [[mi_indice]]
    ]",
   "status": 400
}

¿Que podemos hacer en estos casos?

La solución es sencilla

  • tenemos que cerrar el índice
  • aplicar los cambios de configuración
  • volver a abrir el índice

En este caso la modificación consiste en añadir un nuevo analizador, y este tipo de cambios de configuración nos obliga a cerrar previamente el índice. Sin embargo, otros cambios de configuración no implica que tengamos que cerrar el índice.

Cerrar un índice

curl -XPOST 'http://localhost:9200/mi_indice/_close'

Abrir el índice

curl -XPOST 'http://localhost:9200/mi_indice/_open'

Aplicamos los cambios de configuración, en este caso añadimos un nuevo analizador

curl -XPUT 'http://localhost:9200/mi_indice/_settings' -d '{
  "analysis" : {
    "analyzer":{
      "sin_acentos": {
          "tokenizer": "standard",
          "filter":  [ "lowercase", "asciifolding", "stemmer_por_defecto" ]
      }
    }, 
    "filter" : {
        "stemmer_por_defecto" : {
            "type" : "stemmer",
            "name" : "spanish"
        }
    }
  }
}'

elasticsearch Cookbook, ver los términos generados por un analizador

Elasticsearch

Es muchas ocasiones es útil saber qué términos devuelve un analizador tras analizar un texto. Esto se puede hacer con el API Rest de forma fácil y sencilla. No es necesario crear un índice para evaluar el comportamiento de un analizador.

Para utilizar este API solo tenemos que saber el nombre del analizador. Vamos a ver unos ejemplos.

Obtener los términos devueltos por el analizador spanish

# Petición
curl -XPOST 'http://localhost:9200/_analyze?analyzer=spanish&pretty' -d 'Oracion Oración Oraciones'

# Respuesta
{
   "tokens": [
      {
         "token": "oracion",
         "start_offset": 5,
         "end_offset": 12,
         "type": "<ALPHANUM>",
         "position": 1
      },
      {
         "token": "oracion",
         "start_offset": 13,
         "end_offset": 20,
         "type": "<ALPHANUM>",
         "position": 2
      },
      {
         "token": "oracion",
         "start_offset": 21,
         "end_offset": 30,
         "type": "<ALPHANUM>",
         "position": 3
      }
   ]
}

Obtener los términos devueltos por el analizador standard

# Petición
curl -XPOST 'http://localhost:9200/_analyze?analyzer=standard&pretty' -d 'Oracion Oración Oraciones'

# Respuesta
{
   "tokens": [
      {
         "token": "oracion",
         "start_offset": 5,
         "end_offset": 12,
         "type": "<ALPHANUM>",
         "position": 1
      },
      {
         "token": "oración",
         "start_offset": 13,
         "end_offset": 20,
         "type": "<ALPHANUM>",
         "position": 2
      },
      {
         "token": "oraciones",
         "start_offset": 21,
         "end_offset": 30,
         "type": "<ALPHANUM>",
         "position": 3
      }
   ]
}

Obtener los términos devueltos por el analizador asociado a un campo de un documento ya mapeado

El analizador utilizado es el asociado al campo nombre_campo del índice nombre_indice.

# Petición
curl -XPOST 'http://localhost:9200/nombre_indice/_analyze?field=nombre_campo&pretty' -d 'Oracion Oración Oraciones'

elasticsearch Cookbook, extraer y resaltar fragmentos de texto encontrado en una búsqueda

Elasticsearch

En elasticsearch es conocido por highlighting. Consiste en extraer y resaltar de un campo los fragmentos de texto donde se han encontrado los terminos o palabras de búsqueda.

Es util cuando realizamos búsquedas en campos de documentos que contienen gran cantidad de palabras.

Utilización del highlight

La primera query va sobre el campo _all con el analizador por defecto, y la segunda va al campo texto con al analizador spanish.

POST bibliografia/libro/_search?fields=highlight
{
  "query" : {
    "query_string": {
      "query": "almacenar"
    }
  },
  "highlight": {
    "fields": {
      "texto": {"fragment_size" : 125, "number_of_fragments" : 10}
    }
  }
}

POST bibliografia/libro/_search?fields=highlight
{
  "query" : {
    "query_string": {
      "default_field": "texto",
      "query": "almacenar"
    }
  },
  "highlight": {
    "fields": {
      "texto": {"fragment_size" : 125, "number_of_fragments" : 10}
    }
  }
}

Resultado de la búsqueda con highlighting

La respuesta corresponde a la segunda query.

{
   "took": 13,
   "timed_out": false,
   "_shards": {
      "total": 5,
      "successful": 5,
      "failed": 0
   },
   "hits": {
      "total": 2,
      "max_score": 0.02076112,
      "hits": [
         {
            "_index": "bibliografia",
            "_type": "libro",
            "_id": "1",
            "_score": 0.02076112,
            "highlight": {
               "texto": [
                  " <em>almacenar</em>, buscar y analizar grandes volúmenes de datos de forma rápida y en tiempo casi real. Se utiliza generalmente",
                  " permite que sus clientes buscan productos que usted vende. En este caso, puede utilizar Elasticsearch para <em>almacenar</em>",
                  ", puede utilizar Elasticsearch para <em>almacenar</em> sus datos y luego utilizar Kibana (parte de la pila Elasticsearch / Logstash"
               ]
            }
         }
      ]
   }
}

Creamos el indice, el alias, el mapping e indexamos el documento del ejemplo

PUT bibliografia
POST bibliografia/_mapping/libro
{
    "libro": {
        "properties": {
            "titulo": {
                "type": "string",
                "analyzer": "spanish"
            },
            "texto": {
                "type": "string",
                "analyzer": "spanish"
            }
        }
    }
}
POST bibliografia/libro/1 
{
    "titulo": "Empezando",
    "autor": "elastic.co",
    "texto": "Elasticsearch es un motor de código abierto de búsqueda de texto completo y analítico altamente escalable. Se le permite almacenar, buscar y analizar grandes volúmenes de datos de forma rápida y en tiempo casi real. Se utiliza generalmente como el motor / la tecnología subyacente que aplicaciones poderes que tienen funciones de búsqueda complejas y requisitos.rn Aquí hay algunos casos de uso de ejemplo que Elasticsearch podría ser utilizado para: rn Ejecuta una tienda web en línea donde usted permite que sus clientes buscan productos que usted vende. En este caso, puede utilizar Elasticsearch para almacenar su catálogo de productos entero y de inventario y proporcionar sugerencias de búsqueda y de autocompletar para ellos. rn Usted desea recopilar datos de registro o de transacción y que desea analizar y la mía estos datos para buscar tendencias, estadísticas, sumarizaciones o anomalías. En este caso, puede utilizar Logstash (parte del / Logstash / pila Kibana Elasticsearch) para recopilar, agregar y analizar los datos, y luego tener Logstash alimentar a estos datos en Elasticsearch. Una vez que los datos están en Elasticsearch, puede ejecutar búsquedas y agregaciones para extraer cualquier información que sea de su interés.rn Ejecutar una alerta plataforma de precio, que permite a los clientes a precio inteligente para especificar una regla como "Estoy interesado en la compra de un aparato electrónico específica y quiero ser notificado si el precio del aparato es inferior a $ X de cualquier proveedor en el próximo mes" . En este caso se puede raspar los precios de los proveedores, empujarlos en Elasticsearch y utilizar su inversa de búsqueda (percolador) la capacidad para que coincida con los movimientos de precios en contra de consultas de los clientes y, finalmente, impulsar las alertas a los clientes una vez que se encontraron coincidencias.rn Usted tiene necesidades analíticas / de negocios de inteligencia y quiere investigar rápidamente, analizar, visualizar y hacer preguntas ad-hoc sobre una gran cantidad de datos (pensar en millones o miles de millones de registros). En este caso, puede utilizar Elasticsearch para almacenar sus datos y luego utilizar Kibana (parte de la pila Elasticsearch / Logstash / Kibana) para construir cuadros de mando personalizados que se pueden visualizar los aspectos de sus datos que son importantes para usted. Además, puede utilizar la funcionalidad de agregaciones Elasticsearch para realizar consultas de inteligencia de negocios complejos en contra de sus datos.rn Para el resto de este tutorial, voy a guiarlo a través del proceso de obtención de Elasticsearch en marcha y funcionando, echar un vistazo en su interior, y la realización de operaciones básicas como la indexación, búsqueda y modificar sus datos. Al final de este tutorial, usted debe tener una buena idea de lo Elasticsearch es, cómo funciona, y espero estar inspirado para ver cómo se puede utilizar ya sea para construir sofisticadas aplicaciones de búsqueda o para explotar la inteligencia de sus datos."
}

Git Cookbook, Crear un tag de un commit anterior

Git

Bien por que se nos ha olvidado o bien por que en un momento determinado nos puede resultar útil.

Vamos a crear 3 tags diferentes para los 3 últimos commits.

Los 3 últimos commits son

git log --pretty=oneline

7f05f11d5d484a7364a0913531dec93622803e30 version 3
be42b169600892f0f6e6aad42515ee5eafdccd15 version 2
b2c9cd6d7f438783d0f3a11f9485b73f9009de77 Version 1

Creación de 3 tag para cada uno de los 3 últimos commits

git tag -a v0.0.1  -m "tag version 1" b2c9cd6d7f438783d0f3a11f9485b73f9009de77
git tag -a v0.0.2  -m "tag version 2" be42b169600892f0f6e6aad42515ee5eafdccd15
git tag -a v0.0.3  -m "tag version 3" 7f05f11d5d484a7364a0913531dec93622803e30

Listado de los tags

git tag -l -n

v0.0.1          tag version 1
v0.0.2          tag version 2
v0.0.3          tag version 3

elasticsearch Coookbook, modificar el mapping de un tipo de documento

Elasticsearch

Supogamos que tenemos el tipo de documento usuario y queremos añadirle dos nuevos campos. Cuando le indicamos los nuevos campos Elasticsearch hace un merge del mapping existente con el nuevo mapping. Si todo va correctamente tendremos el tipo de documento con los nuevos campos.

Si elasticsearch no puede hacer el merge por nosotros obtendremos un conflicto. Elasticsearch informa y describe el conflito con la excepción MergeMappingException.

Si estamos seguros del cambio, podemos indicarle a elasticsearch que ignore los conflictos y aplique el merge con el parámetro ignore_conflicts.

Si queremos modificar uno de los campos de un mapping y ya tenemos documentos indexados en él, no podremos modificar el mapping. Lo que debemos hacer es crear un nuevo tipo de documento con el nuevo mapping, y reindexar de nuevo todos los documentos.

A menudo estas situaciones se solucionan creando alias de los índices, evitando la perdida de servicio que ocasionan los reindexados de documento o el reindexado de todo el índice. Pero esto lo veremos en otro artículo.

Creación de un mapping

PUT polideportivo/_mapping/usuario
{
    "usuario" : {
        "properties": {
            "nombre_completo": {
                "type": "string",
                "index": "not_analyzed"
            },
            "email": {
                "type": "date",
                "index" : "not_analyzed"
            },
            "telefono_movil": {
                "type": "string",
                "index": "not_analyzed"
            },
            "direccion": {
                "type": "string",
                "analyzer": "spanish"
            }
        }
    }
}

Modificación de un mapping

PUT polideportivo/_mapping/usuario
{
    "usuario" : {
        "properties": {
            "telefono_casa": {
                "type": "string",
                "index": "not_analyzed"
            },
            "fecha_baja": {
                "type": "date",
                "format" : "date_time"
            }
        }
    }
}