mongo-connector is gericht op het synchroniseren van een Mongo-database met een ander doelsysteem, zoals ES, Solr of een andere Mongo DB. Synchroniseren betekent 1:1 replicatie, dus er is geen manier die ik ken voor mongo-connector om documenten te verrijken tijdens de replicatie (en het is ook niet de bedoeling ervan).
In ES 5 kunnen we echter binnenkort gebruiken knooppunten opnemen waarin we verwerkingspijplijnen wiens doel het is om documenten te verrijken voordat ze worden geïndexeerd.
UPDATE
Er is waarschijnlijk een manier om de aan te passen formatters.py
bestand.
In transform_value
Ik zou een case toevoegen om Geopoint
te behandelen :
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']})
...
UPDATE 2
Laten we een andere benadering proberen door de transform_element
functie
(op lijn 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)))
UPDATE 3
Een ander ding dat je zou kunnen proberen is om een transformeren
. De reden dat ik het niet eerder heb genoemd, is dat het in ES 2.0 was verouderd, maar in ES 5.0 heb je ingest-knooppunten en kun je ervoor zorgen tijdens de opname met een verwijderen
verwerker
U kunt uw toewijzing als volgt definiëren:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Opmerking:zorg ervoor dat dynamische scripting is ingeschakeld door script.inline:true
. toe te voegen naar elasticsearch.yml
en herstart je ES node.
Wat er gaat gebeuren is dat de alt
veld zal nog steeds zichtbaar zijn in de opgeslagen _source
maar het wordt niet geïndexeerd en daarom mag er geen fout optreden.
Met ES 5 zou je gewoon een pijplijn maken met een verwijder
processor, zoals deze:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}