У нас есть индекс около 20 ГБ;документы имеют несколько больших полей, многие из которых теперь являются избыточными.
Поэтому я решил использовать массовое обновление, чтобы оставить эти поля пустыми в ожидании восстановления места на сервере.
Я протестировал небольшое количество экземпляров, используя код вида:
POST myindex/doc/_bulk
{"update":{"_id":"ccp-23-1002"}}
{"doc" : { "long_text_1":"", "long_text_2":""}}
{"update":{"_id":"ccp-28-1007"}}
{"doc" : { "long_text_1":"", "long_text_2":""}}
Это работало нормально, я выполнил поиск, они показали, что поля long_text_1 и long_text_2 теперь были пустыми в указанных документах, остальные полябез изменений.
Итак, я написал что-то для запуска вышеприведенного документа по всем документам в индексе, по 1000 за раз.После того, как некоторые из них прошли, я проверил данные в консоли, используя
GET _cat/indices?v&s=store.size&h=index,docs.count,store.size
..., который показал, что, хотя в рассматриваемом индексе было одинаковое количество документов, store.size стал больше,не меньше!
Предположительно, происходит то, что в каждом случае после обновления создается новый документ с теми же данными, что и у старого документа, за исключением измененных полей, указанных в запросе на обновление;и старый документ все еще сидит в указателе, предположительно помеченный как мертвый, но занимающий место.Таким образом, упражнение имеет совершенно противоположное предполагаемому эффекту.
Поэтому мой вопрос состоит в том, как поручить ES сжать указатель или иным образом исправить это мертвое пространство?