elasticsearch,Php,Curl,elasticsearch" /> elasticsearch,Php,Curl,elasticsearch" />

PHP中的elasticsearch查询和cURL

PHP中的elasticsearch查询和cURL,php,curl,elasticsearch,Php,Curl,elasticsearch,我只是从elasticsearch开始。我想在php中使用cURL进行查询 此代码不提供任何信息。。。(如果从命令行执行,请参阅下面的错误。我不确定此错误是否由控制台中的换行引起…) $url=“curl-s-XGET http://:9200/idx\u occurrence/occurrence/\u search-d” { “已过滤”:{ “查询”:{ “术语”:{“王国解释”:“植物”} } } }' "; $ch=curl_init(); curl_setopt($ch,CURLOPT

我只是从elasticsearch开始。我想在php中使用cURL进行查询

此代码不提供任何信息。。。(如果从命令行执行,请参阅下面的错误。我不确定此错误是否由控制台中的换行引起…)

$url=“curl-s-XGET http://:9200/idx\u occurrence/occurrence/\u search-d”
{
“已过滤”:{
“查询”:{
“术语”:{“王国解释”:“植物”}
}
}
}' ";
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_头,0);
$return=curl\u exec($ch);
var_dump($返回);
但是如果我使用这个url
http://:9200/idx\u occurrence/occurrence/\u search?q=kingdom\u expressed:Plantae

然后我从cURL得到结果

可能是查询筛选器不正确?(我尝试了几种选择,但没有成功)

错误:{“ERROR”:“SearchPhaseExecutionException[未能执行阶段[query],完全失败;shardFailures{[AS6HqxgNRtyU9 pQKhJsXQ][idx_occurrence][3]:SearchParseException[[idx_occurrence][3]:from[-1],size[-1]:解析失败[未能解析源[\n{\n已筛选:{\n查询:{\n术语:{kingdom:Plantae}\n}\n}\n}]];嵌套:SearchParseException[[idx_出现][3]:from[-1],size[-1]:解析失败[No parser for element[filtered]];}{[AS6HqxgNRtyU9 pQKhJsXQ][idx_出现][2]:SearchParseException[[idx_出现][2]:from[-1],size[-1]:解析失败[未能解析源[\n{\n\n已过滤:{\n查询:{\n术语:{kingdom:Plantae}\n}\n}\n}]];嵌套:SearchParseException[[idx_出现][2]:from[-1],size[-1]:解析失败[No parser for element[filtered]];}],“status”:500}


我自己也找到了部分问题的答案。 我设法通过命令行得到它

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='curl-XGET http://:9200/idx\u occurrence/occurrence/\u search?pretty=true
-d\{“查询”:{“查询字符串”:{“字段”:[“王国解释”],
“查询”:“植物”}}}\'';
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$URL);
curl_setopt($ch,CURLOPT_头,0);
ob_start();
curl_exec($ch);
卷曲关闭($ch);
$data=ob_get_contents();
ob_end_clean();
var_dump($数据);
同样,如果我不发送这个$url,而是发送这个url我的url:9200/idx\u occurrence/occurrence/\u search?q=kingdom\u expressed:Plantae


它有效。为什么?

我一直在使用Elastica PHP库进行elasticsearch交互:

它的学习曲线很短。下面是一个例子:

$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\u ResultSet
对象数组。我喜欢Elastica,因为它可以抽象出任何与cURL相关的问题。

这是一个简单的请求演示:

$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);
    $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”和“-d'{…”不是url的一部分-它们是curl命令的命令行参数的一部分。因为您要用curl库替换curl命令,所以应该删除“curl-XGET”顺便说一句,你看到了吗?谢谢,我添加了$options={“query”:{“query_string”:{“fields”:[“kingdom_expressed”],“query”:“Plantae”}}}}};curl_setopt($ch,CURLOPT_POSTFIELDS,$options);等等…$json=json_decode($data,false);foreach($json->hits->hits->hits as$hits){echo$hits->\u source->phylum\u expressed.
}就在昨天,我知道Elastica,但即使API非常完整,我也找不到很多真实的例子。也许是我的错,但我认为更快的方法应该是cURL+PHP。为什么不使用
cURL\u setopt($ch,CURLOPT\u RETURNTRANSFER,1)
而不是
ob*()
?虽然此代码片段可能会解决问题,但确实有助于提高您文章的质量。请记住,您将在将来回答读者的问题,而这些人可能不知道您的代码建议的原因。这是一种不言自明的做法,而且线程中已经有足够的注释解释了过程代码片段中存在我需要的一些注释。
    $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;