MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mongo-connector prend-il en charge l'ajout de champs avant l'insertion dans Elasticsearch ?

mongo-connector vise à synchroniser une base de données Mongo avec un autre système cible, tel que ES, Solr ou une autre base de données Mongo. La synchronisation signifie une réplication 1:1, donc à ma connaissance, mongo-connector n'a aucun moyen d'enrichir des documents pendant la réplication (et ce n'est pas non plus son intention).

Cependant, dans ES 5, nous pourrons bientôt utiliser ingérer des nœuds dans lequel nous pourrons définir des pipelines de traitement dont le but est d'enrichir les documents avant qu'ils ne soient indexés.

MISE À JOUR

Il y a probablement un moyen en modifiant le formatters.py fichier.

Dans transform_value J'ajouterais un cas pour gérer 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']})

    ...

MISE À JOUR 2

Essayons une autre approche en modifiant le transform_element fonction (à la ligne 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)))

MISE À JOUR 3

Une autre chose que vous pourriez essayer est d'ajouter un transform . La raison pour laquelle je ne l'ai pas mentionné auparavant est qu'il était obsolète dans ES 2.0, mais dans ES 5.0, vous aurez des nœuds d'ingestion et vous pourrez vous en occuper au moment de l'ingestion en utilisant un remove processeur

Vous pouvez définir votre mappage comme ceci :

PUT my_index2
{
  "mappings": {
    "my_type2": {
      "transform": {
        "script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
      },
      "properties": {
        "geopoint": {
          "type": "geo_point"
        }
      }
    }
  }
}

Remarque :assurez-vous d'activer les scripts dynamiques en ajoutant script.inline: true à elasticsearch.yml et redémarrez votre nœud ES.

Ce qui va se passer, c'est que le alt le champ sera toujours visible dans le _source stocké mais il ne sera pas indexé, et par conséquent, aucune erreur ne devrait se produire.

Avec ES 5, vous créeriez simplement un pipeline avec un remove processeur, comme ceci :

PUT _ingest/pipeline/geo-pipeline
{
  "description" : "remove unsupported altitude field",
  "processors" : [
    {
      "remove" : {
        "field": "geopoint.alt"
      }
    }
  ]
}