簡體   English   中英

使用PHP的Elasticsearch多個術語搜索Json Query構建器

[英]Elasticsearch multiple term search Json Query builder with PHP

我正在Codeigniter框架中實現ElasticSearch。 我的托管公司不允許在托管服務器中提供ES服務,因此我正在使用Facetflow的免費選項測試ES系統,以將ES安裝在遠程服務器上。

我在這里使用ES / Codeigniter庫: https : //github.com/confact/elasticsearch-codeigniter-library

我可以做一個簡單的搜索,但是由於不了解如何在不使用ES Client PHP API的情況下使用PHP構建查詢,因此只能進行多個術語搜索。

我執行簡單搜索的功能如下:

private function call($path, $method = 'GET', $data = null)
{
    if (!$this -> index) {
        throw new Exception('$this->index needs a value');
    }
    $url = $this -> server . '/' . $this -> index . '/' . $path;
    $headers = array('Accept: application/json', 'Content-Type: application/json', );
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    switch($method) {
        case 'GET' :
            break;
        case 'POST' :
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
            break;
        case 'PUT' :
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
            break;
        case 'DELETE' :
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
            break;
    }
    $response = curl_exec($ch);
    $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    return json_decode($response, true);
}
public function query($type, $q)
{
    return $this -> call($type . '/_search?' . http_build_query(array('q' => $q)));
}

調用搜索,我利用

query('','Do My Search');

要得到:

curl -XGET 'http://domain/_search?q=Do+My+Search'

建立多詞搜索查詢以創建以下內容需要做什么?

curl -XGET https://domain/type/_search -d '{ "query": { "filtered": { "query": { "query_string": 
{ "query": "Car For Sale" } }, 
"filter": { "bool" : { "must" : [ 
{"term" : { "provid" : "5" } }, 
{"term" : { "areaid" : "16" } }, 
{"term" : { "catid" : "3" } } ] } } } } }'

你不遠。 用JSON編寫查詢。 可以在POST請求中將其作為正文傳遞。 call()函數已經可以處理POST和主體數據。

$path = 'https://domain/type/_search';
$data = '{ "query": { "match_all": {} } }';
call($path, 'POST', $data);

注意:不需要Content-Type: application/json標頭。 您實際上可以完全省略標題,Elasticsearch將使用JSON進行響應。

暫無
暫無

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

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