Как ограничить максимальное количество документов ElasticSearch в индексе?

Я установил кластер Elastic Search (версия 7.x) и создал новый индекс. Я хочу ограничить максимальное количество документов в этом индексе. Скажем, 10000 документов сверху.

Наивное решение — запрашивать количество документов перед вставкой в ​​него нового документа. Но этот метод может быть неточным, а также иметь низкую производительность (2 запроса...).

Как это сделать правильно?


person No1Lives4Ever    schedule 01.04.2020    source источник
comment
интересно узнать, почему вы хотите ограничить максимальное количество документов в вашем индексе?   -  person user156327    schedule 01.04.2020
comment
Клиент платит за количество загруженных файлов... Поэтому я хочу заблокировать запрос на вставку после N документов...   -  person No1Lives4Ever    schedule 02.04.2020
comment
понял, дай мне время и я свяжусь с тобой   -  person user156327    schedule 02.04.2020
comment
я лучше понимаю вашу потребность, я обновил свой ответ   -  person Luc E    schedule 02.04.2020


Ответы (1)


Лучше всего использовать Index Life Управление, включенное в базовую лицензию и включенное по умолчанию в Elastic v7.3+.

Вы можете установить прокрутка для количества документов (я поставил 5 максимум документов) :

PUT _ilm/policy/my_policy
{
  "policy": {
    "phases": {
      "hot": {
        "actions": {
          "rollover": {
            "max_docs": 5
          }
        }
      }
    }
  }
}

Теперь я создаю шаблон с политикой my_policy :

PUT _template/my_template
{
  "index_patterns": [
    "my-index*"
  ],
  "settings": {
    "index.blocks.read_only" : true,
    "index.lifecycle.name": "my_policy",
    "index.lifecycle.rollover_alias": "my-index"
  }
}

Обратите внимание, что я установил параметр "index.blocks.read_only" : true, потому что при применении ролловера будет создан новый индекс с параметром read_only.

Теперь я могу создать свой индекс:

PUT my-index-000001
{
  "settings": {
    "index.blocks.read_only": false
  },
  "aliases": {
    "my-index": {
      "is_write_index": true
    }
  }
}

Вот и все ! После 5 документов он создаст новый индекс только для чтения, и псевдоним будет записываться в этот.

Вы можете протестировать по индексу некоторые новые документы с псевдонимом:

PUT my-index/_doc/1
{
  "field" : "value"
}

Кроме того, по умолчанию политика ilm будет применяться каждые 10 минут, вы можете изменить это, чтобы протестировать с помощью:

PUT /_cluster/settings
{
  "persistent": {
    "indices.lifecycle.poll_interval": "5s"
  }
}
person Luc E    schedule 01.04.2020
comment
В случае, когда предел достигнут и индекс стал доступен только для чтения, я удаляю все документы из исходного индекса. Как сделать переворот в обратную сторону? Как сделать так, чтобы он снова был доступен только для чтения = false? - person Montoya; 09.04.2020
comment
PUT my-index-000002/_settings {index.blocks.read_only: false} - person Luc E; 09.04.2020
comment
Это сделает индекс доступным для записи немедленно. Я хочу, чтобы порог снова проверялся политикой и стал доступным для записи, если порог не достигнут. Например, если я помещу максимум 5 документов и вставлю 5 документов, я сделаю его только для чтения. После этого я удаляю 1 документ, делая размер индекса 4. Я хочу, чтобы политика заметила это, сделав автоматический переход к записи - person Montoya; 09.04.2020