2012-07-25 16 views
7

मैं सिर्फ elasticsearch के साथ शुरू कर रहा हूँ। मैं php में curl का उपयोग कर क्वेरी करना चाहता हूँ।PHP में elasticsearch क्वेरी और 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: {"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 बातचीत के लिए Elastica पीएचपी पुस्तकालय का उपयोग किया गया:

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

यह एक क्वेरी स्ट्रिंग खोज को किसी विशिष्ट फ़ील्ड तक सीमित करता है। $searchResultsElastica_ResultSet ऑब्जेक्ट्स की एक सरणी है। मुझे एलिस्टिका पसंद है क्योंकि यह किसी भी कर्ल से संबंधित मुद्दों को दूर करता है।

1

मुझे प्रश्न का हिस्सा खुद जवाब मिला है। मैं इसे कमांड लाइन से प्राप्त करने में कामयाब रहा।

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

(सही) कर्ल अनुरोध निष्पादित करने के लिए PHP का उपयोग करके बस एक खाली स्ट्रिंग भेजता है। 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); 

फिर, अगर यह $ यूआरएल के बजाय मैं इस यूआरएल my_url भेज: 9200/idx_occurrence/घटना/_search q = kingdom_interpreted: प्लांटी

यह काम करता है। क्यूं कर?

+0

"curl -XGET" और "-d '{...." यूआरएल का हिस्सा नहीं हैं - वे कमांड लाइन तर्कों का हिस्सा हैं कर्ल कमांड। चूंकि आप कर्ल लाइब्रेरी के साथ कर्ल कमांड को प्रतिस्थापित कर रहे हैं, इसलिए आपको "curl -XGET" ड्रॉप करना चाहिए और डेटा डेटा के रूप में -d ध्वज के बाद डेटा पास करना चाहिए। वैसे, क्या आपने [एलिस्टिका] देखा है (https://github.com/ruflin/Elastica)? – imotov

+1

धन्यवाद, मैं $ विकल्प = '{: { "QUERY_STRING": { "क्षेत्रों": [ "kingdom_interpreted"], "क्वेरी": "क्वेरी" "प्लांटी"}}}' जोड़ा; curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ विकल्प); आदि आदि ... $ json = json_decode ($ डेटा, झूठी); foreach ($ json-> हिट-> $ हिट के रूप में हिट) { \t प्रतिबिंबित $ हिट -> _ स्रोत-> phylum_interpreted।'
'; } बस कल मैं एलिस्टिका को जानता था, लेकिन अगर एपीआई काफी पूरा हो गया है तो भी मुझे कई वास्तविक उदाहरण नहीं मिल सकते हैं। शायद यह मेरी गलती है, लेकिन मैंने सोचा कि एक तेज तरीका 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;