mongo-connector има за цел да синхронизира база данни на Mongo с друга целева система, като ES, Solr или друга база данни на Mongo. Синхронизирането означава репликация 1:1, така че няма начин, който знам за mongo-connector да обогатява документи по време на репликацията (и това също не е неговото намерение).
В ES 5 обаче скоро ще можем да използваме поглъщане на възли в който ще можем да дефинираме тръбопроводи за обработка чиято цел е да обогати документите, преди да бъдат индексирани.
АКТУАЛИЗАЦИЯ
Вероятно има начин чрез модифициране на formatters.py
файл.
В transform_value
Бих добавил случай за обработка на 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']})
...
АКТУАЛИЗАЦИЯ 2
Нека опитаме друг подход, като променим transform_element
функция
(на ред 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)))
АКТУАЛИЗАЦИЯ 3
Друго нещо, което можете да опитате, е да добавите transform
. Причината, поради която не съм го споменавал преди, е, че беше отхвърлен в ES 2.0, но в ES 5.0 ще имате възли за приемане и ще можете да се грижите за него по време на приемане, като използвате remove
процесор
Можете да дефинирате картографирането си по следния начин:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Забележка:уверете се, че активирате динамичния скрипт, като добавите script.inline: true
към elasticsearch.yml
и рестартирайте вашия ES възел.
Това, което ще се случи е, че alt
полето все още ще бъде видимо в съхранения _source
но няма да бъде индексиран и следователно не трябва да възниква грешка.
С ES 5 просто бихте създали тръбопровод с remove
процесор, като този:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}