MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Mongo-connector поддържа ли добавяне на полета преди вмъкване в Elasticsearch?

mongo-connector има за цел да синхронизира база данни на Mongo с друга целева система, като ES, Solr или друга база данни на Mongo. Синхронизирането означава репликация 1:1, така че няма начин, който знам за mongo-connector да обогатява документи по време на репликацията (и това също не е неговото намерение).

В ES 5 обаче скоро ще можем да използваме поглъщане на възли в който ще можем да дефинираме тръбопроводи за обработка чиято цел е да обогати документите, преди да бъдат индексирани.

АКТУАЛИЗАЦИЯ

Вероятно има начин чрез модифициране на formatters.py файл.

В transform_value Бих добавил случай за обработка на 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']})

    ...

АКТУАЛИЗАЦИЯ 2

Нека опитаме друг подход, като променим transform_element функция (на ред 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)))

АКТУАЛИЗАЦИЯ 3

Друго нещо, което можете да опитате, е да добавите transform . Причината, поради която не съм го споменавал преди, е, че беше отхвърлен в ES 2.0, но в ES 5.0 ще имате възли за приемане и ще можете да се грижите за него по време на приемане, като използвате remove процесор

Можете да дефинирате картографирането си по следния начин:

PUT my_index2
{
  "mappings": {
    "my_type2": {
      "transform": {
        "script": "ctx._source.geopoint.remove('alt'); ctx._source.geopoint.remove('valid')"
      },
      "properties": {
        "geopoint": {
          "type": "geo_point"
        }
      }
    }
  }
}

Забележка:уверете се, че активирате динамичния скрипт, като добавите script.inline: true към elasticsearch.yml и рестартирайте вашия ES възел.

Това, което ще се случи е, че alt полето все още ще бъде видимо в съхранения _source но няма да бъде индексиран и следователно не трябва да възниква грешка.

С ES 5 просто бихте създали тръбопровод с remove процесор, като този:

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. Двигателят за откриване и наблюдение на сървъри е отхвърлен

  2. Уникален индекс на Mongoose на поддокумента

  3. Как да настроя mongo db dbpath на Windows 7?

  4. Агрегирана заявка в Mongodb връща конкретно поле

  5. Как мога да добавя уникален идентификатор от две колони към mongodb в приложение за метеор?