sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Mongo-connector admite agregar campos antes de insertarlos en Elasticsearch?

mongo-connector tiene como objetivo sincronizar una base de datos Mongo con otro sistema de destino, como ES, Solr u otro Mongo DB. Sincronizar significa replicación 1:1, por lo que no hay forma, que yo sepa, de que mongo-connector enriquezca documentos durante la replicación (y tampoco es su intención).

Sin embargo, en ES 5 pronto podremos usar ingesta de nodos en el que podremos definir tuberías de procesamiento cuyo objetivo es enriquecer los documentos antes de que se indexen.

ACTUALIZAR

Probablemente haya una forma modificando formatters.py archivo.

En transform_value Agregaría un caso para manejar Geopoint :

    if isinstance(value, dict):
        return self.format_document(value)
    elif isinstance(value, list):
        return [self.transform_value(v) for v in value]

    # handle Geopoint class
    elif isinstance(value, Geopoint):
        return self.format.document({'lat': value['lat'], 'lon': value['lon']})

    ...

ACTUALIZACIÓN 2

Probemos otro enfoque modificando transform_element función (en la línea 104):

def transform_element(self, key, value):
    try:
        # add these next two lines
        if key == 'GeoPoint':
            value = {'lat': value['lat'], 'lon': value['lon']}
        # do not modify the initial code below
        new_value = self.transform_value(value)
        yield key, new_value
    except ValueError as e:
        LOG.warn("Invalid value for key: %s as %s"
                 % (key, str(e)))

ACTUALIZACIÓN 3

Otra cosa que puede intentar es agregar un transform . La razón por la que no lo mencioné antes es que estaba obsoleto en ES 2.0, pero en ES 5.0 tendrá nodos de ingesta y podrá encargarse de ellos en el momento de la ingesta usando un remove procesador

Puede definir su asignación de esta manera:

PUT my_index2
{
  "mappings": {
    "my_type2": {
      "transform": {
        "script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
      },
      "properties": {
        "geopoint": {
          "type": "geo_point"
        }
      }
    }
  }
}

Nota:asegúrese de habilitar las secuencias de comandos dinámicas agregando script.inline: true a elasticsearch.yml y reinicie su nodo ES.

Lo que va a pasar es que el alt el campo seguirá siendo visible en el _source almacenado pero no se indexará y, por lo tanto, no debería ocurrir ningún error.

Con ES 5, simplemente crearía una canalización con remove procesador, así:

PUT _ingest/pipeline/geo-pipeline
{
  "description" : "remove unsupported altitude field",
  "processors" : [
    {
      "remove" : {
        "field": "geopoint.alt"
      }
    }
  ]
}