MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Unterstützt Mongo-Connector das Hinzufügen von Feldern vor dem Einfügen in Elasticsearch?

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