MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Apakah konektor Mongo mendukung penambahan bidang sebelum dimasukkan ke Elasticsearch?

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Luwak - Bagaimana cara mengelompokkan dan mengisi?

  2. urutan byte tidak valid dalam US-ASCII (Ruby 1.9 + rails 2.3.8 + mongodb + mongo_mapper)

  3. Masking MongoDB Asli (Metode ke-3)

  4. Dorong elemen ke dalam array bersarang luwak nodejs

  5. Saya perlu mengambil objek MongoDB hanya dengan item array yang difilter