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"
}
}
]
}