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}}