簡體   English   中英

彈性搜索查詢和PHP中的cURL

[英]elasticsearch query and cURL in PHP

我剛開始使用elasticsearch。 我想在php中使用cURL進行查詢。

這段代碼什么都沒有...(如果我從命令行執行,請參閱下面的錯誤。我不確定這個錯誤是否是由於控制台中的換行...)

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

但如果我使用這個網址http://<my_url>:9200/idx_occurrence/Occurrence/_search?q=kingdom_interpreted:Plantae

然后我從cURL得到結果。

也許可能查詢過濾器不正確? (我嘗試了幾個選項沒有成功)

錯誤:{“error”:“SearchPhaseExecutionException [無法執行階段[查詢],完全失敗; shardFailures {[AS6HqxgNRtyU9-pQKhJsXQ] [idx_occurrence] [3]:SearchParseException [[idx_occurrence] [3]:from [-1], size [-1]:解析失敗[無法解析源[\\ n {\\ n已過濾:{\\ n查詢:{\\ n term:{kingdom:Plantae} \\ n} \\ n} \\ n} \\ n}]]];嵌套:SearchParseException [[idx_occurrence] [3]:from [-1],size [-1]:Parse Failure [沒有解析器元素[filtered]]];} {[AS6HqxgNRtyU9-pQKhJsXQ] [idx_occurrence] [2]:SearchParseException [[idx_occurrence] [2]:from [-1],size [-1]:Parse Failure [無法解析源[\\ n {\\ n filtered:{\\ n query:{\\ n term:{kingdom:Plantae}} \\ n} \\ n} \\ n}]]];嵌套:SearchParseException [[idx_occurrence] [2]:from [-1],size [-1]:Parse Failure [沒有元素[filtered]的解析器]];} ]”, “狀態”:500}

我一直在使用Elastica PHP庫進行彈性搜索交互:

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相關的問題。

這是一個簡單的請求演示:

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

我自己找到了答案的一部分。 我設法通過命令行獲取它。

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

有用。 為什么?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM