Я пытаюсь создать индекс, а затем выполнить массовую вставку с использованием 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"
}
}
}
Спасибо.