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