調用Elasticsearch接口實現搜索

接上一篇博客:Windows環境利用Elasticsearch+Kibana+Logstash搭建搜索引擎並實現實時同步MySQL數據,超詳細步驟,說的寫下篇呢,忘了。。。。現在補上。
其實上一篇已經將關鍵點都羅列的差不多了。
首先,我們設計一下搜索的簡單架構,拿商品(id,name,total,等等其他字段)來說,ES上會同步一份商品表,我們可以把ES看成一個黑箱,只需要給它關鍵字,它就返回給你商品id,然後再拿着商品id去商品表查詢即可。也就是ES上僅需要保存id,name,total(提前過濾售罄商品)即可。
其整體架構如下:
基本時序圖
也就是說,只需要解決三個問題即可:
1.發送內容裏的查詢條件如何編寫
2.怎麼向ES發送請求。
3.如何解析返回結果。

問題1:查詢條件如何編寫調試。

通過上篇博文可以知道,格式是json,調試工具就是Kibana,語法直接參考ES官方文檔,很簡單,調試完之後,將調試好的json發送到某個URL即可,問題2講這個URL如何獲得。
上篇我寫的簡單json:

{
	"query": {
		"match_all": {
		}
	}
}

這個就是請求體的基本結構。

問題2:如何向ES發送請求。

回顧一下上一篇博文的配置,端口我配置爲了9200,實際上ES已經在這個端口下創建了服務。請求這個端口即可。
上篇step4的配置我先再貼一下:

input {
 stdin { }
    jdbc {
        jdbc_connection_string => "jdbc:mysql://localhost:3306/你的數據庫名字"

        jdbc_user => "你的數據庫用戶名"

        jdbc_password => "你的數據庫密碼"

        jdbc_driver_library => "C:/logstash/bin/mysql-connector-java-5.1.44-bin.jar"

        jdbc_driver_class => "com.mysql.jdbc.Driver"

        jdbc_paging_enabled => "true"

        jdbc_page_size => "50000"
        statement => "SELECT id(主鍵),其他內容 FROM 你的表"
        schedule => "* * * * *"
    }
 }

 output {
     stdout {
        codec => json_lines
    }
    elasticsearch {
        hosts => "localhost:9200"
        index => "你要創建的索引名"
        document_type => "你要創建的索引類型"
        document_id => "%{id}"
    }
}

要請求的url就是:http://localhost:9200/你要創建的索引名/你要創建的索引類型/_search?size=50;size表示你要返回多少條數據。
我拿php做個示例:
請求頭之類的配置,參考輔助函數:

function SendDataByCurl($url,$data=array()){
  //調用搜索引擎輔助請求函數
			  $url = str_replace(' ','+',$url);
			  $ch = curl_init();
			  //設置選項,包括URL
			  curl_setopt($ch, CURLOPT_URL, "$url");
			  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			  curl_setopt($ch, CURLOPT_HEADER, 0);
			  curl_setopt($ch, CURLOPT_HTTPHEADER, array(
			    'Content-Type: application/json; charset=utf-8'
			)
			);
			  curl_setopt($ch,CURLOPT_TIMEOUT,3); //定義超時3秒鐘
			   // POST數據
			  curl_setopt($ch, CURLOPT_POST, 1);
			  // 把post的變量加上
			  curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));  //所需傳的數組用http_bulid_query()函數處理一下,就ok了
			  //執行並獲取url地址的內容
			  $output = curl_exec($ch);
			  $errorCode = curl_errno($ch);
			  //釋放curl句柄
			  curl_close($ch);
			  if(0 !== $errorCode) {
			    return false;
			  }
			  return $output;
	}

然後發送請求:

$query=array("query"=>"你的調試好的json");//記得最外層是query
		     $url = '`http://localhost:9200/你要創建的索引名/你要創建的索引類型/_search?size='.$ALL;
		     $res =$this->SendDataByCurl($url, $query);
		     $result=json_decode($res);

問題3:解析結果

問題2裏的result已經拿到結果,實際上就是個標準json,php可以轉成對象操作,java用Gson+javaBean,C#用Newtonsoft.Json都很好處理。
至此,就可以集成ES到自己的系統裏了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章