sql >> Database teknologi >  >> NoSQL >> MongoDB

Understøtter Mongo-connector tilføjelse af felter før indsættelse i Elasticsearch?

mongo-connector sigter mod at synkronisere en Mongo-database med et andet målsystem, såsom ES, Solr eller en anden Mongo DB. Synkronisering betyder 1:1-replikering, så der er ingen måde, jeg kender til, for mongo-connector at berige dokumenter under replikeringen (og det er heller ikke hensigten).

Men i ES 5 vil vi snart være i stand til at bruge indtag noder hvor vi vil være i stand til at definere behandlingspipelines a> hvis mål er at berige dokumenter, før de bliver indekseret.

OPDATERING

Der er sandsynligvis en måde ved at ændre formatters.py fil.

I transform_value Jeg ville tilføje en sag for at håndtere Geopoint :

if isinstance(value, dict):returner self.format_document(value) elif isinstance(value, list):return [self.transform_value(v) for v in value] # handle Geopoint klasse elif isinstance(value) , Geopoint):return self.format.document({'lat':value['lat'], 'lon':value['lon']}) ...

OPDATERING 2

Lad os prøve en anden tilgang ved at ændre transform_element funktion (på linje 104):

def transform_element(selv, nøgle, værdi):prøv:# tilføj disse næste to linjer, hvis nøgle =='GeoPoint':værdi ={'lat':værdi['lat'], 'lon':værdi['lon']} # modificer ikke startkoden under new_value =self.transform_value(value) yield key, new_value undtagen ValueError som e:LOG.warn("Ugyldig værdi for nøgle:%s som %s" % ( nøgle, str(e))) 

OPDATERING 3

En anden ting, du kan prøve, er at tilføje en transformere . Grunden til, at jeg ikke har nævnt det før, er, at det blev forældet i ES 2.0, men i ES 5.0 vil du have indtagelsesknuder, og du vil være i stand til at tage dig af det på indtagelsestidspunktet ved hjælp af en fjern processor

Du kan definere din kortlægning sådan her:

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

Bemærk:Sørg for at aktivere dynamisk scripting ved at tilføje script.inline:true til elasticsearch.yml og genstart din ES-node.

Det, der kommer til at ske, er, at alt feltet vil stadig være synligt i den gemte _source men det vil ikke blive indekseret, og derfor bør der ikke opstå nogen fejl.

Med ES 5 ville du simpelthen oprette en pipeline med en fjern processor, som denne:

PUT _ingest/pipeline/geo-pipeline{ "description" :"fjern ikke-understøttet højdefelt", "processorer" :[ { "remove" :{ "field":"geopoint.alt" } } ]}  



  1. Sharding med forårsmongo

  2. Mongoose - ved hjælp af Populate på en række ObjectId

  3. NodeJS - MongoDB:brug en åbningsforbindelse

  4. Pandas DatetimeIndex fra MongoDB ISODate