ElasticSearch 2.0 и 2 вопроса Игорю. :)

Игорь, добрый вечер!

Сейчас вышел Elasticsearch 2.0, и я начинаю думать над вопросами миграции. Натолкнулся на два концептуальных вопроса, которые хотелось бы понять. мне кажется, в рускоязычном сообществе Вы единственный можете объяснить логику создателей. :slight_smile:

  1. Утилита проверки готовности миграции говорит, что теерь тип boolean надо интерпретировать как 0 и 1 вместо false и true. В документации тип boolean остался, по прежнему в него можно записывать true и false, но при выборках нужно использовать 0 и 1. С чем это связано? Какие задачи быи решены таким решением?
  2. Утилита миграции говорит, что недопустимо в одном индексе иметь два типа с двумя полями с разным меппингом. То есть если у меня есть поле в типе users name, и поле name в типе streets, и они имеют разный mapping, то это фатальная ошибка. Я полагал, что index - это аналог database, а type - аналог таблицы, но видимо ошибался. Какой смысл имеет понятие index и type в Elastic 2.0?

Заранее спасибо!

  1. Это вызвано тем, что изменился формат хранения этих данных. На сколько я помню, это изменение было произведено для улучшения производительности полей с данным типом.

  2. Type - это не совсем аналог таблицы. Это скорее подмножество полей из множества всех полей в индексе. То есть, в вашем примере поле name от всех типов индексируется как одно и тоже поле name на уровне lucene. В 1.x, это не было очевидно и вызывало "странные" проблемы для пользователей, пытавшихся использовать тип как таблицу. В 2.0 мы сделали так, что задать поля с одним именем но разными опциями больше в разных типах просто не возможно.

Спасибо!

А разница в производительности действительно настолько заметна? И почему бы не пойти по пути, что внутренее представление, скажем, числом, а на уровне запроса происходит просто "прозрачная" конвертация?

По второму вопросу немного странно. Получается, что в ES 2.0 фактически, надо кждую "таблицу" создавать "индексом". А какие тогда есть механизмы обособления "таблиц" в рамках одного проекта? У меня на сервере сейчас крутится около 5 проектов, и для каждого из них сделан отдельный индекс. При переходе к новой версии, мне нужен иной механизм разделения данных. Как правильно? На уровне префиксов индексов? Или ставить разные инстансы ES на каждый проект? Но IMHO, это не совсем оправдано по ресурсам.

  1. В большинстве случаев прозрачная конвертация и происходит. Просто есть пара случаев, где это не было практично. См ссылку в моем предыдущем ответе с примерами таких случаев.

  2. Эта проблема с возможными решениями очень хорошо описана в статье Great Mapping Refactoring. Если будет что не понятно - спрашивайте тут.

Да, теперь внимательне прочел - стало понятней. Но детали остались.

Правильно ли я понимаю, что когда я создам в mapping тип boolean, то он создастся как "целое". И если я при записи буду указывать 0/1 - то оно и будет как целое хранится. Но если я сделаю присвоение этому типу true - то сохранится строковое выражение "Т", или же ES 2.0 сам конвертирует это значение в 1 "целое"?

По второму вопросу проблематика понятна. Видимо - самый оптимальный вариант - рассматривать индексы как отдельные таблицы. Вариант с разным названием однотипных полей мне представляется эстетически нежелательным. :slight_smile:

Можно что угодно в это поле записывать. При этом false, "false", "off", "no", "0", "", 0, 0.0 будет интерпретироваться как false и храниться как 0, а все остальное будет интерпретироваться как true и храниться как 1.

Все, понял. Спасибо большое!