我正在尝试创建索引,然后使用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
字段限制的新字段。
请查看是否可以使用静态映射或调试准备文档的代码并将其与映射进行比较,以查看其是否创建了新字段。
如果合理,请引用this SO答案以增加限制,或者使用静态映射或调试代码以弄清楚为什么要向Elasticsearch索引添加新字段。
关于elasticsearch - 在Elasticsearch中批量插入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63150949/