MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Czy Mongo-connector obsługuje dodawanie pól przed wstawieniem do Elasticsearch?

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak zapisać plik w MongoDB?

  2. MongoDB 2.2 — Aktualizowanie dokumentu zagnieżdżonego w tablicy

  3. Skróć identyfikator MongoDB w javascript

  4. Spring Boot konfigurowanie repozytorium MongoDB

  5. MongoError:parametr filtra musi być obiektem