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