Глава 3. Подробное изучение ключевых операций и приложений Elasticsearch

2.2.1 ОТДЫХ

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

На стороне сервера состояние и функциональность приложения можно разделить на различные ресурсы. Ресурс представляет собой интересную концептуальную сущность, доступную клиенту. Примеры ресурсов включают объекты приложения, записи базы данных, алгоритмы и т. д. Каждому ресурсу назначается уникальный адрес с использованием универсального идентификатора ресурса (URI). Все ресурсы имеют единый интерфейс для передачи состояния между клиентом и сервером. Для этой цели используются стандартные методы HTTP, такие как GET, PUT, POST и DELETE.

В веб-службах в стиле REST каждый ресурс имеет адрес. Сами ресурсы являются целью вызовов методов, и список методов одинаков для всех ресурсов. Это стандартные методы, включая HTTP GET, POST, PUT и DELETE, а также могут включать HEAD и OPTIONS. Проще говоря, если вы хотите получить доступ к ресурсу в Интернете, вы должны отправить запрос на сервер, на котором находится ресурс. Запрос должен включать сетевой путь к ресурсу и операцию, которая должна быть выполнена с ресурсом (создание, извлечение, обновление или удаление).

2.2.2 Установка клиента

Если вы хотите отправлять запросы на сервер Elasticsearch напрямую через браузер, вам необходимо включить в запросы стандартные методы HTTP, а большинство возможностей HTTP поддерживаются только методами GET и POST. Для удобного доступа к клиенту можно использовать ПО Postman.

Postman — это мощный инструмент веб-отладки с надежными возможностями для тестирования и отладки веб-API и HTTP-запросов. Программное обеспечение предлагает чистый и удобный интерфейс, что делает его удобным и эффективным в использовании.

2.2.3 Формат данных

Elasticsearch — это документно-ориентированная база данных, в которой каждая запись данных считается документом. Чтобы облегчить понимание, давайте сравним, как Elasticsearch хранит данные документа, и как реляционная база данных MySQL хранит данные.

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

Понятие Типов постепенно ослабевало. В Elasticsearch 6.X индекс может содержать только один тип. Однако в Elasticsearch 7.X концепция типов была полностью удалена.

6 JSON используется в качестве формата сериализации для документов, включая запись с информацией о пользователе.

{
   "name" : "John",
   "sex" : "Male",
   "age" : 25,
   "birthDate": "1990/05/01",
   "about" : "I love to go rock climbing",
   "interests": [ "sports", "music" ]
}

2.2.4 Операции HTTP 2.2.4.1 Операции с индексами

  1. Создание индекса По сравнению с реляционными базами данных создание индекса эквивалентно созданию базы данных. В Postman отправьте запрос PUT на сервер Elasticsearch: http://127.0.0.1:9200/shopping.

После запроса сервер возвращает ответ.

{
  "acknowledged": true, # true indicates successful operation
  "shards_acknowledged": true, # true indicates successful shard operation
  "index": "shopping" # Name of the created index
}

# Note: The default number of shards for creating an index is 1 shard. In Elasticsearch versions prior to 7.0.0, the default number of shards was 5.

Если вы попытаетесь создать уже существующий индекс, Elasticsearch вернет сообщение об ошибке.

2. Чтобы просмотреть все индексы в Elasticsearch

отправить GET-запрос на сервер ES с помощью Postman со следующим URL: http://127.0.0.1:9200/_cat/indices?v.

Здесь «_cat» в пути запроса означает «представление», а «индексы» представляют собой индексы. Таким образом, общий смысл заключается в просмотре всех индексов на текущем сервере ES, что очень похоже на команду MySQL «показать таблицы». Ответ сервера следующий.

3) Просмотр одного индекса В Postman отправьте GET-запрос на сервер ES: http://127.0.0.1:9200/shopping

Путь запроса, отправляемого на сервер ES для просмотра индекса, такой же, как и при создании индекса. Однако методы HTTP не совпадают. Здесь вы можете оценить значение RESTful. После запроса сервер отвечает следующим результатом:

{
"shopping"[Index Name]: {
"aliases"[Aliases]: {}, "mappings"[Mappings]: {}, "settings"[Settings]: {
"index"[Settings - Index]: {
"creation_date"[Settings - Index - Creation Time]: "1614265373911", "number_of_shards"[Settings - Index - Number of Primary Shards]: "1", "number_of_replicas"[Settings - Index - Number of Replica Shards]: "1", "uuid"[Settings - Index - Unique Identifier]: "eI5wemRERTumxGCc1bAk2A", "version"[Settings - Index - Version]: {
                 "created": "7080099"
},
"provided_name"[Settings - Index - Name]: "shopping" }
} }
}

4) Удалить индекс В Postman отправьте запрос DELETE на сервер ES: http://127.0.0.1:9200/shopping

При повторном доступе к индексу сервер возвращает ответ: индекс не существует.

2.2.4.2 Операции с документами

  1. Создать документ

Теперь, когда индекс создан, давайте создадим документ и добавим данные. Здесь документ может быть аналогичен данным таблицы в реляционной базе данных, а добавленные данные представлены в формате JSON. В Postman отправьте POST-запрос на сервер ES: http://127.0.0.1:9200/shopping/_doc. Содержимое тела запроса:

