sql >> Database >  >> NoSQL >> MongoDB

Ondersteunt Mongo-connector het toevoegen van velden voordat deze in Elasticsearch worden ingevoegd?

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



  1. Herstel een mongodb in de meteoorproductieserver

  2. JSON-arrayconversie naar array met meerdere dimensies

  3. Redis gebruiken met Node.js en Socket.IO

  4. Aanroep naar ongedefinieerde methode MongoDB\Driver\ReadConcern::isDefault()