1. 程式人生 > >elasticsearch在php中的使用

elasticsearch在php中的使用

elasticsearch 環境搭建(windows)

安裝es

要執行es,首先得安裝配置 jdk,具體的步驟谷歌即可。基本的環境配置好之後,就可以去官網上下載 windows 專屬的 zip 壓縮包了。es 6.0.0下載地址,下載好直接開啟 bin 目錄下的 elasticsearch.bat 檔案就可以了。這時使用瀏覽器訪問 localhost:9200 應該就能看es的相關版本資訊了。

安裝head外掛

這個外掛提供了一個視覺化介面操作es,包括索引、文件的建立,以及 resful 風格的查詢。這裡推薦一個安裝連結:head外掛安裝

使用elasticsearch/elasticsearch擴充套件操作es

這裡,我選擇了 Laravel 框架來安裝,操作 es(純屬個人愛好),也可以直接使用 composer 安裝。接下來進行搜尋前的一些準備工作:

  1. 建立索引
  2. 建立型別
  3. 建立文件
  4. 將 mysql 中的記錄匯入 es

上面的這些步驟都是可以通過這個 elasticsearch/elasticsearch 擴充套件封裝的方法來完成的。

執行搜尋

接下來的內容才是我要重點記錄的,直接上程式碼

public function search(Request $request)
{
     $search = $request->input('key');
     $curr_page = $request->input('curr_page', 1);
     $page_size = $request->input('page_size', 5);
     //最大值為10000;
     if ($page_size > 10000) {
        $page_size = 10000;
     }
     $market =  $request->input('market_key', '');
     $coin =  $request->input('coin_key', '');
     $currency =  $request->input('currency_key', '');
     $offset = ($curr_page-1) * $page_size;

     //搜尋條件
     $query_condition[] = [
         'term' => ['online' => 1],
     ];

     if (!empty($market)) {
         $query_condition[] = [
             'term' => ['market' => strtolower($market)],
         ];
     }
     if (!empty($coin)) {
         $query_condition[] = [
             'term' => ['coin' => strtolower($coin)],
         ];
     }
     if (!empty($currency)) {
         $query_condition[] = [
             'term' => ['currency' => strtolower($currency)],
         ];
     }
     
     $params = [
         'index' => 'search_index',
         'type'  => 'fulltext',
         'from'  => $offset,
         'size'  => $page_size,
         'body'  => [
             'query' => [
                 'bool' => [
                     'should' => [
                         ['match' => ['show' => $search]],
                     ],
                     'filter' => [
                         $query_condition
                     ]
                 ]
             ]
         ]
     ];

     $response = $this->client->search($params);

     $result['count'] = 0;
     $result['list'] = [];
     if (isset($response['hits']['hits']) && count($response['hits']['hits']) > 0) {
         $hits = $response['hits']['hits'];

         foreach ($hits as $hit) {
             $result['list'][] = $hit['_source'];
         }
     }

     $result['count'] = $response['hits']['total'] ?? 0;
     return $result;
 }

params 引數說明:index 為建立的索引,type 為型別,from 代表從第幾個記錄開始取值,size 則是一次返回的數量,body 裡包含了查詢條件及過濾條件,值得注意的是查詢結果裡hits物件裡面的total欄位包含了這次查詢匹配的記錄總數。