Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Оптимизации

Настройка для использования дискового пространства

Отключите ненужные функции

По умолчанию Elasticsearch индексирует и добавляет значения документов к большинству полей, чтобы они могли быть проиндексированы и агрегированы «из коробки». Например, если у вас есть числовое поле под названием foo, на котором нужно выполнить гистограммы, но которое никогда не нужно использовать для фильтрации, вы можете безопасно отключить индексирование для этого поля в ваших отображениях:

resp = client.indices.create(
    index="index",
    mappings={
        "properties": {
            "foo": {
                "type": "integer",
                "index": False
            }
        }
    },
)
print(resp)
response = client.indices.create(
  index: 'index',
  body: {
    mappings: {
      properties: {
        foo: {
          type: 'integer',
          index: false
        }
      }
    }
  }
)
puts response
const response = await client.indices.create({
  index: "index",
  mappings: {
    properties: {
      foo: {
        type: "integer",
        index: false,
      },
    },
  },
});
console.log(response);
PUT index
{
  "mappings": {
    "properties": {
      "foo": {
        "type": "integer",
        "index": false
      }
    }
  }
}

text поля хранят нормализационные факторы в индексе для облегчения оценки документов. Если вам необходимы только возможности соответствия для поля text, но вы не беспокоитесь о полученных оценках, вы можете использовать тип match_only_text вместо этого. Этот тип поля значительно экономит место, отбрасывая информацию об оценке и позиции.

Не используйте динамические отображения строк по умолчанию

Динамические отображения строк по умолчанию динамические отображения строк будут индексировать строковые поля как text и keyword. Это расточительно, если вам нужен только один из них. Обычно поле id необходимо индексировать только как keyword, а поле body — только как поле text.

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

Например, вот шаблон, который можно использовать, чтобы отображать строковые поля только как keyword:

resp = client.indices.create(
    index="index",
    mappings={
        "dynamic_templates": [
            {
                "strings": {
                    "match_mapping_type": "string",
                    "mapping": {
                        "type": "keyword"
                    }
                }
            }
        ]
    },
)
print(resp)
response = client.indices.create(
  index: 'index',
  body: {
    mappings: {
      dynamic_templates: [
        {
          strings: {
            match_mapping_type: 'string',
            mapping: {
              type: 'keyword'
            }
          }
        }
      ]
    }
  }
)
puts response
const response = await client.indices.create({
  index: "index",
  mappings: {
    dynamic_templates: [
      {
        strings: {
          match_mapping_type: "string",
          mapping: {
            type: "keyword",
          },
        },
      },
    ],
  },
});
console.log(response);
PUT index
{
  "mappings": {
    "dynamic_templates": [
      {
        "strings": {
          "match_mapping_type": "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}

Следите за размером фрагмента

Более крупные фрагменты будут более эффективными при хранении данных. Чтобы увеличить размер фрагментов, вы можете уменьшить количество первичных фрагментов в индексе, создавая индексы с меньшим количеством первичных фрагментов, создавая меньше индексов (например, используя API переключения индекса) или изменяя существующий индекс с помощью API уменьшения индекса.

Помните, что большие размеры фрагментов имеют недостатки, такие как длительные времена восстановления.

Отключите _source

Поле _source хранит исходное JSON-тело документа. Если вам не нужен к нему доступ, вы можете его отключить. Однако API, которому требуется доступ к _source, например, обновление, выделение и повторная индексация, работать не будут.

Используйте best_compression

Поля _source и сохраненные поля могут легко занимать значительный объем дискового пространства. Их можно более агрессивно сжимать, используя best_compression кодек.

Вынужденное слияние

Индексы в Elasticsearch хранятся в одном или нескольких фрагментах. Каждый фрагмент — это индекс Lucene и состоит из одного или нескольких сегментов — фактических файлов на диске. Более крупные сегменты более эффективны для хранения данных.

API вынужденного слияния можно использовать для уменьшения количества сегментов на фрагмент. Во многих случаях количество сегментов можно уменьшить до одного на фрагмент, установив max_num_segments=1.

Рекомендуется выполнять вынужденное слияние только в отношении индекса только для чтения (то есть индекс больше не получает записи). При обновлении или удалении документов старая версия не удаляется немедленно, а вместо этого мягко удаляется и помечается «каменным символом». Эти мягко удалённые документы автоматически очищаются при регулярных слияниях сегментов. Но вынужденное слияние может привести к созданию очень больших (> 5 ГБ) сегментов, которые не подходят для обычных слияний. Таким образом, количество мягко удалённых документов может быстро расти, что приводит к увеличению использования дискового пространства и ухудшению производительности поиска. Если вы регулярно выполняете вынужденное слияние индекса, который получает записи, это также может сделать снимки более дорогостоящими, так как новые документы не могут быть резервными копированы инкрементально.

Уменьшение индекса

API уменьшения индекса позволяет уменьшить количество фрагментов в индексе. В сочетании с API вынужденного слияния выше это может значительно уменьшить количество фрагментов и сегментов индекса.

Использование наименьшего достаточного числового типа

Тип, который вы выбираете для числовых данных, может значительно повлиять на использование дискового пространства. В частности, целые числа должны храниться с помощью целочисленного типа (byte, short, integer или long), а числа с плавающей запятой должны храниться либо в scaled_float, если это уместно, либо в наименьшем типе, который соответствует случаю использования: использование float вместо double или half_float вместо float поможет сэкономить место хранения.

Использование сортировки индексов для совместного размещения похожих документов

Когда Elasticsearch хранит _source, он сжимает несколько документов одновременно, чтобы улучшить общий коэффициент сжатия. Например, очень часто документы имеют одинаковые имена полей, и достаточно часто они имеют общие значения полей, особенно в полях с низкой кардинальностью или распределением Ципфа.

По умолчанию документы сжимаются вместе в порядке их добавления в индекс. Если вы включили сортировку индекса, то вместо этого они сжимаются в отсортированном порядке. Сортировка документов с похожей структурой, полями и значениями вместе должна улучшить коэффициент сжатия.

Размещение полей в одном и том же порядке в документах

Поскольку несколько документов сжимаются вместе в блоки, вероятнее найти более длинные повторяющиеся строки в этих _source документах, если поля всегда встречаются в одном и том же порядке.

Сводка исторических данных

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

© 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/tune-for-disk-usage.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API