mongo-connector nhằm mục đích đồng bộ hóa cơ sở dữ liệu Mongo với một hệ thống đích khác, chẳng hạn như ES, Solr hoặc DB Mongo khác. Đồng bộ hóa có nghĩa là sao chép 1:1, vì vậy không có cách nào mà tôi biết về mongo-connector để làm giàu tài liệu trong quá trình sao chép (và đó cũng không phải là mục đích của nó).
Tuy nhiên, trong ES 5, chúng tôi sẽ sớm có thể sử dụng nhập các nút trong đó chúng tôi có thể xác định đường ống xử lý có mục tiêu là làm phong phú thêm tài liệu trước khi chúng được lập chỉ mục.
CẬP NHẬT
Có thể có một cách bằng cách sửa đổi formatters.py
tệp.
Trong transform_value
Tôi sẽ thêm một trường hợp để xử lý 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']})
...
CẬP NHẬT 2
Hãy thử một cách tiếp cận khác bằng cách sửa đổi transform_element
chức năng
(trên dòng 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)))
CẬP NHẬT 3
Một điều khác bạn có thể thử là thêm transform
. Lý do mà tôi chưa đề cập trước đây là nó không được chấp nhận trong ES 2.0, nhưng trong ES 5.0, bạn sẽ có các nút nhập và bạn sẽ có thể xử lý nó tại thời điểm nhập bằng cách sử dụng remove
bộ xử lý
Bạn có thể xác định ánh xạ của mình như sau:
PUT my_index2
{
"mappings": {
"my_type2": {
"transform": {
"script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
},
"properties": {
"geopoint": {
"type": "geo_point"
}
}
}
}
}
Lưu ý:đảm bảo bật tập lệnh động bằng cách thêm script.inline: true
thành elasticsearch.yml
và khởi động lại nút ES của bạn.
Điều sắp xảy ra là alt
trường sẽ vẫn hiển thị trong _source
được lưu trữ nhưng nó sẽ không được lập chỉ mục và do đó, không có lỗi nào xảy ra.
Với ES 5, bạn chỉ cần tạo một đường dẫn với remove
bộ xử lý, như thế này:
PUT _ingest/pipeline/geo-pipeline
{
"description" : "remove unsupported altitude field",
"processors" : [
{
"remove" : {
"field": "geopoint.alt"
}
}
]
}