mongo-connector bertujuan untuk menyinkronkan database Mongo dengan sistem target lain, seperti ES, Solr atau DB Mongo lainnya. Menyinkronkan berarti replikasi 1:1, jadi tidak ada cara yang saya ketahui tentang konektor mongo untuk memperkaya dokumen selama replikasi (dan itu juga bukan tujuannya).
Namun, di ES 5 kami akan segera dapat menggunakan menyerap node di mana kita dapat menentukan pipeline pemrosesan yang tujuannya adalah untuk memperkaya dokumen sebelum diindeks.
PERBARUI
Mungkin ada cara dengan memodifikasi formatters.py
berkas.
Dalam transform_value
Saya akan menambahkan kasing untuk menangani 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']})
...
PERBARUI 2
Mari coba pendekatan lain dengan memodifikasi transform_element
fungsi
(di baris 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)))
PERBARUI 3
Hal lain yang mungkin Anda coba adalah menambahkan transform
. Alasan saya tidak menyebutkannya sebelumnya adalah karena sudah tidak digunakan lagi di ES 2.0, tetapi di ES 5.0 Anda akan memiliki node menelan dan Anda akan dapat menanganinya saat menelan menggunakan remove
prosesor
Anda dapat menentukan pemetaan Anda seperti ini:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Catatan:pastikan mengaktifkan scripting dinamis, dengan menambahkan script.inline: true
ke elasticsearch.yml
dan mulai ulang simpul ES Anda.
Apa yang akan terjadi adalah alt
bidang akan tetap terlihat di _source
stored yang tersimpan tetapi tidak akan diindeks, dan karenanya, tidak akan terjadi kesalahan.
Dengan ES 5, Anda cukup membuat saluran dengan remove
prosesor, seperti ini:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}