elasticsearch,apache-kafka,apache-kafka-connect,Java,elasticsearch,Apache Kafka,Apache Kafka Connect" /> elasticsearch,apache-kafka,apache-kafka-connect,Java,elasticsearch,Apache Kafka,Apache Kafka Connect" />

Java ElasticsearchSinkConnector对象映射不能从嵌套更改为非嵌套

Java ElasticsearchSinkConnector对象映射不能从嵌套更改为非嵌套,java,elasticsearch,apache-kafka,apache-kafka-connect,Java,elasticsearch,Apache Kafka,Apache Kafka Connect,我正在将卡夫卡主题中的数据流式传输到elasticsearch。但是它从连接器{\type\:\invalical\u argument\u exception\,\reason\:\object mapping[search\u data]无法从嵌套更改为非嵌套\}引发此错误 但当我从主题中获取消息并使用ElasticSearchAPI手动添加文档时,它工作得很好 kafka connect elasticsearch是否不支持嵌套对象类型 请帮我回答这个问题,因为我已经被困在这里好几天了 E

我正在将卡夫卡主题中的数据流式传输到elasticsearch。但是它从连接器{\type\:\invalical\u argument\u exception\,\reason\:\object mapping[search\u data]无法从嵌套更改为非嵌套\}引发此错误

但当我从主题中获取消息并使用ElasticSearchAPI手动添加文档时,它工作得很好

kafka connect elasticsearch是否不支持嵌套对象类型

请帮我回答这个问题,因为我已经被困在这里好几天了

Elasticsearch版本:7.6.2

卡夫卡连接图片:confluentinc/cp卡夫卡连接:5.4.2

下面是我的连接器配置

{
    "connector.class": "io.confluent.connect.elasticsearch.ElasticsearchSinkConnector",
    "tasks.max": "1",
    "topics": "es_sink_products",
    "key.ignore": "false",
    "schema.ignore": "true",
    "connection.url": "localhost:9200",
    "type.name": "kafka-connect",
    "name": "product-elasticsearch-sink",
    "key.converter": "org.apache.kafka.connect.storage.StringConverter"
}
弹性搜索模式

{
  "mappings": {
    "properties": {
      "search_result_data": {
        "properties": {
          "product_id": {"type": "long"},
          "product_name": {"type": "text"},
        }
      },
      "search_data":{
        "type": "nested",
        "include_in_parent": false,
        "properties": {
          "product_id": {"type": "long"},
          "full_text": {
            "type": "text",
          },
        }
      }
    }
  }
}
主题es_sink_产品的示例消息

这是连接器的全部错误 org.apache.kafka.connect.errors.ConnectException:由于无法恢复的异常而退出WorkerSinkTask。\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessagesWorkerSinkTask.java:561\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.pollWorkerSinkTask.java:322\n\tatorg.apache.kafka.connect.runtime.WorkerSinkTask.iterationWorkerSinkTask.java:224\n\tat org.apache.kafka.connect.runtime.WorkerSinkTask.executeWorkerSinkTask.java:192\n\tat org.apache.kafka.connect.runtime.WorkerTask.doRunWorkerTask.java:177\n\tat org.apache.kafka.connect.runtime.WorkerTask.runWorkerTask.runWorkerTask.java:227\n\tatjava.util.concurrent.Executors$RunnableAdapter.callExecutors.java:511\n\tat java.util.concurrent.FutureTask.runFutureTask.java:266\n\tat java.util\tat java.ThreadPoolExecutor.runworker\n\tat java.util.concurrent线程执行器$Worker.runThreadPoolExecutor.java:624\n\tat java.lang.Thread.runThread.java:748\nby:org.apache.kafka.connect.errors.ConnectException:批量请求失败:[{\type\:\invalical\u argument\u exception\,\reason\:\object mapping[search\u data]无法从嵌套更改为非嵌套\]\n\tat io.confluent.connect.elasticsearch.bulk.BulkProcessor$BulkTask.handleMalformedDocBulkProcessor.java:479\n\tat io.confluent.connect.elasticsearch.BulkProcessor.executeBulkProcessor.java:433\n\tat io.confluent.connect.elasticsearch.bulk.BulkProcessor$BulkTask.callBulkProcessor.java:389\n\nio.confluent.connect.elasticsearch.bulk.BulkProcessor$BulkTask.callBulkProcessor.java:375\n\tat java.util.concurrent.FutureTask.runFutureTask.java:266\n\tat java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1149\n\tat java:java.lang.Thread.runThread.java:748\n\t io.confluent.connect.elasticsearch.bulk.BulkProcessor$BulkProcessorThread.runBulkProcessor.java:370\n

当以前设置了非嵌套映射并且您尝试使用嵌套类型更新该映射时,会引发此错误

您现在可以做的是:

删除索引 将嵌套映射设置为上面所称的Elasticsearch模式一次 使用选项schema.ignore:false启动卡夫卡流
原因:将非嵌套更改为嵌套被视为“破坏性更改”,因为有效负载的索引方式不同。

当以前设置了非嵌套映射,并且您尝试使用嵌套类型更新该映射时,会引发此错误

您现在可以做的是:

删除索引 将嵌套映射设置为上面所称的Elasticsearch模式一次 使用选项schema.ignore:false启动卡夫卡流 原因:将非嵌套更改为嵌套被视为“突破性更改”,因为有效负载的索引方式。

问题在于kafka连接器配置中的type.name。Elasticsearch默认类型为_doc。由于我使用kafka connect作为类型,elasticsearch假设我要添加另一个文档类型,并且与现有的_doc嵌套类型冲突

通过更改type.name:_docfor connector configuration修复了该问题。

问题在于kafka connector configuration中的type.name。Elasticsearch默认类型为_doc。由于我使用kafka connect作为类型,elasticsearch假设我要添加另一个文档类型,并且与现有的_doc嵌套类型冲突


通过更改type.name:_连接器配置文档修复了该问题。

感谢您的回复。我试过上面的步骤,但却犯了同样的错误。我检查了mapping-search_数据字段是否已嵌套。可以使用Elasticsearch Put API插入文档。仅当从kafka-connect-elasticsearch插入时才会引发错误。它必须使用/schema.ignore或类似选项执行某些操作。感谢回复。我试过上面的步骤,但却犯了同样的错误。我检查了mapping-search_数据字段是否已嵌套。可以使用Elasticsearch Put API插入文档。仅当从kafka-connect-elasticsearch插入时才会引发错误。它必须使用/schema.ignore或类似选项执行某些操作。
{
    "search_data": {
        "product_id": 1,
        "full_text": "Product 1"
    },
    "search_result_data": {
        "product_id": 1,
        "product_name": "Product Name 1"
    }
}