ElasticSearchService.php 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. <?php
  2. /**
  3. * Elasticsearch 相关操作
  4. * @author jim <jim458734573@gmail.com>
  5. * @date 2020-01-22 22:37:21
  6. */
  7. declare(strict_types=1);
  8. namespace App\Repositories\Service;
  9. use Hyperf\Guzzle\ClientFactory;
  10. class ElasticSearchService
  11. {
  12. /**
  13. * 在指定index 和 type 下面存储文档
  14. * @param int $documentId
  15. * @param array $document
  16. * @param string $typeName
  17. * @param string $indexName
  18. * @return bool
  19. */
  20. public function save($documentId, $document, $typeName = 'video', $indexName = 'dafanhao')
  21. {
  22. $url = "/{$indexName}/{$typeName}/{$documentId}";
  23. $result = $this->doRequest($url, 'POST', $document);
  24. $result = json_decode($result);
  25. if ($result->_version) {
  26. return true;
  27. }
  28. return false;
  29. }
  30. /**
  31. * 更新指定文档 $document 可只传 更新的部分
  32. * @param int $documentId
  33. * @param array $document
  34. * @param string $typeName
  35. * @param string $indexName
  36. * @return bool
  37. */
  38. public function update($documentId, $document, $typeName = 'video', $indexName = 'dafanhao')
  39. {
  40. $url = "/{$indexName}/{$typeName}/{$documentId}/_update";
  41. $document = array(
  42. 'doc' => $document
  43. );
  44. $result = $this->doRequest($url, 'POST', $document);
  45. $result = json_decode($result);
  46. if ($result->_version) {
  47. return true;
  48. }
  49. return false;
  50. }
  51. /**
  52. * 查询
  53. * @param array $query 查询条件
  54. * @param string $typeName
  55. * @param string $indexName
  56. * @return mixed|string
  57. */
  58. public function search($query, $typeName = 'video', $indexName = 'dafanhao')
  59. {
  60. foreach ($query['query'] as $key => $item) {
  61. if (empty($item)) {
  62. unset($query['query'][$key]);
  63. }
  64. }
  65. $url = "/{$indexName}/{$typeName}/_search";
  66. $result = $this->doRequest($url, 'GET', $query);
  67. $result = json_decode($result, true);
  68. return $result;
  69. }
  70. /**
  71. * 统计
  72. * @param $query
  73. * @param string $typeName
  74. * @param string $indexName
  75. * @return mixed|string
  76. */
  77. public function count($query, $typeName = 'video', $indexName = 'dafanhao')
  78. {
  79. foreach ($query['query'] as $key => $item) {
  80. if (empty($item)) {
  81. unset($query['query'][$key]);
  82. }
  83. }
  84. $url = "/{$indexName}/{$typeName}/_count";
  85. $result = $this->doRequest($url, 'GET', $query);
  86. $result = json_decode($result);
  87. return $result;
  88. }
  89. /**
  90. * 获取指定的 document
  91. * @param $id
  92. * @param string $typeName
  93. * @param string $indexName
  94. * @return array
  95. */
  96. public function get($id, $typeName = 'video', $indexName = 'dafanhao')
  97. {
  98. $url = "/{$indexName}/{$typeName}/".$id;
  99. $result = $this->doRequest($url, 'GET');
  100. $result = json_decode($result, true);
  101. if ($result['found']>0) {
  102. return $result['_source'];
  103. }
  104. return array();
  105. }
  106. /**
  107. * 删除指定文档 注意 当 documentId 为空时,删除所有.
  108. * @param string $documentId
  109. * @param string $typeName
  110. * @param string $indexName
  111. * @return bool
  112. */
  113. public function delete($documentId = '', $typeName = 'video', $indexName = 'dafanhao')
  114. {
  115. $url = "/{$indexName}/{$typeName}";
  116. if ($documentId) {
  117. $url .='/'.$documentId;
  118. $result = $this->doRequest($url, 'DELETE');
  119. } else {
  120. $url .='/_delete_by_query?conflicts=proceed';
  121. $filter = new \stdClass();
  122. $result = $this->doRequest($url, 'POST', array('query'=>array('match_all'=>$filter)));
  123. }
  124. $result = json_decode($result);
  125. if ($result->result=='deleted' || isset($result->deleted)) {
  126. return true;
  127. }
  128. return false;
  129. }
  130. /**
  131. * 发起请求
  132. * @param string $url 请求地址
  133. * @param string $method 请求方法
  134. * @param array $data 请求参数
  135. * @param int $timeout 超时时间
  136. * @return string
  137. */
  138. private function doRequest($url, $method, $data = array(), $timeout = 40)
  139. {
  140. $esConnection = env('ELASTICSEARCH');
  141. if ($esConnection) {
  142. $url = $esConnection.$url;
  143. } else {
  144. $url = 'http://localhost:9200'.$url;
  145. }
  146. if (!in_array($method, array('DELETE','PUT','GET','POST'))) {
  147. return '';
  148. }
  149. $options = array(
  150. 'timeout' => $timeout, // 超时,单位秒.
  151. 'verify' => false, // 是否校验SSL证书.
  152. 'http_errors' => false, // 如果跟随http异常头部是否中断.
  153. 'debug' => false, // 是否启用调试模式.
  154. 'allow_redirects' => true, // 不跟随301/302跳转.
  155. );
  156. $client = make(ClientFactory::class)->create($options);
  157. try {
  158. $params = [
  159. 'headers' => [
  160. 'Content-Type'=>'application/json',
  161. 'X-HTTP-Method-Override'=>$method,
  162. ],
  163. 'json'=>$data,
  164. ];
  165. $result = $client->request($method, $url, $params);
  166. $code = $result->getStatusCode();
  167. if ($code == 200) {
  168. return $result->getBody()->getContents();
  169. }
  170. } catch (\Exception $e) {
  171. }
  172. return '';
  173. }
  174. }