Массовая вставка объекта в 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 принимает тип 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"
    }
}
}

Спасибо.


person newLearner    schedule 29.07.2020    source источник
comment
Я уже отмечал, что ваш ответ, к сожалению, не решил исходную проблему. Следовательно, я не принял.   -  person newLearner    schedule 05.08.2020


Ответы (1)


Похоже, вы используете динамическое сопоставление и из-за некоторой ошибки при индексировании документа в конечном итоге создаются новые поля в вашем индексе, которые превышают предел 1000 полей.

Пожалуйста, посмотрите, можете ли вы использовать статическое сопоставление или отладить код, который подготавливает документ, и сравните его с вашим сопоставлением, чтобы увидеть, создает ли он новые поля.

Пожалуйста, обратитесь к этому SO-ответу, чтобы увеличить лимит, если он законный, или использовать статическое сопоставление или отладить код, чтобы выяснить почему вы добавляете новые поля в индекс elasticsearch.

person user156327    schedule 29.07.2020
comment
Ok. Итак, 2 вопроса. 1. Передавать объект person в источник () правильно? Это не проблема ? 2. Мое отображение определено в файле json. И при создании индекса я просто читаю этот json-файл как строку, передающую его. Это проблема? Пожалуйста, убедитесь, что я также обновил свой код с помощью части создания индекса. - person newLearner; 29.07.2020
comment
Кроме того, я новичок в этом, поэтому не уверен, является ли этот способ сопоставления динамическим или статическим (выглядит статичным, поскольку я просто читаю его из файла). Был бы очень признателен за помощь. Борюсь с этим со вчерашнего дня. - person newLearner; 29.07.2020
comment
@newLearner да, глядя на ваш код, это статическое сопоставление, но в файле вы упомянули кармаппинг, когда вы передаете объект человека? это опечатка? - person user156327; 29.07.2020
comment
Ах, прости. Это просто опечатка .. Исправлено! - person newLearner; 29.07.2020
comment
@newLearner, можете ли вы также предоставить сведения о сопоставлении JSON? - person user156327; 29.07.2020
comment
Боюсь, я не могу поделиться оригиналом :( .. Но я публикую фиктивный, который очень похож, за исключением настоящих имен. Также всего всего 16 полей .. Для простоты я публикую просто 3. Надеюсь, что это поможет. - person newLearner; 29.07.2020
comment
@newLearner, это нормально, мне не нужен ваш фактический, можете ли вы также сравнить свои 16 полей с тем, что вы получаете из вывода API сопоставления GET? используйте localhost: 9200 / ‹yourindexname› / _mapping, чтобы получить фактическое количество полей в вашем индексе. . - person user156327; 29.07.2020
comment
Я получаю, что сайт недоступен. Я предполагаю, что ES не работает или что-то в этом роде? Я не выполнял настройку localhost для своего клиента. Я просто автоматически подключаю его и использую. - person newLearner; 29.07.2020
comment
когда вы получаете, что сайт не может быть достигнут, я дал ваш образец, чтобы получить api сопоставления ... я предполагаю, что этот вопрос отходит от первоначального намерения и требует дополнительной отладки, больше вы ... были бы признательны, если бы вы могли проголосовать и принять этот ответ и задайте следующий вопрос с дополнительной отладкой для вашего ref elastic.co/guide/en/elasticsearch/reference/current/ - это API, который вы можете использовать для получения сведений о карте. - person user156327; 29.07.2020
comment
Спасибо. Попробую отладить. - person newLearner; 29.07.2020
comment
Эй, у меня проблема, но я не понимаю, почему это происходит. Итак, когда я делаю bulkRequest.add(IndexRequest(indexName).source(it,XContentType.JSON)), в кибане я вижу, что мое отображение полностью неверно. { "myindexneww" : { "mappings" : { "properties" : { and inside this properties instead of fields there are Person Objects with all the data inside them Есть идеи, в чем может быть проблема? - person newLearner; 29.07.2020
comment
В основном способ, которым я пытаюсь создать индекс с сопоставлением, неверен. Индекс создается, но сопоставлений нет. { "adindex" : { "mappings" : { } } } - person newLearner; 29.07.2020
comment
@newLearner, тогда он идет динамически, продолжайте отладку больше, и вы получите решение :) также, пожалуйста, задайте следующий вопрос с соответствующей частью и примите текущий ответ, чтобы его можно было закрыть, заранее спасибо - person user156327; 29.07.2020
comment
Конечно сделаю это. И последнее, как мне сделать статическое отображение? Спасибо за помощь. - person newLearner; 29.07.2020
comment
@newLearner, вы на правильном пути, задайте дополнительный вопрос, и я отвечу на него, если вы спросите в следующие 10 минут :), так как для меня уже поздно, иначе я могу дать завтра - person user156327; 29.07.2020
comment
@newLearner конечно - person user156327; 29.07.2020
comment
@newLearner готов, и, пожалуйста, объясните свой вопрос подробнее, чтобы не получить голос против. - person user156327; 29.07.2020
comment
Есть 2 проблемы с кодом создания индекса. 1. Вместо request.source() должно было быть request.mapping(). 2. В mapping.json я использую string, который должен был быть text. Сделав это, я смог создать индекс с правильным отображением. Подтверждено то же самое и на Кибане. - person newLearner; 29.07.2020
comment
Во-вторых, я не собираюсь создавать здесь документ, а затем индексировать этот документ. Вместо этого я добавлял сам объект. Создан документ, и теперь эта проблема устранена. Теперь я получаю Caused by: java.net.SocketTimeoutException: 5,000 milliseconds timeout on connection http-outgoing-0 [ACTIVE] при выполнении массовой вставки. Посмотрим, как я могу это исправить. Спасибо за ваши усилия. Кроме того, извините, но поскольку этот ответ не решил проблему, я не принимаю этот ответ. - person newLearner; 30.07.2020
comment
@newLearner, это было действительно плохо, в тот день я проснулся очень поздно, чтобы дать ответ на ваш дополнительный вопрос, и вы приняли мой ответ, думая, что это будет мотивировать меня ответить на ваш дополнительный вопрос, а позже вы не приняли ответ. - person user156327; 05.08.2020
comment
Я уже извинился перед вами, думая, что ваш ответ был правильным. Но этого не было. Вы действительно думаете, что было бы разумно принять ответ, который не решает проблему? - person newLearner; 05.08.2020
comment
Что касается принятия и неприятия, прочтите, пожалуйста, мои комментарии. Также ответ на ваш последующий вопрос был бесполезен технически, потому что ваши 10 строк кода были именно тем, что делал мой 1 лайнер, поэтому я не думаю, что это был разумный вариант. - person newLearner; 05.08.2020
comment
@newLearner нет, это не то, что я хочу, но мой ответ решает проблему Limit of 1000 fields is crossed, которая изначально была задана в вопросе, а позже при отладке мы обнаружили еще несколько проблем в вашем коде, но это не значит, что мой ответ не решил исходный Проблема и непринятый ответ означает, что сообщество будет думать, что на этот вопрос нет ответа, всегда лучше задать конкретный вопрос, закрыть его и задать дополнительный вопрос, чтобы он был более ценным для сообщества. - person user156327; 05.08.2020
comment
Не хотели бы вы объяснить, как ваш ответ повлиял на проблему с 1000 полями? Насколько я понимаю, вы подозревали, что причиной является динамическое отображение; в то время как это было статическое отображение, которое у меня было в моем коде. Так как же ваш ответ решает проблему? - person newLearner; 05.08.2020
comment
@newLearner отладка и написание эффективного кода не являются целью этого веб-сайта, поскольку мы не можем выполнять отладку в реальном времени. Я предоставил код, который работал для меня, мы пытаемся помочь сообществу без особой информации, ваш env, библиотека разные и в по крайней мере, мы можем ожидать должного ответа от пользователей, которым мы пытаемся помочь. - person user156327; 05.08.2020
comment
Давайте продолжим это обсуждение в чате. - person user156327; 05.08.2020