CommonEsController.php 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. namespace app\controller;
  3. use app\BaseController;
  4. use Elasticsearch\ClientBuilder;
  5. use think\facade\Session;
  6. use think\response\Json;
  7. use think\facade\Request;
  8. class CommonEsController extends BaseController
  9. {
  10. /**
  11. * es索引名称
  12. */
  13. protected $index = 'document_zh,document_en';
  14. /**
  15. * es文档名称
  16. */
  17. protected $type = '_doc';
  18. /**
  19. * 分页每页展示数据条数
  20. */
  21. protected $pagesize = 25;
  22. /**
  23. * 查询字段
  24. */
  25. protected $fields = ['_id' , 'title' , 'abstract' , 'year' , 'author' , 'url_md5' , 'index'];
  26. /**
  27. * 连接es
  28. */
  29. protected function getEsClient()
  30. {
  31. $client = ClientBuilder::create()->setHosts([\think\facade\Config::get('es')])
  32. ->setConnectionPool('\Elasticsearch\ConnectionPool\SimpleConnectionPool', [])
  33. ->setRetries(10)
  34. ->build();
  35. return $client;
  36. }
  37. /**
  38. * es数据查询统一接口
  39. */
  40. protected function esCommonGetData(array $params):array
  41. {
  42. /**
  43. * 连接es
  44. */
  45. $client = $this->getEsClient();
  46. /**
  47. * 获取查询结果
  48. */
  49. $result = $client->search($params);
  50. /**
  51. * 数据以及数据总数
  52. */
  53. $total = $result['hits']['total'];
  54. $data = $result['hits']['hits'];
  55. $newArray = [];
  56. /**
  57. * 获取实际返回数据源
  58. */
  59. foreach ($data as $val) {
  60. $newArray[] = $val['_source'];
  61. }
  62. return [
  63. 'total' => $total ,
  64. 'data' => $newArray
  65. ];
  66. }
  67. /**
  68. * es match_phrase
  69. */
  70. protected function esCommonGet($select_field , $field_value , $size = 1 , $tag = 'stats' , $index = 'author_v1')
  71. {
  72. $params = [
  73. 'index' => $index ?? $this->index,
  74. 'body' => [
  75. 'query' => [
  76. 'match_phrase' => [
  77. $select_field => $field_value
  78. ]
  79. ] ,
  80. 'size' => $size ,
  81. 'from' => 0
  82. ]
  83. ];
  84. $result = $this->esCommonGetData($params);
  85. return 'stats' === $tag ? $result['total'] : $result;
  86. }
  87. protected function _json_succ($data = [] , $code = 0 , $msg = 'Success')
  88. {
  89. return json(
  90. [
  91. 'code' => $code ,
  92. 'msg' => $msg ,
  93. 'data' => $data
  94. ]
  95. );
  96. }
  97. protected function _json_error($msg = '' , $code = 1 , $data = null)
  98. {
  99. return json(
  100. [
  101. 'code' => $code ,
  102. 'msg' => $msg ,
  103. 'data' => $data
  104. ]
  105. );
  106. }
  107. /**
  108. * 判断是英文还是中文
  109. */
  110. protected function getEsIndex($value , $tag = 'document')
  111. {
  112. $language = preg_match("/^[^\x80-\xff]+$/", $value) ? '_en' :'_zh';
  113. return $tag.$language;
  114. }
  115. /**
  116. * 当前es语言
  117. */
  118. protected function currentLanguage()
  119. {
  120. return 'document_zh,document_en';
  121. return Session::get('language') ?? 'document_zh';
  122. }
  123. /**
  124. * curl get 请求
  125. */
  126. protected function curlGetRequest($url , $authtoken = '9f25a6a368b8099acc9297828fb23e7908a8c5c5')
  127. {
  128. $curl_con = curl_init();
  129. curl_setopt($curl_con, CURLOPT_URL , $url);
  130. curl_setopt($curl_con, CURLOPT_HEADER, false);
  131. curl_setopt($curl_con, CURLOPT_CUSTOMREQUEST, 'GET');
  132. curl_setopt($curl_con, CURLOPT_RETURNTRANSFER, 1);
  133. curl_setopt($curl_con, CURLOPT_CONNECTTIMEOUT, 5);
  134. curl_setopt($curl_con, CURLOPT_FOLLOWLOCATION, true); // 解决curl返回301
  135. curl_setopt($curl_con, CURLOPT_HTTPHEADER , array(
  136. "Content-Type: application/json;charset=utf-8",
  137. "Authorization: Token $authtoken"
  138. )
  139. );
  140. $res = curl_exec($curl_con);
  141. $status = curl_getinfo($curl_con);
  142. curl_close($curl_con);
  143. if (isset($status['http_code']) && 200 == $status['http_code']) {
  144. return $res;
  145. } else {
  146. return false;
  147. }
  148. }
  149. /**
  150. * curl post 请求
  151. */
  152. protected function curlPostRequest($url , $params , $authtoken = '')
  153. {
  154. $data = json_encode($params , JSON_UNESCAPED_UNICODE);
  155. $curl_con = curl_init();
  156. curl_setopt($curl_con, CURLOPT_URL , $url);
  157. curl_setopt($curl_con, CURLOPT_HEADER, false);
  158. curl_setopt($curl_con, CURLOPT_CUSTOMREQUEST, 'POST');
  159. curl_setopt($curl_con, CURLOPT_POSTFIELDS, $data);
  160. curl_setopt($curl_con, CURLOPT_RETURNTRANSFER, 1);
  161. curl_setopt($curl_con, CURLOPT_CONNECTTIMEOUT, 5);
  162. curl_setopt($curl_con, CURLOPT_FOLLOWLOCATION, true); // 解决curl返回301
  163. if($authtoken) {
  164. curl_setopt($curl_con, CURLOPT_HTTPHEADER , array(
  165. "Content-Type: application/json;charset=utf-8" ,
  166. "Authorization: Token $authtoken"
  167. )
  168. );
  169. } else {
  170. curl_setopt($curl_con, CURLOPT_HTTPHEADER , array(
  171. "Content-Type: application/json;charset=utf-8"
  172. )
  173. );
  174. }
  175. $res = curl_exec($curl_con);
  176. $status = curl_getinfo($curl_con);
  177. curl_close($curl_con);
  178. if (isset($status['http_code']) && 200 == $status['http_code']) {
  179. return $res;
  180. } else {
  181. return false;
  182. }
  183. }
  184. }