2012-07-25 7 views
7

Estoy empezando con elasticsearch. Quiero consultar utilizando cURL en php.consulta de búsqueda elástico y cURL en PHP

Este código da nada ... (ver el error a continuación si ejecuto desde la línea de comandos. No estoy seguro de que este error se debe de saltos de línea en la consola ...)

$url = "curl -s -XGET http://<my_url>:9200/idx_occurrence/Occurrence/_search -d ' 
{ 
'filtered' : { 
    'query' : { 
     'term' : { 'kingdom_interpreted' : 'Plantae' } 
    } 
} 

}' "; 

$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 

curl_setopt($ch, CURLOPT_HEADER, 0); 

$return=curl_exec($ch); 

var_dump($return); 

pero si use esta url http://<my_url>:9200/idx_occurrence/Occurrence/_search?q=kingdom_interpreted:Plantae

luego obtengo los resultados de cURL.

¿Tal vez el filtro de consulta es incorrecto? (Probé varias opciones sin éxito)

ERROR: {"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[AS6HqxgNRtyU9-pQKhJsXQ][idx_occurrence][3]: SearchParseException[[idx_occurrence][3]: from[-1],size[-1]: Parse Failure [Failed to parse source [\n{\n filtered : {\n query : {\n term : { kingdom : Plantae }\n }\n}\n}]]]; nested: SearchParseException[[idx_occurrence][3]: from[-1],size[-1]: Parse Failure [No parser for element [filtered]]]; }{[AS6HqxgNRtyU9-pQKhJsXQ][idx_occurrence][2]: SearchParseException[[idx_occurrence][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [\n{\n filtered : {\n query : {\n term : { kingdom : Plantae }\n }\n}\n}]]]; nested: SearchParseException[[idx_occurrence][2]: from[-1],size[-1]: Parse Failure [No parser for element [filtered]]]; }]","status":500}

+0

por cierto, un error similar que estoy recibiendo se resuelve aquí http://stackoverflow.com/questions/8746086/debugging-elasticsearch así que hice una consulta similar (la sintaxis de la consulta debería ser válida, entonces ...) – user1249791

Respuesta

6

He estado usando la biblioteca Elastica PHP para mis interacciones Elasticsearch:

https://github.com/ruflin/Elastica

Tenía una curva de aprendizaje muy corta. Aquí hay un ejemplo:

$client = new Elastica_Client(); 
$index = $client->getIndex('idx_occurrence'); 
$index->getType('Occurrence'); 

$query_string = new Elastica_Query_QueryString('Plantae'); 
$query_string->setFields(array('kingdom_interpreted'));  
$query = new Elastica_Query($query_string); 

$index->refresh(); 
$searchResults = $index->search($query); 

Esto ilustra una búsqueda Cadena de consulta limitada a un campo específico. $searchResults es una matriz de objetos Elastica_ResultSet. Me gusta Elastica porque abstrae cualquier problema relacionado con cURL.

1

He encontrado la respuesta a una parte de la pregunta. Logré obtenerlo por línea de comando.

curl -XGET my_server:9200/idx_occurrence/Occurrence/_search?pretty=true -d '{ "query": { "query_string" :{"fields" : ["kingdom_interpreted"], "query": "Plantae" } } }' 

usando PHP para ejecutar la (correcta) solicitud cURL simplemente devuelve una cadena vacía. No hay errores en los registros de PHP.

$url='curl -XGET http://<my_url>:9200/idx_occurrence/Occurrence/_search?pretty=true 
-d \'{ "query": { "query_string" :{ "fields" : ["kingdom_interpreted"], 
"query": "Plantae" } } }\''; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
ob_start(); 
curl_exec ($ch); 
curl_close ($ch); 
$data = ob_get_contents(); 
ob_end_clean(); 
var_dump($data); 

Una vez más, si en lugar de esto $ url envío esta url my_url:? 9200/idx_occurrence/Frecuencia/_search q = kingdom_interpreted: Plantae

Funciona. ¿Por qué?

+0

"curl -XGET" y "-d '{...." no son parte de la url; son parte de los argumentos de línea de comando del curl comando. Como está reemplazando el comando curl con la biblioteca curl, debe soltar "curl -XGET" y pasar los datos después del indicador -d como datos POST. Por cierto, ¿has visto [Elastica] (https://github.com/ruflin/Elastica)? – imotov

+1

gracias, agregué $ options = '{"query": {"query_string": {"fields": ["kingdom_interpreted"], "query": "Plantae"}}}'; curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ options); etc etc ... $ json = json_decode ($ data, false); foreach ($ json-> hits-> hits as $ hits) { \t echo $ hits -> _ fuente-> phylum_interpreted.'
'; } Ayer conocía Elastica, pero incluso si la API es bastante completa, no puedo encontrar muchos ejemplos reales. Tal vez es mi culpa, pero pensé que una forma más rápida sería cURL + PHP. – user1249791

+1

¿por qué no usar 'curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1)' en lugar de 'ob _ *()'? –

0
$search = 'Plantae'; //search query 
$fields = 'kingdom_interpreted'; //fields to look in 
$results = file_get_contents('http://server:port/idx_occurrence/Occurrence/_search?q='.$search.'&fields='.$fields); 
+0

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. – andreas

+0

Tipo de autoexplicativo, además ya hay suficientes comentarios en el hilo que explica el proceso. Mis pocos comentarios necesarios existen en el fragmento de código. – Anuga

1

esto es un simple demostración solicitud:

$param = " 
     { 
     'filtered' : { 
      'query' : { 
       'term' : { 'kingdom_interpreted' : 'Plantae' } 
      } 
     } 

     }"; 
    $header = array(
     "content-type: application/x-www-form-urlencoded; charset=UTF-8" 
    ); 

    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, "http://xxxxx:9200/idx_occurrence/Occurrence/_search"); 
    curl_setopt($curl,CURLOPT_HTTPHEADER, $header); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $param); 
    $res = curl_exec($curl); 
    curl_close($curl); 
    return $res;