Вставить объект, используя java клиент 6.5 - PullRequest
1 голос
/ 22 апреля 2020

Я хочу вставить объект, используя java клиент высокого уровня отдыха.

Мое сопоставление следующее:

"images":{
           "type":"nested",
           "properties":{
              "name":{
                  "type":"text"
              },
              "url":{
                 "type":"text"
              }
           }
        }

и java код:

// productDb.getImages () возвращает ArrayList типа Image: с атрибутами «name» и «url»

productToIndex.put("images", new Gson().toJson(productDb.getImages()));
      IndexRequest indexRequest = new IndexRequest(ProductIndex.PRODUCT_INDEX, ProductIndex.TYPE)
                    .source(productToIndex, XContentType.JSON);
            try {              
                restHighLevelClient.index(indexRequest, RequestOptions.DEFAULT);              
            } catch (Exception e) {
                logger.error("Data access error occured the entity persistence...", e);
                throw new Exception(e);
            }

Ошибка:

ElasticsearchStatusException [ Исключение Elasticsearch [type = mapper_parsing_exception, причина = сопоставление объекта для [images] пытался проанализировать поле [images] как объект, но нашел конкретное значение]]

Конкретное значение:

images -> [{"name":"Capture.PNG","url":"/api/trader/files/2132132/Capture.PNG"},{"name":"payement.jpg","url":"/api/trader/files/31231321/payement.jpg"}]

==> Мне кажется, что все в порядке, и я не могу понять, почему он возвращает исключение, если я заменяю productDb.getImages () на новый Arraylist <> (); он работает нормально (индексированное значение: "images": [])

Я не могу найти пример того, как индексировать объект массива, используя java, есть ли решение сделать это?

Спасибо.

1 Ответ

1 голос
/ 22 апреля 2020

Если вы заметили, что есть разница в том, какой формат ES ожидает от вас JSON и в каком формате вы отправляете полезную нагрузку.

Правильный формат вложенного документа для индекса

{
    "images": [ --> note image array
        {
            "name": "opster.PNG",
            "url": "/api/trader/files/2132132/Capture.PNG"
        },
        {
            "name": "data.jpg",
            "url": "/api/trader/files/31231321/payement.jpg"
        }
    ]
}

JSON, который вы java сгенерировали, обратите внимание, что нет ключа изображения

{
  "name": "Capture.PNG",
  "url": "/api/trader/files/2132132/Capture.PNG"
},
{
  "name": "payement.jpg",
  "url": "/api/trader/files/31231321/payement.jpg"
}

Поскольку Elasticsearch не может найти images и ваш ключ не является допустимым JSON массивом, Elasticsearch выдает ошибку:

Решение:

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

public void saveToEs(NestedImages nestedImages) throws IOException {
        ObjectMapper Obj = new ObjectMapper();
        final String images = Obj.writeValueAsString(nestedImages);
        final IndexRequest indexRequest = new IndexRequest("nestedimage")
                .source(images, XContentType.JSON);
        IndexResponse indexResponse = client.index(indexRequest, RequestOptions.DEFAULT);

    }

Важные ссылки для Пример индексации вложенного типа данных и индексации и Высокоуровневая индексация REST java код .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...