我正在尝试创建索引,然后使用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
采用String类型,但我正在传递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索引添加新字段。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句