English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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

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

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

Множественные индексы

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

Символы, разделенные запятыми

POST /index1,index2,index3/_search

Текст запроса

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

Ответ

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

_all все индексы ключевых слов

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-объекты из всех индексов, начинающихся с "school", но не из "school_gov" и содержащих CBSE.

У还有一些 параметры URL запроса:

  • ignore_unavailableЕсли в URL индекса (индексов) отсутствует один или несколько, не произойдет ошибки или остановка операций. Например, индекс school существует, но book_shops не существует.

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

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

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

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, индекс будет хранить детальную информацию о банковских счетах за 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-{now{YYYY.MM}}>accountdetail-2015.12

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

Улучшенный результат

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

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"
   }
}
…………...

Выход, читаемый человеком

Этот параметр позволяет изменить формат статистического ответа на читаемый человеком (если human = true) или машинный (если human = false). Например, если 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}}