Elasticsearch - Convenciones de API
La interfaz de programación de aplicaciones (API) en la web es un grupo de llamadas a funciones u otras instrucciones de programación para acceder al componente de software en esa aplicación web en particular. Por ejemplo, la API de Facebook ayuda a un desarrollador a crear aplicaciones accediendo a datos u otras funcionalidades de Facebook; puede ser fecha de nacimiento o actualización de estado.
Elasticsearch proporciona una API REST, a la que se accede mediante JSON a través de HTTP. Elasticsearch usa algunas convenciones que discutiremos ahora.
Múltiples índices
La mayoría de las operaciones, principalmente búsquedas y otras operaciones, en las API son para uno o más índices. Esto ayuda al usuario a buscar en varios lugares o en todos los datos disponibles con solo ejecutar una consulta una vez. Se utilizan muchas notaciones diferentes para realizar operaciones en múltiples índices. Discutiremos algunos de ellos aquí en este capítulo.
Notación separada por comas
POST /index1,index2,index3/_search
Cuerpo de solicitud
{
"query":{
"query_string":{
"query":"any_string"
}
}
}
Respuesta
Objetos JSON de index1, index2, index3 que tienen any_string en él.
_todas palabras clave para todos los índices
POST /_all/_search
Cuerpo de solicitud
{
"query":{
"query_string":{
"query":"any_string"
}
}
}
Respuesta
Objetos JSON de todos los índices y que tengan any_string.
Comodines (*, +, -)
POST /school*/_search
Cuerpo de solicitud
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Respuesta
Objetos JSON de todos los índices que comienzan con la escuela y tienen CBSE.
Alternativamente, también puede usar el siguiente código:
POST /school*,-schools_gov /_search
Cuerpo de solicitud
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Respuesta
Objetos JSON de todos los índices que comienzan con “school” pero no de schools_gov y tienen CBSE.
También hay algunos parámetros de cadena de consulta de URL:
- ignore_unavailable- No ocurrirá ningún error o no se detendrá ninguna operación, si uno o más índices presentes en la URL no existen. Por ejemplo, existe un índice de escuelas, pero no existe book_shops.
POST /school*,book_shops/_search
Cuerpo de solicitud
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Cuerpo de solicitud
{
"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 el siguiente código:
POST /school*,book_shops/_search?ignore_unavailable = true
Cuerpo de solicitud
{
"query":{
"query_string":{
"query":"CBSE"
}
}
}
Respuesta (sin error)
Objetos JSON de todos los índices que comienzan con la escuela y tienen CBSE.
allow_no_indices
trueEl valor de este parámetro evitará errores, si una URL con comodines no da como resultado índices. Por ejemplo, no hay un índice que comience con schools_pri -
POST /schools_pri*/_search?allow_no_indices = true
Cuerpo de solicitud
{
"query":{
"match_all":{}
}
}
Respuesta (sin errores)
{
"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 si los comodines deben expandirse a índices abiertos o índices cerrados o realizar ambos. El valor de este parámetro puede ser abierto y cerrado o ninguno y todos.
Por ejemplo, cerrar escuelas indexadas:
POST /schools/_close
Respuesta
{"acknowledged":true}
Considere el siguiente código:
POST /school*/_search?expand_wildcards = closed
Cuerpo de solicitud
{
"query":{
"match_all":{}
}
}
Respuesta
{
"error":{
"root_cause":[{
"type":"index_closed_exception", "reason":"closed", "index":"schools"
}],
"type":"index_closed_exception", "reason":"closed", "index":"schools"
}, "status":403
}
Soporte matemático de fechas en nombres de índices
Elasticsearch ofrece una funcionalidad para buscar índices según fecha y hora. Necesitamos especificar la fecha y la hora en un formato específico. Por ejemplo, accountdetail-2015.12.30, index almacenará los detalles de la cuenta bancaria del 30 de diciembre de 2015. Se pueden realizar operaciones matemáticas para obtener detalles para una fecha particular o un rango de fecha y hora.
Formato para el nombre del índice matemático de fecha -
<static_name{date_math_expr{date_format|time_zone}}>
/<accountdetail-{now-2d{YYYY.MM.dd|utc}}>/_search
static_name es una parte de la expresión que permanece igual en todos los índices matemáticos de fecha, como el detalle de la cuenta. date_math_expr contiene la expresión matemática que determina la fecha y la hora dinámicamente como ahora-2d. date_format contiene el formato en el que se escribe la fecha en un índice como AAAA.MM.dd. Si la fecha de hoy es el 30 de diciembre de 2015, <accountdetail- {now-2d {YYYY.MM.dd}}> devolverá accountdetail-2015.12.28.
Expresión | Resuelve |
---|---|
<accountdetail- {ahora-d}> | accountdetail-2015.12.29 |
<accountdetail- {ahora-M}> | accountdetail-2015.11.30 |
<accountdetail- {ahora {YYYY.MM}}> | accountdetail-2015.12 |
Ahora veremos algunas de las opciones comunes disponibles en Elasticsearch que se pueden usar para obtener la respuesta en un formato específico.
Bonitos resultados
Podemos obtener respuesta en un objeto JSON bien formateado simplemente agregando un parámetro de consulta de URL, es decir, pretty = true.
POST /schools/_search?pretty = true
Cuerpo de solicitud
{
"query":{
"match_all":{}
}
}
Respuesta
……………………..
{
"_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"
}
}
………………….
Salida legible por humanos
Esta opción puede cambiar las respuestas estadísticas a una forma legible por humanos (si humano = verdadero) o una forma legible por computadora (si humano = falso). Por ejemplo, si humano = verdadero, distancia_kilómetro = 20KM y si humano = falso, distancia_metro = 20000, cuando la respuesta deba ser utilizada por otro programa de computadora.
Filtrado de respuestas
Podemos filtrar la respuesta a menos campos agregándolos en el parámetro field_path. Por ejemplo,
POST /schools/_search?filter_path = hits.total
Cuerpo de solicitud
{
"query":{
"match_all":{}
}
}
Respuesta
{"hits":{"total":3}}