MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Mongo-connector có hỗ trợ thêm trường trước khi chèn vào Elasticsearch không?

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"
      }
    }
  ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Xây dựng chỉ mục MongoDB - Ngăn người dùng kích hoạt các bản dựng mới

  2. Phím mài (MongoDB) cho các tài liệu số lượng lớn

  3. Truy vấn chỉ tìm kiếm MongoDB trong những giờ cụ thể

  4. Có cách nào để sử dụng các đối tượng truy vấn MongoDB để lọc các mảng JavaScript thông thường không?

  5. Doctrine ODM / MongoDB không thử lại các truy vấn?