2012-07-25 16 views
7

私はelasticsearchで始まっています。私はPHPでcURLを使用してクエリを行いたい。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); 

...何も与えないが、私の場合このURLを使用してくださいhttp://<my_url>:9200/idx_occurrence/Occurrence/_search?q=kingdom_interpreted:Plantae

私はcURLから結果を取得します。

クエリフィルタが正しくない可能性がありますか? (私は成功せず、いくつかのオプションを試してみました)

ERROR: {"error":"SearchPhaseExecutionException[Failed to execute phase [query], total failure; shardFailures {[AS6HqxgNRtyU9-pQKhJsXQ][idx_occurrence][3]: SearchParseException[[idx_occurrence][3]: from[-1],size[-1]: Parse Failure [Failed to parse source [\n{\n filtered : {\n query : {\n term : { kingdom : Plantae }\n }\n}\n}]]]; nested: SearchParseException[[idx_occurrence][3]: from[-1],size[-1]: Parse Failure [No parser for element [filtered]]]; }{[AS6HqxgNRtyU9-pQKhJsXQ][idx_occurrence][2]: SearchParseException[[idx_occurrence][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [\n{\n filtered : {\n query : {\n term : { kingdom : Plantae }\n }\n}\n}]]]; nested: SearchParseException[[idx_occurrence][2]: from[-1],size[-1]: Parse Failure [No parser for element [filtered]]]; }]","status":500}

+0

、私は取得しています同様のエラーがhttp://stackoverflow.com/questions/8746086/debugging-elasticsearch ここに解決され、私は同様のクエリを作成しました(クエリ構文は有効なはずです...) – user1249791

答えて

6

私は私のelasticsearch相互作用のためのエラスティカ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関連の問題を抽象化するからです。

1

私は質問の一部に答え自分自身を発見しました。 私はそれをコマンドラインで入手することができました。

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

PHPを使用して(正しい)cURLリクエストを実行すると、空の文字列が返されます。 PHPログにエラーはありません。 ?9200/idx_occurrence /発生/ _search Q = kingdom_interpreted:代わりにこの$のURLの私は、このURLのmy_url送信する場合

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

ここでも、植物界

をそれは動作します。どうして?

+0

"curl -XGET"と "-d '{...."はURLの一部ではありません。カールコマンド。 curlコマンドをcurlライブラリに置き換えているので、 "curl -XGET"を落とし、-dフラグのあとにデータをPOSTデータとして渡す必要があります。ところで、あなたは[Elastica](https://github.com/ruflin/Elastica)を見たことがありますか? – imotov

+1

ありがとう、私は追加しました $ options = '{"クエリ":{"クエリ"文字列 ":"フィールド ":[" kingdom_interpreted "]"クエリ ":" Plantae "}}}' '; curl_setopt($ ch、CURLOPT_POSTFIELDS、$ options); など... $ json = json_decode($ data、false); foreach($ json-> hits->ヒット数が$ヒット) { \t echo $ hits - > _ source-> phylum_interpretedです。'
'; } 昨日私はElasticaを知っていましたが、APIがかなり完成していても実際の例は多く見つかりませんでした。たぶんそれは私のせいですが、私はより速い方法がcURL + PHPだと思っていました。 – user1249791

+1

なぜob_ *()の代わりに 'curl_setopt($ ch、CURLOPT_RETURNTRANSFER、1)'を使わないのですか? –

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

このコードスニペットは問題を解決するかもしれませんが、[説明を含む](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)は本当にあなたの投稿の質を向上させるのに役立ちます。将来読者の質問に答えていることを覚えておいてください。そうした人々はあなたのコード提案の理由を知らないかもしれません。 – andreas

+0

それだけではわかりませんが、すでにプロセスを説明しているスレッドに十分なコメントがあります。 コードスニペットに必要なコメントがいくつかあります。 – Anuga

1

これは単純な要求のデモです:ところで

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