{
"title": "Xiaomi Mobile",
"category": "Xiaomi", 
"images": "http://www.gulixueyuan.com/xm.jpg", 
"price": 3999.00
}

Здесь запрос должен быть отправлен с помощью POST, а не PUT, иначе произойдет ошибка.

Сервер отвечает следующим результатом:

{
"_index"[Index]: "shopping",
"_type"[Type-Document]: "_doc",
"_id"[Unique Identifier]: "Xhsa2ncBlvF_7lxyCE9G", #This can be likened to a primary key in MySQL, generated randomly
"_version"[Version]: 1,
"result"[Result]: "created", #The 'create' here indicates that the creation was successful
"_shards"[Shards]: {
"total"[Shards - Total]: 2,
"successful"[Shards - Successful]: 1,
"failed"[Shards - Failed]: 0 },
   "_seq_no": 0,
   "_primary_term": 1
}

После создания указанных выше данных, поскольку уникальный идентификатор (ID) не указан, сервер ES по умолчанию сгенерирует его случайным образом.

Если вы хотите настроить уникальный идентификатор, вам необходимо указать его при создании: http://127.0.0.1:9200/shopping/_doc/1

Обратите внимание: если первичный ключ данных явно указан при добавлении данных, метод запроса также может быть PUT.

2. Просмотр документа

При просмотре документа нужно указать уникальный идентификатор документа, аналогично запросу первичного ключа данных в MySQL. В Postman отправьте GET-запрос на сервер ES: http://127.0.0.1:9200/shopping/_doc/1

После успешного запроса сервер отвечает следующим результатом:

{
"_index"[Index]: "shopping", 
"_type"[Document Type]: "_doc", 
"_id": "1",
"_version": 2,
"_seq_no": 2,
"_primary_term": 2,
"found"[Query Result]: true, # true indicates it was found, false indicates it was not found
"_source"[Document Source Information]: {
"title": "Huawei Phone",
"category": "Huawei",
"images": "http://www.gulixueyuan.com/hw.jpg", 
"price": 4999.00
} }

После успешной модификации сервер ответил следующим результатом:

3. Изменение документа

Как и при добавлении нового документа, при отправке запроса с тем же URL-адресом, если тело запроса будет изменено, существующее содержимое данных будет перезаписано.

В Postman отправьте POST-запрос на сервер ES со следующим URL-адресом: http://127.0.0.1:9200/shopping/_doc/1. Тело запроса должно содержать:

{
  "title": "Huawei Phone",
  "category": "Huawei",
  "images": "http://www.gulixueyuan.com/hw.jpg",
  "price": 4999.00
}

После успешной модификации сервер ответил следующим результатом:

{
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version": 2,
  "result": "updated",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 2,
  "_primary_term": 2
}

4. Изменение поля

При изменении данных также можно изменить только определенную информацию конкретной записи.

В Postman отправьте POST-запрос на сервер ES со следующим URL-адресом: http://127.0.0.1:9200/shopping/_update/1.

Тело запроса должно содержать:

{
"doc": {
   "price":3000.00
  }
}

После успешной модификации сервер отвечает результатом:

В соответствии с уникальной идентификацией запросите данные документа, данные документа были обновлены

5. Удалить документ

При удалении документ не удаляется сразу с диска, а просто помечается как удаленный (захоронен).
В Postman отправьте запрос DELETE на сервер ES: http://127.0.0.1:9200/shopping/ _doc/1

Удаление прошло успешно, и сервер отвечает результатом:

{
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version": 4,
  "result": "deleted",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 4,
  "_primary_term": 2
}

Запрос информации о текущем документе после удаления:

Если вы удаляете несуществующий документ:

{
  "_index": "shopping",
  "_type": "_doc",
  "_id": "1",
  "_version": 1,
  "result": "not_found",
  "_shards": {
    "total": 2,
    "successful": 1,
    "failed": 0
  },
  "_seq_no": 5,
  "_primary_term": 2
}

6. Условное удаление документа

Как правило, данные удаляются на основе уникального идентификатора документа. На практике также возможно удалить несколько записей в зависимости от определенных условий.

Во-первых, давайте добавим несколько записей данных:

{
"title":"Xiaomi Phone",
"category":"Xiaomi",
"images":"http://www.gulixueyuan.com/xm.jpg",
"price":4000.00
}
{
"title":"Huawei Phone",
"category":"Huawei",
"images":"http://www.gulixueyuan.com/hw.jpg",
"price":4000.00
}

Отправьте POST-запрос на сервер ES: http://127.0.0.1:9200/shopping/_delete_by_query

Содержимое тела запроса:

{
"query":{
   "match":{
     "price":4000.00
} }
}

После успешного удаления ответ сервера:

{
"took": 175,
"timed_out": false,
"total": 2,
"deleted": 2,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1.0,
"throttled_until_millis": 0,
"failures": []
}

Дополнительные материалы на PlainEnglish.io.

Подпишитесь на нашу бесплатную еженедельную рассылку новостей. Подпишитесь на нас в Twitter, LinkedIn, YouTube и Discord .