Здравствуйте. Подскажите с таким вопросом. Программно отправляю данные на ES с использованием C++ по сокету. Когда посылаю пакеты, где строки представлены однобайтовыми символами - все хорошо. Но когда отправляются двухбайтные символы, то данные на ES не создаются. Точнее они создаются, но лишь до свойства, где идет двухбайтные символы.
Отправляю данные через BULK. Примерный формат отправляемого пакета (без HTTP-заголовков):
Кодировка UTF-8, но т.к. данные могут быть и других кодировок (по задаче), то пробовал перекодировать в UTF-16 и отправлял полученное на ES. Собственно первый байт в этом случае был равен 0x00, а далее уже значимый.
Когда отправляю все в UTF-8, то все работает, данные загружаются на ES. Но мне нужно сохранять одновременно и данные в UTF-16. Причем они будут идти смешанно - часть полей в ASCII, часть в UTF-16. Это возможно или требует каких-то дополнительных параметров на стороне ES?
P.S.: Данные в формате UTF-16 будут динамическими, т.е. для них mapping не настроишь при создании индекса.
Это не возможно ни с параметрами на стороне ES ни без, так как в Elasticsearch просто нет никаких механизмов обнаружения внезапной смены кодировки в запросе. Я вообще не уверен, что это теоретически возможно. Например, широко известная фраза "Bush hid the facts" в ASCII может быть интерпретирована как "畂桳栠摩琠敨映捡獴" в UTF-16LE.
Так что вам будем необходимо привести запрос в нормальный вид перед отправкой его в Elasticsearch. Я одно не пойму, почему нельзя все перевести в UTF-8 перед отправкой?
Почему же пробелы?? В заголовке HTTP передается длина сообщения, а дальше уже задача парсинга значения по разделителям независимо от содержимого. Нужно только проверять границы текущей позиции считывания данных из пакета на основе дляны сообщения.
Просто иначе эта задача ложится на плечи программиста, используемого ES. А в случае добавления данных из высоконагруженных сторонних сервисов, данная проблема заставляет задуматься о каких-то костылях как при добавлении, так и извлечении данных для визуализации или обработки. ИМХО.
Задача программиста, использующего elasticsearch, послать документ в elasticsearch в правильном формате. Если вы посылаете документ в формате JSON, то по спецификации, 0х00 в JSON должен быть закодирован:
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.