mongo-connector syftar till att synkronisera en Mongo-databas med ett annat målsystem, såsom ES, Solr eller en annan Mongo DB. Synkronisering innebär 1:1-replikering, så det finns inget sätt som jag känner till för mongo-connector att berika dokument under replikeringen (och det är inte heller dess avsikt).
Men i ES 5 kommer vi snart att kunna använda intag noder där vi kommer att kunna definiera bearbetningspipelines a> vars mål är att berika dokument innan de indexeras.
UPPDATERA
Det finns förmodligen ett sätt genom att ändra formatters.py
fil.
I transform_value
Jag skulle lägga till ett fall för att hantera 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']})
...
UPPDATERING 2
Låt oss prova en annan metod genom att ändra transform_element
funktion
(på linje 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)))
UPPDATERING 3
En annan sak du kan försöka är att lägga till en omvandla
. Anledningen till att jag inte har nämnt det tidigare är att det fasades ut i ES 2.0, men i ES 5.0 kommer du att ha intagsnoder och du kommer att kunna ta hand om det vid intagstillfället med en ta bort
processor
Du kan definiera din mappning så här:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Obs:se till att aktivera dynamisk skriptning genom att lägga till script.inline:true
till elasticsearch.yml
och starta om din ES-nod.
Det som kommer att hända är att alt
fältet kommer fortfarande att vara synligt i den lagrade _source
men det kommer inte att indexeras, och därför bör inget fel inträffa.
Med ES 5 skulle du helt enkelt skapa en pipeline med en remove
processor, så här:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}