запрос elasticsearch и cURL в PHP

Я только начинаю с поиска elastics. Я хочу запросить использование cURL в php.

Этот код ничего не дает … (см. Ошибку ниже, если я выполняю из командной строки. Я не уверен, что эта ошибка вызвана разрывами строк в консоли …)

$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); 

но если я использую этот URL-адрес http://<my_url>:9200/idx_occurrence/Occurrence/_search?q=kingdom_interpreted:Plantae

то я получаю результаты от cURL.

Может быть, фильтр запроса неверен? (Я пробовал несколько вариантов без успеха)

ERROR: {"error": "SearchPhaseExecutionException [Не удалось выполнить фазу [запрос], общий сбой, shardFailures {[AS6HqxgNRtyU9-pQKhJsXQ] [idx_occurrence] [3]: SearchParseException [[idx_occurrence] [3]: from [-1], size [-1]: Parse Failure [Не удалось проанализировать исходный код [\ n {\ n filter: {\ n query: {\ n term: {kingdom: Plantae} \ n} \ n} \ n}]]]; : SearchParseException [[idx_occurrence] [3]: from [-1], size [-1]: Parse Failure [Нет парсера для элемента [filter]]];} {[AS6HqxgNRtyU9-pQKhJsXQ] [idx_occurrence] [2]: SearchParseException [[idx_occurrence] [2]: from [-1], size [-1]: Parse Failure [Не удалось проанализировать источник [\ n {\ n filter: {\ n query: {\ n term: {kingdom: Plantae} \ n} \ n} \ n}]]]; inested: SearchParseException [[idx_occurrence] [2]: from [-1], size [-1]: Parse Failure [Нет парсера для элемента [filter]]];} ]», "статус": 500}

Я использую библиотеку Elastica PHP для взаимодействия с elasticsearch:

https://github.com/ruflin/Elastica

У него была очень короткая кривая обучения. Вот пример:

 $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); 

Это иллюстрирует поиск строки запроса, ограниченный определенным полем. $searchResults – это массив объектов Elastica_ResultSet . Мне нравится Elastica, потому что он абстрагирует любые связанные с CURL проблемы.

Я сам нашел ответ на часть вопроса. Мне удалось получить его по командной строке.

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

используя PHP для выполнения (правильного) запроса cURL, просто отправляет обратно пустую строку. Ошибок в журналах 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); 

Опять же, если вместо этого $ url я отправляю этот url my_url: 9200 / idx_occurrence / Occurrence / _search? Q = kingdom_interpreted: Plantae

Оно работает. Зачем?

это простая демонстрация запроса:

  $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; 
 $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);