rails - pasando los datos json en elasticsearch get request usando rest-client ruby gem
elasticsearch model gem (2)
¿Cómo ejecuto la consulta siguiente (dada en doc ) usando el cliente de reposo?
curl -XGET ''http://localhost:9200/twitter/tweet/_search'' -d ''{
"query" : {
"term" : { "user" : "kimchy" }
}
}
''
Intenté hacer esto:
q = ''{
"query" : {
"term" : { "user" : "kimchy" }
}
}
''
r = JSON.parse(RestClient.get(''http://localhost:9200/twitter/tweet/_search'', q))
Esto arrojó un error:
in `process_url_params'': undefined method `delete_if'' for #<String:0x8b12e18> (NoMethodError)
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:40:in `initialize''
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `new''
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient/request.rb:33:in `execute''
from /home/socialapps/.rvm/gems/ruby-1.9.3-p194/gems/rest-client-1.6.7/lib/restclient.rb:68:in `get''
from get_check2.rb:12:in `<main>''
Cuando hago lo mismo usando RestClient.post
, ¡me da los resultados correctos !. Pero el documento elásticosearch utiliza el XGET
in curl para la consulta de búsqueda y no XPOST
. ¿Cómo hago para que RestClient.get
método RestClient.get
?
Si hay formas alternativas / mejores para realizar esta acción, sugiéralas.
RestClient no puede enviar cuerpos de solicitud con GET
. Tienes dos opciones:
Pase su consulta como el parámetro URL de source
:
require ''rest_client''
require ''json''
# RestClient.log=STDOUT # Optionally turn on logging
q = ''{
"query" : { "term" : { "user" : "kimchy" } }
}
''
r = JSON.parse /
RestClient.get( ''http://localhost:9200/twitter/tweet/_search'',
params: { source: q } )
puts r
... o simplemente usa POST
.
ACTUALIZACIÓN: corrigió el paso incorrecto del parámetro URL, params
hash de params
.
En caso de que alguien más encuentre esto. Es posible, aunque no recomendado, enviar cuerpos de solicitud con GET utilizando el método interno de solicitud que utiliza la API principal para crear sus llamadas.
RestClient::Request.execute( method: :get,
url: ''http://localhost:9200/twitter/tweet/_search'',
payload: {source: q} )
Mira aquí para más detalles.