Debezium Postgres и ElasticSearch — хранят сложный объект в ElasticSearch

#postgresql #elasticsearch #apache-kafka #debezium

#postgresql #elasticsearch #apache-kafka #debezium

Вопрос:

У меня в Postgres есть база данных с таблицей «product», которая подключена от 1 до n с помощью «sales_Channel». Таким образом, у 1 продукта может быть несколько каналов продаж. Теперь я хочу перенести его в ES и поддерживать в актуальном состоянии, поэтому я использую debezium и kafka. Перенести отдельные таблицы в ES не проблема. Я могу запрашивать каналы продаж и продукты. Но мне нужны продукты со всеми подключенными каналами продаж в результате. Как заставить debezium передать это?

отображение для продукта

     {
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "_doc": {
      "properties": {
        "id": {
          "type": "integer"
        }
      }
    }
  }
}
  

приемник для продукта

    {
  "name": "es-sink-product",
  "config": {
    "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
    "tasks.max": "1",
    "topics": "product",
    "connection.url": "http://elasticsearch:9200",
    "transforms": "unwrap,key",
    "transforms.unwrap.type": "io.debezium.transforms.UnwrapFromEnvelope",
    "transforms.unwrap.drop.tombstones": "false",
    "transforms.unwrap.drop.deletes": "false",
    "transforms.key.type": "org.apache.kafka.connect.transforms.ExtractField$Key",
    "transforms.key.field": "id",
    "key.ignore": "false",
    "type.name": "_doc",
    "behavior.on.null.values": "delete"
  }
}
  

Ответ №1:

вам либо нужно использовать шаблон исходящих, см.https://debezium.io/documentation/reference/1.2/configuration/outbox-event-router.html

или вы можете использовать агрегированные объекты, см. https://github.com/debezium/debezium-examples/tree/master/jpa-aggregations
https://github.com/debezium/debezium-examples/tree/master/kstreams-fk-join