API слияния
Принудительно выполняет слияние фрагментов одного или нескольких индексов. Для потоков данных API выполняет слияние фрагментов индексов, лежащих в основе потока.
resp = client.indices.forcemerge(
index="my-index-000001",
)
print(resp) response = client.indices.forcemerge( index: 'my-index-000001' ) puts response
const response = await client.indices.forcemerge({
index: "my-index-000001",
});
console.log(response); POST /my-index-000001/_forcemerge
Запрос
POST /<target>/_forcemerge
POST /_forcemerge
Предварительные условия
- Если включены функции безопасности Elasticsearch, у вас должна быть
maintenanceилиmanageпривилегия индекса для целевого потока данных, индекса или псевдонима.
Описание
Используйте API принудительного слияния для принудительного слияния фрагментов одного или нескольких индексов. Слияние уменьшает количество сегментов в каждом фрагменте, объединяя некоторые из них, а также освобождает место, занимаемое удалёнными документами. Слияние обычно происходит автоматически, но иногда полезно инициировать его вручную.
Рекомендуется принудительно выполнять слияние только для индекса, доступ к которому только для чтения (то есть индекс больше не принимает записи). Когда документы обновляются или удаляются, старая версия не удаляется немедленно, а вместо этого мягко удаляется и помечается как "мусор". Эти мягко удалённые документы автоматически очищаются во время обычных слияний сегментов. Но принудительное слияние может привести к созданию очень больших (> 5 ГБ) сегментов, которые не подходят для обычных слияний. Следовательно, количество мягко удаленных документов может быстро увеличиться, что приведёт к увеличению использования диска и ухудшению производительности поиска. Если вы регулярно принудительно выполняете слияние индекса, принимающего записи, это также может сделать снимки более дорогими, так как новые документы не могут быть резервированы инкрементально.
Блокирование во время принудительного слияния
Вызовы этого API блокируются до завершения слияния (если запрос не содержит wait_for_completion=false, по умолчанию true). Если соединение клиента разорвано до завершения, процесс принудительного слияния будет продолжен в фоновом режиме. Любые новые запросы на принудительное слияние тех же индексов также будут заблокированы до завершения текущего слияния.
Асинхронное выполнение принудительного слияния
Если запрос содержит wait_for_completion=false, Elasticsearch выполняет некоторые предварительные проверки, запускает запрос и возвращает task, который можно использовать для получения статуса задачи. Однако вы не можете отменить эту задачу, так как задача принудительного слияния не отменяется. Elasticsearch создаёт запись этой задачи как документ в _tasks/<task_id>. Когда вы закончите с задачей, вам следует удалить документ задачи, чтобы Elasticsearch мог вернуть занимаемое им место.
Принудительное слияние нескольких индексов
Вы можете принудительно слить несколько индексов с помощью одного запроса, указав:
- Один или несколько потоков данных, содержащих несколько базовых индексов
- Несколько индексов
- Один или несколько псевдонимов
- Все потоки данных и индексы в кластере
Каждый целевой фрагмент принудительно сливается отдельно с помощью force_merge пула потоков. По умолчанию на каждом узле имеется только один force_merge поток, что означает, что фрагменты на этом узле принудительно сливаются по одному за раз. Если вы расширите force_merge пул потоков на узле, он будет принудительно сливать свои фрагменты параллельно.
Принудительное слияние временно увеличивает хранилище для фрагмента, который сливается, так как может потребоваться свободное место до трёх его размеров в случае, если max_num_segments параметр установлен на 1, чтобы переписать все сегменты в новый.
Параметры пути
-
<target> - (Необязательно, строка) Список потоков данных, индексов и псевдонимов, используемых для ограничения запроса. Поддерживает подстановочные знаки (
*). Для указания всех потоков данных и индексов опустите этот параметр или используйте*или_all.
Параметры запроса
-
allow_no_indices -
(Необязательно, булево) Если
false, запрос возвращает ошибку, если какое-либо выражение подстановки, псевдоним индекса или_allзначение указывают только на отсутствующие или закрытые индексы. Это поведение применяется даже если запрос указывает на другие открытые индексы. Например, запрос, указывающий наfoo*,bar*, возвращает ошибку, если индекс начинается сfoo, но ни один индекс не начинается сbar.По умолчанию
true. -
expand_wildcards -
(Необязательно, строка) Тип индекса, с которым могут совпадать шаблоны подстановки. Если запрос может указывать на потоки данных, этот аргумент определяет, соответствуют ли выражения подстановки скрытым потокам данных. Поддерживает значения, разделённые запятыми, такие как
open,hidden. Допустимые значения:-
all - Совпадает с любым потоком данных или индексом, включая скрытые.
-
open - Совпадает с открытыми, не скрытыми индексами. Также соответствует любому не скрытому потоку данных.
-
closed - Совпадает с закрытыми, не скрытыми индексами. Также соответствует любому не скрытому потоку данных. Потоки данных не могут быть закрыты.
-
hidden - Совпадает со скрытыми потоками данных и скрытыми индексами. Должно быть комбинировано с
open,closedили обоими. -
none - Шаблоны подстановки не принимаются.
По умолчанию
open. -
-
flush - (Необязательно, булево) Если
true, Elasticsearch выполняет очистку индексов после принудительного слияния. По умолчаниюtrue. -
ignore_unavailable - (Необязательно, булево) Если
false, запрос возвращает ошибку, если он указывает на отсутствующий или закрытый индекс. По умолчаниюfalse. -
max_num_segments -
(Необязательно, целое число) Количество сегментов для слияния. Для полного слияния индексов установите его на
1.По умолчанию проверяет, необходимо ли выполнять слияние. Если необходимо, выполняет его.
Вы не можете указать этот параметр и
only_expunge_deletesв одном запросе. -
only_expunge_deletes -
(Необязательно, булево) Если
true, удаляет все сегменты, содержащие более чемindex.merge.policy.expunge_deletes_allowed(по умолчанию 10) процентов удалённых документов. По умолчаниюfalse.В Lucene документ не удаляется из сегмента; он просто помечается как удалённый. Во время слияния создаётся новый сегмент, который не содержит эти удаления документов.
Вы не можете указать этот параметр и
max_num_segmentsв одном запросе. -
wait_for_completion -
(Необязательно, булево) Если
true, запрос блокируется до завершения операции. По умолчаниюtrue.
Примеры
Принудительное слияние определенного потока данных или индекса
resp = client.indices.forcemerge(
index="my-index-000001",
)
print(resp) response = client.indices.forcemerge( index: 'my-index-000001' ) puts response
const response = await client.indices.forcemerge({
index: "my-index-000001",
});
console.log(response); POST /my-index-000001/_forcemerge
Принудительное слияние нескольких потоков данных или индексов
resp = client.indices.forcemerge(
index="my-index-000001,my-index-000002",
)
print(resp) response = client.indices.forcemerge( index: 'my-index-000001,my-index-000002' ) puts response
const response = await client.indices.forcemerge({
index: "my-index-000001,my-index-000002",
});
console.log(response); POST /my-index-000001,my-index-000002/_forcemerge
Принудительное слияние всех индексов
resp = client.indices.forcemerge() print(resp)
response = client.indices.forcemerge puts response
const response = await client.indices.forcemerge(); console.log(response);
POST /_forcemerge
Потоки данных и индексы, основанные на времени
Принудительное слияние полезно для управления старыми вспомогательными индексами потока данных и другими индексами, основанными на времени, особенно после перенаправления. В этих случаях каждый индекс получает трафик индексирования только в течение определенного периода времени. Как только индекс больше не получает записей, его фрагменты можно принудительно объединить в один сегмент.
resp = client.indices.forcemerge(
index=".ds-my-data-stream-2099.03.07-000001",
max_num_segments="1",
)
print(resp) response = client.indices.forcemerge( index: '.ds-my-data-stream-2099.03.07-000001', max_num_segments: 1 ) puts response
const response = await client.indices.forcemerge({
index: ".ds-my-data-stream-2099.03.07-000001",
max_num_segments: 1,
});
console.log(response); POST /.ds-my-data-stream-2099.03.07-000001/_forcemerge?max_num_segments=1
Это может быть хорошей идеей, так как фрагменты с одним сегментом иногда могут использовать более простые и эффективные структуры данных для выполнения поисков.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/indices-forcemerge.html