sql >> Databasteknik >  >> NoSQL >> MongoDB

Stöder Mongo-connector att lägga till fält innan den infogas i Elasticsearch?

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



  1. Batchuppdatering med Mongoose

  2. ActionCable på AWS:Fel under WebSocket-handskakning:Oväntad svarskod:404

  3. konstigt mongodb och mongoose error:inte master och slaveOk=falskt fel

  4. Hur man lagrar stora antal i MongoDB med Node.js