запрос elasticsearch и CURL в PHP


Я только начинаю с elasticsearch. Я хочу сделать запрос с помощью 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.

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

ОШИБКА: {"ошибка": "Исключение searchphaseexecutionexception[Не удалось этап выполнения [запрос], полный сбой; shardfailures{[as6hqxgnrtyu9-pqkhjsxq][idx_occurrence][3]: Исключение searchparseexception[[idx_occurrence][3]: из [-1], размер[-1]: Сбой синтаксического анализа [Не удалось проанализировать источник [\n{\n отфильтровано: {\n запрос: {\n термин: {королевство: Растения}\n}\n}\n}]]]; вложенный: Исключение searchparseexception[[idx_occurrence][3]: из [-1], размер[-1]: Ошибка синтаксического анализа [Нет анализатора для элемента [отфильтрованный]]]; }{[as6hqxgnrtyu9-pqkhjsxq][idx_occurrence][2]: Исключение searchparseexception[[idx_occurrence][2]: из [-1], размер[-1]: Ошибка синтаксического анализа [Не удалось проанализировать источник [\n{\n отфильтровано: {\n запрос: {\n термин: {королевство: Растения}\n}\n}\n}]]]; вложенный: Исключение searchparseexception[[idx_occurrence][2]: из[-1], размер[-1]: Ошибка синтаксического анализа [Нет синтаксического анализатора для элемента [отфильтровано]]]; }]", "статус" :500}

Author: nhahtdh, 2012-07-25

4 answers

Я использую PHP-библиотеку Elastica для взаимодействия с 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. Мне нравится эластика, потому что она абстрагирует любые проблемы, связанные с завитками.

 6
Author: Todd Holmberg, 2012-08-24 15:25:41

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

    $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;
 2
Author: www.atob.site, 2017-03-22 06:39:35

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

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/Возникновение/_search?q=королевство_интерпретировано: Растения

Это работает. Почему?

 1
Author: user1249791, 2012-10-11 16:20:12
$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
Author: Anuga, 2016-09-27 12:27:57