在 Elasticsearch 中批量插入对象

Bulk Insert object in Elasticsearch

我正在尝试创建一个索引,然后使用 RestHighLevelClient 对我的 ES(代码在 Kotlin 中)进行批量插入。

批量插入代码为:

private fun insertEntity(entityList: List<Person>, indexName: String) {
    var count = 0
    val bulkRequest = BulkRequest()

    entityList.forEach {
        bulkRequest.add(IndexRequest(indexName).source(it,XContentType.JSON))
        count++

        if (count == batchSize) {
            performBulkInsert(bulkRequest)
        }
    }
}

执行此操作时,出现异常:Limit of 1000 fields is crossed.

分析我的代码,我觉得实现是错误的,因为:

bulkRequest.add(IndexRequest(indexName).source(it,XContentType.JSON))

source 采用字符串类型,但我传递的是 Person (it) 对象本身。所以我认为这导致了一些与基于我的映射或其他东西的 1000 个字段相关的问题。

不确定我的假设是否正确。如果是,那我怎样才能实现批量插入?

编辑

索引创建:

private fun createIndex(indexName: String) {
    val request = CreateIndexRequest(indexName)

    val settings = FileUtils.readFileToString(
        ResourceUtils.getFile(
            ResourceUtils.CLASSPATH_URL_PREFIX + "settings/settings.json"), "UTF-8")

    val mappings = FileUtils.readFileToString(
        ResourceUtils.getFile(
            ResourceUtils.CLASSPATH_URL_PREFIX + "mappings/personMapping.json"), "UTF-8")

    request.settings(Settings
        .builder()
        .loadFromSource(settings, XContentType.JSON))
        .source(mappings, XContentType.JSON)
    restHighLevelClient.indices().create(request, RequestOptions.DEFAULT)
    
}

Mapping.json 请注意原始有 16 个字段。

{
  "properties": {
    "accessible": {
      "type": "boolean"
    },
    "person_id": {
      "type": "long"
    },
    "person_name": {
      "type": "string",
      "analyzer": "lower_keyword"
    }
}
}

谢谢。

看起来您正在使用动态映射,并且由于在索引文档时出现一些错误,它最终会在您的索引中创建超过 1000 字段限制的新字段。

请查看您是否可以使用静态映射或调试准备文档的代码并将其与您的映射进行比较以查看其是否创建新字段。

请参考 SO 答案以增加限制(如果合法)或使用静态映射或调试代码以找出为什么要向 elasticsearch 索引添加新字段。