for - consulta de búsqueda elástica y cURL en PHP
kibana php (4)
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.
Estoy empezando con elasticsearch. Quiero consultar utilizando cURL en php.
Este código no da nada ... (vea el error a continuación si ejecuto desde la línea de comandos. No estoy seguro de que este error sea causado por los 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 uso 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 [Error al ejecutar la fase [consulta], falla total; shardFailures {[AS6HqxgNRtyU9-pQKhJsXQ] [idx_occurrence] [3]: SearchParseException [[idx_occurrence] [3]: from [-1], size [-1]: Parse Failure [Falló al analizar el origen [/ n {/ n filtered: {/ n query: {/ n term: {kingdom: Plantae} / n} / n} / n}]]]; anidado : SearchParseException [[idx_occurrence] [3]: from [-1], size [-1]: Parse Failure [No hay analizador para el elemento [filtrado]]];} {[AS6HqxgNRtyU9-pQKhJsXQ] [idx_occurrence] [2]: SearchParseException [[idx_occurrence] [2]: from [-1], size [-1]: Parse Failure [Falló al analizar el origen [/ n {/ n filtered: {/ n query: {/ n term: {kingdom: Plantae} / n} / n} / n}]]]; anidado: SearchParseException [[idx_occurrence] [2]: from [-1], size [-1]: Parse Failure [No hay analizador para el elemento [filtrado]]];} ] "," estado ": 500}
He encontrado una respuesta yo mismo a 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" } } }''
el uso de PHP para ejecutar la solicitud (correcta) de cURL solo 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);
De nuevo, si en lugar de este $ url le envío esta URL my_url: 9200 / idx_occurrence / Occurrence / _search? Q = kingdom_interpreted: Plantae
Funciona. ¿Por qué?
$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);
esta es una demo de solicitud simple:
$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;