Spec-Zone.ru › Elasticsearch 7
›Elasticsearch Guide [7.17] ›REST API ›Search APIs

API моментального снимка

Запрос поиска по умолчанию выполняется против самых последних видимых данных целевых индексов, что называется моментом времени. Elasticsearch PIT (момент времени) — это лёгкий вид состояния данных, существовавшего в момент его инициирования. В некоторых случаях предпочтительнее выполнять несколько запросов поиска с использованием одного и того же момента времени. Например, если между запросами search_after происходят обновления, результаты этих запросов могут быть не согласованными, так как изменения, происходящие между запросами, видны только в более позднем моменте времени.

Предварительные требования

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

    Чтобы выполнить поиск в моменте времени для псевдонима, у вас должны быть read права доступа к индексу для потоков данных или индексов псевдонима.

Примеры

Момент времени необходимо явно открыть перед использованием в запросах поиска. Параметр keep_alive сообщает Elasticsearch, как долго он должен хранить момент времени, например, ?keep_alive=5m.

POST /my-index-000001/_pit?keep_alive=1m

Результат предыдущего запроса включает id, который должен быть передан в id параметра pit запроса поиска.

POST /_search 
{
    "size": 100,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    },
    "pit": {
	    "id":  "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA==", 
	    "keep_alive": "1m"  
    }
}

Запрос поиска с параметром pit не должен указывать index, routing и preference, так как эти параметры копируются из момента времени.

Параметр id сообщает Elasticsearch выполнить запрос, используя контексты из этого момента времени.

Параметр keep_alive сообщает Elasticsearch, как долго следует продлить срок действия момента времени.

Запрос на открытие момента времени и каждый последующий запрос поиска могут возвращать разные id; поэтому всегда используйте полученный в последнюю очередь id для следующего запроса поиска.

Поддержание момента времени

Параметр keep_alive, который передаётся в запрос на открытие момента времени и запрос поиска, продлевает срок действия соответствующего момента времени. Значение (например, 1m, см. Единицы измерения времени) не должно быть достаточно большим, чтобы обработать все данные — оно должно быть достаточно большим для следующего запроса.

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

Сохранение старых сегментов означает, что требуется больше дискового пространства и дескрипторов файлов. Убедитесь, что ваши узлы настроены с достаточным количеством свободных дескрипторов файлов. См. Дескрипторы файлов.

Кроме того, если сегмент содержит удалённые или обновлённые документы, момент времени должен отслеживать, был ли каждый документ активен в момент первоначального запроса поиска. Убедитесь, что ваши узлы имеют достаточный объём оперативной памяти, если у вас много открытых моментов времени в индексе, который подвергается текущим удалениям или обновлениям. Обратите внимание, что момент времени не предотвращает удаление связанных с ним индексов.

Вы можете проверить количество открытых моментов времени (т.е. контекстов поиска) с помощью API статистики узлов:

GET /_nodes/stats/indices/search

API закрытия момента времени

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

DELETE /_pit
{
    "id" : "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
}

API возвращает следующий ответ:

{
   "succeeded": true, 
   "num_freed": 3     
}

Если значение true, все контексты поиска, связанные с идентификатором момента времени, успешно закрыты

Количество контекстов поиска, которые были успешно закрыты

Разбиение поиска

При просмотре большого количества документов может быть полезно разделить поиск на несколько частей, чтобы обрабатывать их независимо:

GET /_search
{
  "slice": {
    "id": 0,                      
    "max": 2                      
  },
  "query": {
    "match": {
      "message": "foo"
    }
  },
  "pit": {
    "id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
  }
}

GET /_search
{
  "slice": {
    "id": 1,
    "max": 2
  },
  "pit": {
    "id": "46ToAwMDaWR5BXV1aWQyKwZub2RlXzMAAAAAAAAAACoBYwADaWR4BXV1aWQxAgZub2RlXzEAAAAAAAAAAAEBYQADaWR5BXV1aWQyKgZub2RlXzIAAAAAAAAAAAwBYgACBXV1aWQyAAAFdXVpZDEAAQltYXRjaF9hbGw_gAAAAA=="
  },
  "query": {
    "match": {
      "message": "foo"
    }
  }
}

Идентификатор части

Максимальное количество частей

Результат первого запроса возвращает документы, принадлежащие первой части (id: 0), а результат второго запроса возвращает документы во второй части. Поскольку максимальное количество частей установлено в 2, объединение результатов двух запросов эквивалентно результатам поиска момента времени без разбиения. По умолчанию разбиение сначала выполняется по фрагментам, а затем локально в каждом фрагменте. Локальное разбиение разделяет фрагмент на непрерывные диапазоны на основе идентификаторов документов Lucene.

Например, если количество фрагментов равно 2, и пользователь запросил 4 части, то части 0 и 2 будут назначены первому фрагменту, а части 1 и 3 — второму фрагменту.

Для всех частей должен использоваться один и тот же идентификатор момента времени. Если используются разные идентификаторы PIT, части могут перекрываться и пропускать документы. Это происходит из-за того, что критерий разбиения основан на идентификаторах документов Lucene, которые не стабильны при изменениях в индексе.

© 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/7.17/point-in-time-api.html

Spec-Zone.ru

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