Elasticsearch - Соглашения API

Интерфейс прикладного программирования (API) в сети - это группа вызовов функций или других программных инструкций для доступа к программному компоненту в этом конкретном веб-приложении. Например, Facebook API помогает разработчику создавать приложения, получая доступ к данным или другим функциям из Facebook; это может быть дата рождения или обновление статуса.

Elasticsearch предоставляет REST API, доступ к которому осуществляется через JSON через HTTP. Elasticsearch использует некоторые соглашения, которые мы сейчас обсудим.

Несколько индексов

Большинство операций, в основном поиск и другие операции, в API предназначены для одного или нескольких индексов. Это помогает пользователю выполнять поиск в нескольких местах или по всем доступным данным, просто выполнив запрос один раз. Для выполнения операций с несколькими индексами используется множество различных обозначений. Мы обсудим некоторые из них в этой главе.

Обозначение, разделенное запятыми

POST /index1,index2,index3/_search

Тело запроса

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

отклик

Объекты JSON из index1, index2, index3, содержащие any_string.

_все ключевые слова для всех индексов

POST /_all/_search

Тело запроса

{
   "query":{
      "query_string":{
         "query":"any_string"
      }
   }
}

отклик

Объекты JSON из всех индексов и имеющие в нем any_string.

Подстановочные знаки (*, +, -)

POST /school*/_search

Тело запроса

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

отклик

Объекты JSON из всех индексов, которые начинаются со школы, в которой есть CBSE.

В качестве альтернативы вы также можете использовать следующий код -

POST /school*,-schools_gov /_search

Тело запроса

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

отклик

Объекты JSON из всех индексов, которые начинаются со слова «школа», но не из schools_gov и содержат в себе CBSE.

Есть также некоторые параметры строки запроса URL -

  • ignore_unavailable- Ошибка не произойдет или операция не будет остановлена, если один или несколько индексов, присутствующих в URL, не существуют. Например, индекс школ существует, а книжных магазинов нет.

POST /school*,book_shops/_search

Тело запроса

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

Тело запроса

{
   "error":{
      "root_cause":[{
         "type":"index_not_found_exception", "reason":"no such index",
         "resource.type":"index_or_alias", "resource.id":"book_shops",
         "index":"book_shops"
      }],
      "type":"index_not_found_exception", "reason":"no such index",
      "resource.type":"index_or_alias", "resource.id":"book_shops",
      "index":"book_shops"
   },"status":404
}

Рассмотрим следующий код -

POST /school*,book_shops/_search?ignore_unavailable = true

Тело запроса

{
   "query":{
      "query_string":{
         "query":"CBSE"
      }
   }
}

Ответ (без ошибок)

Объекты JSON из всех индексов, которые начинаются со школы, в которой есть CBSE.

allow_no_indices

trueзначение этого параметра предотвратит ошибку, если URL с подстановочным знаком не дает индексов. Например, не существует индекса, который начинается с schools_pri -

POST /schools_pri*/_search?allow_no_indices = true

Тело запроса

{
   "query":{
      "match_all":{}
   }
}

Ответ (без ошибок)

{
   "took":1,"timed_out": false, "_shards":{"total":0, "successful":0, "failed":0},
   "hits":{"total":0, "max_score":0.0, "hits":[]}
}

expand_wildcards

Этот параметр определяет, нужно ли расширять подстановочные знаки до открытых индексов или закрытых индексов или выполнять и то и другое. Значение этого параметра может быть открытым и закрытым или ни одного и всех.

Например, закрытые индексные школы -

POST /schools/_close

отклик

{"acknowledged":true}

Рассмотрим следующий код -

POST /school*/_search?expand_wildcards = closed

Тело запроса

{
   "query":{
      "match_all":{}
   }
}

отклик

{
   "error":{
      "root_cause":[{
         "type":"index_closed_exception", "reason":"closed", "index":"schools"
      }],
      "type":"index_closed_exception", "reason":"closed", "index":"schools"
   }, "status":403
}

Поддержка математических дат в именах индексов

Elasticsearch предлагает функцию поиска индексов по дате и времени. Нам нужно указать дату и время в определенном формате. Например, accountdetail-2015.12.30, index будет хранить реквизиты банковского счета на 30 декабря 2015 года. Можно выполнять математические операции, чтобы получить детали для конкретной даты или диапазона дат и времени.

Формат имени математического индекса даты -

<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search

static_name - это часть выражения, которая остается неизменной в каждом математическом индексе даты, как и сведения об учетной записи. date_math_expr содержит математическое выражение, которое определяет дату и время динамически, как now-2d. date_format содержит формат, в котором дата записывается в виде индекса, например YYYY.MM.dd. Если сегодняшняя дата - 30 декабря 2015 года, то <accountdetail- {now-2d {YYYY.MM.dd}}> вернет accountdetail-2015.12.28.

Выражение Постановляет
<accountdetail- {now-d}> accountdetail-2015.12.29
<accountdetail- {now-M}> accountdetail-2015.11.30
<accountdetail- {сейчас {YYYY.MM}}> accountdetail-2015.12

Теперь мы увидим некоторые общие параметры, доступные в Elasticsearch, которые можно использовать для получения ответа в указанном формате.

Хорошие результаты

Мы можем получить ответ в виде хорошо отформатированного объекта JSON, просто добавив параметр запроса URL, то есть pretty = true.

POST /schools/_search?pretty = true

Тело запроса

{
   "query":{
      "match_all":{}
   }
}

отклик

……………………..
{
   "_index" : "schools", "_type" : "school", "_id" : "1", "_score" : 1.0,
   "_source":{
      "name":"Central School", "description":"CBSE Affiliation",
      "street":"Nagan", "city":"paprola", "state":"HP", "zip":"176115",
      "location": [31.8955385, 76.8380405], "fees":2000,
      "tags":["Senior Secondary", "beautiful campus"], "rating":"3.5"
   }
}
………………….

Человекочитаемый вывод

Эта опция может изменить статистические ответы либо в удобочитаемой форме (если человек = true), либо в удобочитаемой форме (если человек = ложь). Например, если human = true, то distance_kilometer = 20KM, а если human = false, то distance_meter = 20000, когда ответ должен использоваться другой компьютерной программой.

Фильтрация ответов

Мы можем отфильтровать ответ на меньшее количество полей, добавив их в параметр field_path. Например,

POST /schools/_search?filter_path = hits.total

Тело запроса

{
   "query":{
      "match_all":{}
   }
}

отклик

{"hits":{"total":3}}