mongo-connector zielt darauf ab, eine Mongo-Datenbank mit einem anderen Zielsystem wie ES, Solr oder einer anderen Mongo-DB zu synchronisieren. Synchronisieren bedeutet 1:1-Replikation, daher ist mir keine Möglichkeit bekannt, dass mongo-connector Dokumente während der Replikation anreichert (und es ist auch nicht seine Absicht).
In ES 5 werden wir jedoch bald verwenden können Aufnahmeknoten in dem wir Verarbeitungspipelines dessen Ziel es ist, Dokumente anzureichern, bevor sie indiziert werden.
AKTUALISIEREN
Es gibt wahrscheinlich einen Weg, indem Sie ändern formatters.py
Datei.
In transform_value
Ich würde einen Fall hinzufügen, um Geopoint
zu behandeln :
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']})
...
AKTUALISIERUNG 2
Versuchen wir einen anderen Ansatz, indem wir transform_element
Funktion
(auf Zeile 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)))
AKTUALISIERUNG 3
Sie können auch versuchen, einen <-Code hinzuzufügen>transformieren
. Der Grund, warum ich es bisher nicht erwähnt habe, ist, dass es in ES 2.0 veraltet war, aber in ES 5.0 haben Sie Ingest-Knoten und können sich während der Ingest-Zeit mit einem entfernen
Prozessor
Sie können Ihr Mapping wie folgt definieren:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Hinweis:Stellen Sie sicher, dass Sie dynamisches Skripting aktivieren, indem Sie script.inline:true
hinzufügen zu elasticsearch.yml
und starten Sie Ihren ES-Knoten neu.
Was passieren wird, ist, dass der alt
Das Feld ist weiterhin in der gespeicherten _source
sichtbar aber es wird nicht indiziert, und daher sollte kein Fehler auftreten.
Mit ES 5 erstellen Sie einfach eine Pipeline mit einem remove
Prozessor, etwa so:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}