MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

O Mongo-connector oferece suporte à adição de campos antes de inserir no Elasticsearch?


O mongo-connector visa sincronizar um banco de dados Mongo com outro sistema de destino, como ES, Solr ou outro Mongo DB. Sincronizar significa replicação 1:1, portanto, não há nenhuma maneira que eu conheça para o mongo-connector enriquecer documentos durante a replicação (e também não é sua intenção).

No entanto, no ES 5, em breve poderemos usar ingerir nós no qual poderemos definir pipelines de processamento cujo objetivo é enriquecer os documentos antes de serem indexados.

ATUALIZAÇÃO

Provavelmente há uma maneira de modificar o formatters.py Arquivo.

Em transform_value Eu adicionaria um caso para lidar com 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']})

    ...

ATUALIZAÇÃO 2

Vamos tentar outra abordagem modificando o transform_element função (na linha 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)))

ATUALIZAÇÃO 3

Outra coisa que você pode tentar é adicionar um transform . A razão pela qual eu não mencionei isso antes é que ele foi descontinuado no ES 2.0, mas no ES 5.0 você terá nós de ingestão e poderá cuidar disso no momento da ingestão usando um remove processador

Você pode definir seu mapeamento assim:
PUT my_index2
{
  "mappings": {
    "my_type2": {
      "transform": {
        "script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
      },
      "properties": {
        "geopoint": {
          "type": "geo_point"
        }
      }
    }
  }
}

Nota:certifique-se de habilitar scripts dinâmicos, adicionando script.inline: true para elasticsearch.yml e reinicie seu nó ES.

O que vai acontecer é que o alt campo ainda estará visível no _source armazenado mas não será indexado e, portanto, nenhum erro deve ocorrer.

Com o ES 5, você simplesmente criaria um pipeline com um remove processador, assim:
PUT _ingest/pipeline/geo-pipeline
{
  "description" : "remove unsupported altitude field",
  "processors" : [
    {
      "remove" : {
        "field": "geopoint.alt"
      }
    }
  ]
}