# Индексация данных с помощью C++. Проблемы с wchar\_t

**URL:** <https://discuss.elastic.co/t/c-wchar-t/34274>\
**Category:** Вопросы на русском языке\
**Created:** [November 10, 2015, 6:24pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274 "2015-11-10T18:24:07Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 10, 2015, 6:24pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/1 "2015-11-10T18:24:07Z")

</div>

Здравствуйте. Подскажите с таким вопросом. Программно отправляю данные на ES с использованием C++ по сокету. Когда посылаю пакеты, где строки представлены однобайтовыми символами - все хорошо. Но когда отправляются двухбайтные символы, то данные на ES не создаются. Точнее они создаются, но лишь до свойства, где идет двухбайтные символы.  
Отправляю данные через BULK. Примерный формат отправляемого пакета (без HTTP-заголовков):

```
POST myindex/mytype
{"index" : { "_id" : "1"} }
{"first" : "value1" , "second" : "value2" , "third" : "value3"}

```

Двухбайтовую строку посылаю в поле "second". Данные из поля "first" появляются, а из остальных полей нет.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 10, 2015, 6:37pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/2 "2015-11-10T18:37:28Z")

</div>

А в какой кодировке вы эти данные отправляете?

---

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 10, 2015, 7:30pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/3 "2015-11-10T19:30:01Z")

</div>

Кодировка UTF-8, но т.к. данные могут быть и других кодировок (по задаче), то пробовал перекодировать в UTF-16 и отправлял полученное на ES. Собственно первый байт в этом случае был равен 0x00, а далее уже значимый.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 10, 2015, 8:32pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/4 "2015-11-10T20:32:43Z")

</div>

А какие HTTP-заголовки в запросе? Хорошо бы на весь неработающий запрос в целом посмотреть.

---

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 11, 2015, 7:49am UTC](https://discuss.elastic.co/t/c-wchar-t/34274/5 "2015-11-11T07:49:17Z")

</div>

Сниферил через Wireshark.

 ![](https://us1.discourse-cdn.com/elastic/original/2X/7/7310c3047607c5432d6ce9ff5cc67bfaa6268711.jpeg)

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 11, 2015, 2:34pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/6 "2015-11-11T14:34:35Z")

</div>

Нет, так точно не пойдет - вы мешаете вместе ASCII (UTF-8) с UTF-16. Вы пробовали все в UTF-8 посылать? Дамп с этим вариантом прислать можете?

---

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 11, 2015, 6:08pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/7 "2015-11-11T18:08:31Z")

</div>

Когда отправляю все в UTF-8, то все работает, данные загружаются на ES. Но мне нужно сохранять одновременно и данные в UTF-16. Причем они будут идти смешанно - часть полей в ASCII, часть в UTF-16. Это возможно или требует каких-то дополнительных параметров на стороне ES?  
P.S.: Данные в формате UTF-16 будут динамическими, т.е. для них mapping не настроишь при создании индекса.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 11, 2015, 6:49pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/8 "2015-11-11T18:49:13Z")

</div>

> [@Anton\_Kotelev](#):
>
> Это возможно или требует каких-то дополнительных параметров на стороне ES?

Это не возможно ни с параметрами на стороне ES ни без, так как в Elasticsearch просто нет никаких механизмов обнаружения внезапной смены кодировки в запросе. Я вообще не уверен, что это теоретически возможно. Например, широко известная фраза ["Bush hid the facts"](https://en.wikipedia.org/wiki/Bush_hid_the_facts) в ASCII может быть интерпретирована как "畂桳栠摩琠敨映捡獴" в UTF-16LE.

Так что вам будем необходимо привести запрос в нормальный вид перед отправкой его в Elasticsearch. Я одно не пойму, почему нельзя все перевести в UTF-8 перед отправкой?

---

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 18, 2015, 7:34am UTC](https://discuss.elastic.co/t/c-wchar-t/34274/9 "2015-11-18T07:34:38Z")

</div>

Даже если перевести в формат UTF-8 данные могут содержать нулевые символы (0х00). При их наличии еластик запрос на добавление данных не работает.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 19, 2015, 3:09am UTC](https://discuss.elastic.co/t/c-wchar-t/34274/10 "2015-11-19T03:09:31Z")

</div>

А что вы делаете с этими данными? Как бы вы хотели elasticsearch эти нулевые символы обрабатывать? Как пробелы?

---

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 19, 2015, 6:50pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/11 "2015-11-19T18:50:20Z")

</div>

Почему же пробелы?? В заголовке HTTP передается длина сообщения, а дальше уже задача парсинга значения по разделителям независимо от содержимого. Нужно только проверять границы текущей позиции считывания данных из пакета на основе дляны сообщения.  
Просто иначе эта задача ложится на плечи программиста, используемого ES. А в случае добавления данных из высоконагруженных сторонних сервисов, данная проблема заставляет задуматься о каких-то костылях как при добавлении, так и извлечении данных для визуализации или обработки. ИМХО.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [November 19, 2015, 9:28pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/12 "2015-11-19T21:28:04Z")

</div>

Задача программиста, использующего elasticsearch, послать документ в elasticsearch в правильном формате. Если вы посылаете документ в формате JSON, то по [спецификации](https://tools.ietf.org/html/rfc7159#section-7), 0х00 в JSON должен быть закодирован:

```
  string = quotation-mark *char quotation-mark

  char = unescaped /
      escape (
          %x22 / ; " quotation mark U+0022
          %x5C / ; \ reverse solidus U+005C
          %x2F / ; / solidus U+002F
          %x62 / ; b backspace U+0008
          %x66 / ; f form feed U+000C
          %x6E / ; n line feed U+000A
          %x72 / ; r carriage return U+000D
          %x74 / ; t tab U+0009
          %x75 4HEXDIG ) ; uXXXX U+XXXX

  escape = %x5C ; \

  quotation-mark = %x22 ; "

  unescaped = %x20-21 / %x23-5B / %x5D-10FFFF

```

Если быстрая пересылка двоичных данных является приоритетом, то вам следует посылать документы в формате SMILE вместо JSON.

---

<div class="post-metadata">

**Author:** ![Anton\_Kotelev](https://avatars.discourse-cdn.com/v4/letter/a/43a26b/32.png) [@Anton\_Kotelev](https://discuss.elastic.co/u/Anton_Kotelev)\
**Post date:** [November 23, 2015, 7:41am UTC](https://discuss.elastic.co/t/c-wchar-t/34274/13 "2015-11-23T07:41:17Z")

</div>

Хм. Понял. Спасибо за разъяснения.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 1:50pm UTC](https://discuss.elastic.co/t/c-wchar-t/34274/14 "2017-07-06T13:50:33Z")

</div>

Closed on July 6, 2017, 1:50pm UTC


