mongo-connector se zaměřuje na synchronizaci databáze Mongo s jiným cílovým systémem, jako je ES, Solr nebo jiný Mongo DB. Synchronizace znamená replikaci 1:1, takže nevím o žádném způsobu, jak by mongo-connector obohatil dokumenty během replikace (a ani to není jeho záměrem).
V ES 5 však brzy budeme moci používat přijímací uzly ve kterém budeme schopni definovat procesní potrubí jehož cílem je obohatit dokumenty předtím, než budou indexovány.
AKTUALIZACE
Pravděpodobně existuje způsob, jak upravit formatters.py
soubor.
V transform_value
Přidal bych případ pro zpracování 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']})
...
AKTUALIZACE 2
Zkusme jiný přístup úpravou transform_element
funkce
(na řádku 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)))
AKTUALIZACE 3
Další věc, kterou můžete zkusit, je přidat transform
. Důvod, proč jsem to dříve nezmínil, je ten, že byla v ES 2.0 zastaralá, ale v ES 5.0 budete mít ingestové uzly a budete se o to moci postarat v době ingestu pomocí remove
procesor
Mapování můžete definovat takto:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Poznámka:Ujistěte se, že povolíte dynamické skriptování přidáním script.inline: true
na elasticsearch.yml
a restartujte uzel ES.
Stane se, že alt
pole bude stále viditelné v uloženém _source
ale nebude indexován, a proto by neměla nastat žádná chyba.
S ES 5 byste jednoduše vytvořili kanál pomocí remove
procesor, jako je tento:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}