MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Mongo-connector supporta l'aggiunta di campi prima dell'inserimento in Elasticsearch?

mongo-connector mira a sincronizzare un database Mongo con un altro sistema di destinazione, come ES, Solr o un altro DB Mongo. La sincronizzazione significa replica 1:1, quindi non c'è modo che mongo-connector possa arricchire i documenti durante la replica (e non è nemmeno il suo intento).

Tuttavia, in ES 5 saremo presto in grado di utilizzare importare nodi in cui potremo definire condutture di elaborazione il cui obiettivo è arricchire i documenti prima che vengano indicizzati.

AGGIORNAMENTO

Probabilmente c'è un modo per modificare formatters.py file.

In transform_value Aggiungerei un caso per gestire 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']})

    ...

AGGIORNAMENTO 2

Proviamo un altro approccio modificando transform_element funzione (alla riga 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)))

AGGIORNAMENTO 3

Un'altra cosa che potresti provare è aggiungere un transform . Il motivo per cui non l'ho menzionato prima è che era deprecato in ES 2.0, ma in ES 5.0 avrai nodi di acquisizione e sarai in grado di prendertene cura al momento dell'acquisizione usando un remove processore

Puoi definire la tua mappatura in questo modo:

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

Nota:assicurati di abilitare lo scripting dinamico, aggiungendo script.inline: true a elasticsearch.yml e riavvia il tuo nodo ES.

Quello che accadrà è che alt il campo sarà ancora visibile nel _source memorizzato ma non verrà indicizzato e quindi non dovrebbe verificarsi alcun errore.

Con ES 5, creeresti semplicemente una pipeline con un remove processore, in questo modo:

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