mongo-connector ma na celu synchronizację bazy danych Mongo z innym systemem docelowym, takim jak ES, Solr lub inny Mongo DB. Synchronizacja oznacza replikację 1:1, więc nie ma możliwości, aby łącznik mongo wzbogacił dokumenty podczas replikacji (i to też nie jest jego intencją).
Jednak w ES 5 wkrótce będziemy mogli używać pozyskiwanie węzłów w którym będziemy mogli zdefiniować potoki przetwarzania którego celem jest wzbogacenie dokumentów przed ich zindeksowaniem.
AKTUALIZUJ
Prawdopodobnie istnieje sposób, modyfikując formatters.py
plik.
W transform_value
Dodałbym sprawę do obsługi 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']})
...
AKTUALIZACJA 2
Wypróbujmy inne podejście, modyfikując transform_element
funkcja
(w linii 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)))
AKTUALIZACJA 3
Inną rzeczą, którą możesz spróbować, jest dodanie transform
. Powodem, dla którego nie wspomniałem o tym wcześniej, jest to, że został przestarzały w ES 2.0, ale w ES 5.0 będziesz mieć węzły pozyskiwania i będziesz mógł się nim zająć w czasie pozyskiwania za pomocą remove
procesor
Możesz zdefiniować swoje mapowanie w ten sposób:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Uwaga:upewnij się, że włącz dynamiczne skrypty, dodając script.inline: true
do elasticsearch.yml
i zrestartuj swój węzeł ES.
To, co się wydarzy, to to, że alt
pole będzie nadal widoczne w przechowywanym _source
ale nie zostanie zindeksowany, a zatem nie powinien wystąpić żaden błąd.
W ES 5 wystarczy utworzyć potok z remove
procesor, tak:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}