Elasticsearch - Convenções de API

Interface de programação de aplicativo (API) na web é um grupo de chamadas de função ou outras instruções de programação para acessar o componente de software naquele aplicativo da web específico. Por exemplo, a API do Facebook ajuda um desenvolvedor a criar aplicativos acessando dados ou outras funcionalidades do Facebook; pode ser data de nascimento ou atualização de status.

Elasticsearch fornece uma API REST, que é acessada por JSON sobre HTTP. Elasticsearch usa algumas convenções que discutiremos agora.

Múltiplos índices

A maioria das operações, principalmente de pesquisa e outras operações, em APIs são para um ou mais índices. Isso ajuda o usuário a pesquisar em vários locais ou em todos os dados disponíveis, executando uma consulta apenas uma vez. Muitas notações diferentes são usadas para realizar operações em vários índices. Discutiremos alguns deles aqui neste capítulo.

Notação separada por vírgulas

POST /index1,index2,index3/_search

Corpo de Solicitação

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

Resposta

Objetos JSON de index1, index2, index3 contendo any_string.

_todas as palavras-chave para todos os índices

POST /_all/_search

Corpo de Solicitação

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

Resposta

Objetos JSON de todos os índices e contendo any_string.

Caracteres curinga (*, +, -)

POST /school*/_search

Corpo de Solicitação

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

Resposta

Objetos JSON de todos os índices que começam com a escola contendo CBSE.

Como alternativa, você também pode usar o seguinte código -

POST /school*,-schools_gov /_search

Corpo de Solicitação

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

Resposta

Objetos JSON de todos os índices que começam com “school”, mas não dechools_gov e tendo CBSE nele.

Existem também alguns parâmetros de string de consulta de URL -

  • ignore_unavailable- Nenhum erro ocorrerá ou nenhuma operação será interrompida, se um ou mais índice (s) presente (s) na URL não existirem. Por exemplo, existe índice de escolas, mas livrarias não existe.

POST /school*,book_shops/_search

Corpo de Solicitação

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

Corpo de Solicitação

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

Considere o seguinte código -

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

Corpo de Solicitação

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

Resposta (sem erro)

Objetos JSON de todos os índices que começam com a escola contendo CBSE.

allow_no_indices

truevalor deste parâmetro evitará erro, se um URL com curinga resultar em nenhum índice. Por exemplo, não há índice que comece comchools_pri -

POST /schools_pri*/_search?allow_no_indices = true

Corpo de Solicitação

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

Resposta (sem erros)

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

expand_wildcards

Este parâmetro decide se os curingas precisam ser expandidos para abrir índices ou índices fechados ou executar ambos. O valor deste parâmetro pode ser aberto e fechado ou nenhum e todos.

Por exemplo, feche escolas de índice -

POST /schools/_close

Resposta

{"acknowledged":true}

Considere o seguinte código -

POST /school*/_search?expand_wildcards = closed

Corpo de Solicitação

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

Resposta

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

Suporte de matemática de datas em nomes de índice

Elasticsearch oferece uma funcionalidade para pesquisar índices de acordo com data e hora. Precisamos especificar a data e a hora em um formato específico. Por exemplo, accountdetail-2015.12.30, index armazenará os detalhes da conta bancária de 30 de dezembro de 2015. As operações matemáticas podem ser realizadas para obter detalhes para uma data específica ou um intervalo de data e hora.

Formato para o nome do índice matemático de data -

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

static_name é uma parte da expressão que permanece a mesma em todos os índices matemáticos de data, como os detalhes da conta. date_math_expr contém a expressão matemática que determina a data e a hora dinamicamente como now-2d. date_format contém o formato no qual a data é gravada em um índice como AAAA.MM.dd. Se a data de hoje for 30 de dezembro de 2015, então <accountdetail- {now-2d {AAAA.MM.dd}}> retornará accountdetail-2015.12.28.

Expressão Resolve para
<accountdetail- {now-d}> accountdetail-2015.12.29
<detalhes da conta- {now-M}> accountdetail-2015.11.30
<detalhes da conta- {agora {AAAA.MM}}> accountdetail-2015.12

Agora veremos algumas das opções comuns disponíveis no Elasticsearch que podem ser usadas para obter a resposta em um formato especificado.

Resultados bonitos

Podemos obter resposta em um objeto JSON bem formatado apenas acrescentando um parâmetro de consulta de URL, ou seja, pretty = true.

POST /schools/_search?pretty = true

Corpo de Solicitação

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

Resposta

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

Saída legível por humanos

Esta opção pode alterar as respostas estatísticas para a forma legível por humanos (se humano = verdadeiro) ou forma legível por computador (se humano = falso). Por exemplo, se human = true então distance_kilometer = 20KM e se human = false então distance_meter = 20000, quando a resposta precisar ser usada por outro programa de computador.

Filtro de Resposta

Podemos filtrar a resposta para menos campos, adicionando-os no parâmetro field_path. Por exemplo,

POST /schools/_search?filter_path = hits.total

Corpo de Solicitação

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

Resposta

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