#elasticsearch #atomic #elasticsearch-java-api
Вопрос:
в принципе, я читал и читал тонны статей и документацию по API JAVA elasticsearch о том, как создавать и индексировать как настройки, так и сопоставления в одном кадре. Мой код почти такой же, как у доков:
// Some validations before
getClient()
.admin().indices().prepareCreate(index)
.setSettings(Settings.settingsBuilder()
.put("index.number_of_shards", shards)
.put("index.number_of_replicas", replicas)
.build())
.addMapping("guests", generateMappings("guests"))
.addMapping("orders", generateMappings("orders"))
.get();
// Some validations after, try catch exception and finally client closing
Вопрос заключается в атомарности этой операции: я предполагаю, что если какой-то шаг завершится неудачно (создание индекса, создание настроек или создание сопоставлений), то вся транзакция завершится неудачно, и индекс не будет создан без настроек или сопоставлений. В документе ES об этом недостаточно ясно сказано.
Я также покопался в Java-коде ES и нашел кое-что интересное в классе CreateIndexRequest:
@Override
public void writeTo(StreamOutput out) throws IOException {
super.writeTo(out);
out.writeString(cause);
out.writeString(index);
writeSettingsToStream(settings, out);
writeTimeout(out);
out.writeVInt(mappings.size());
for (Map.Entry<String, String> entry : mappings.entrySet()) {
out.writeString(entry.getKey());
out.writeString(entry.getValue());
}
out.writeVInt(customs.size());
for (Map.Entry<String, IndexMetaData.Custom> entry : customs.entrySet()) {
out.writeString(entry.getKey());
entry.getValue().writeTo(out);
}
out.writeVInt(aliases.size());
for (Alias alias : aliases) {
alias.writeTo(out);
}
out.writeBoolean(updateAllTypes);
}
Поэтому я предполагаю его атомарность, но было бы здорово быть уверенным на 100%.
Заранее спасибо!