Я только начинаю с поиска 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);