|
|
|
@ -11,13 +11,34 @@ class Client |
|
|
|
|
const ES_HOST_NAME = '114.55.95.135:9200'; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static Client $instance; |
|
|
|
|
private static $instance; |
|
|
|
|
|
|
|
|
|
private function __construct() |
|
|
|
|
/** |
|
|
|
|
* @var 索引名称 |
|
|
|
|
*/ |
|
|
|
|
protected $index; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public $alias; |
|
|
|
|
|
|
|
|
|
protected $retries = 2; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 查询参数 |
|
|
|
|
* @var array $queryParams |
|
|
|
|
*/ |
|
|
|
|
protected $queryParams = []; |
|
|
|
|
|
|
|
|
|
private $debug; |
|
|
|
|
|
|
|
|
|
public function __construct() |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
var_dump(self::ES_HOST_NAME); |
|
|
|
|
$this->client = ClientBuilder::create()->setHosts([self::ES_HOST_NAME])->build(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private function __clone() { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
@ -29,6 +50,81 @@ class Client |
|
|
|
|
return self::$instance; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 查询条件 |
|
|
|
|
* @param $params |
|
|
|
|
* @return $this |
|
|
|
|
*/ |
|
|
|
|
public function select($params = '') |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['select'] = str_replace(' ', '', trim($params, " ,\t\r\n")); |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 分页 |
|
|
|
|
* @param $number |
|
|
|
|
* @return $this |
|
|
|
|
*/ |
|
|
|
|
public function from($number = 0) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['from'] = $number ? ($number-1)*10 : 0; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 页码 |
|
|
|
|
* @param $number |
|
|
|
|
* @return $this |
|
|
|
|
*/ |
|
|
|
|
public function size($number = 10) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['size'] = $number; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function equal($params = []) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['equal'][] = $params; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function in($params = []) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['in'][] = $params; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function like($params = []) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['like'][] = $params; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function orlike($params = []) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['orlike'][] = $params; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function order($params = []) |
|
|
|
|
{ |
|
|
|
|
$this->queryParams['order'][] = $params; |
|
|
|
|
return $this; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 根据条件删除文档 |
|
|
|
|
* @param array $params |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public function deleteDoc($params = []) |
|
|
|
|
{ |
|
|
|
|
return $this->client->deleteByQuery($params); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function existsIndex(String $index_name) { |
|
|
|
|
$params = [ |
|
|
|
|
'index' => $index_name |
|
|
|
@ -67,6 +163,182 @@ class Client |
|
|
|
|
return $this->client->indices()->delete($params); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 根据id删除文档 |
|
|
|
|
* @param int $id |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
public function deleteDocById($id = 0) |
|
|
|
|
{ |
|
|
|
|
$params = [ |
|
|
|
|
'index' => $this->index, |
|
|
|
|
'id' => $id |
|
|
|
|
]; |
|
|
|
|
$response = $this->client->delete($params); |
|
|
|
|
return $response; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 组装查询条件 |
|
|
|
|
* @param array $params |
|
|
|
|
* @return $this |
|
|
|
|
*/ |
|
|
|
|
private function parseQueryParams() |
|
|
|
|
{ |
|
|
|
|
$queryParams = [ |
|
|
|
|
'index' => $this->index, |
|
|
|
|
'body' => [ |
|
|
|
|
'query' => [ |
|
|
|
|
'bool' => [ |
|
|
|
|
'must' => [], |
|
|
|
|
'filter' => [] |
|
|
|
|
] |
|
|
|
|
] |
|
|
|
|
], |
|
|
|
|
'from' => $this->queryParams['from'] ?? 0, |
|
|
|
|
'size' => $this->queryParams['size'] ?? 10 |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
$filter = $must = []; |
|
|
|
|
if (!empty($this->queryParams['select'])) { |
|
|
|
|
$queryParams['_source'] = explode(',', $this->queryParams['select']); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($this->queryParams['equal'])) { |
|
|
|
|
foreach ($this->queryParams['equal'] as $key => $row) { |
|
|
|
|
foreach ($row as $filed => $value) { |
|
|
|
|
$filter[] = [ |
|
|
|
|
'term' => [$filed => $value] |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($this->queryParams['in'])) { |
|
|
|
|
foreach ($this->queryParams['in'] as $key => $row) { |
|
|
|
|
foreach ($row as $filed => $value) { |
|
|
|
|
$filter[] = [ |
|
|
|
|
'terms' => [$filed => array_values(array_unique(array_filter($value)))] |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($this->queryParams['like'])) { |
|
|
|
|
foreach ($this->queryParams['like'] as $key => $row) { |
|
|
|
|
foreach ($row as $filed => $value) { |
|
|
|
|
/*$must[] = [ |
|
|
|
|
|
|
|
|
|
'wildcard' => [$filed => '*'. $value. '*'] |
|
|
|
|
|
|
|
|
|
];*/ |
|
|
|
|
$must[] = [ |
|
|
|
|
// 'match' => [$filed => $value] |
|
|
|
|
'match_phrase' => [$filed => $value] |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$queryParams['body']['query']['bool']['must'] = $must; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($this->queryParams['orlike'])) { |
|
|
|
|
foreach ($this->queryParams['orlike'] as $key => $row) { |
|
|
|
|
foreach ($row as $filed => $value) { |
|
|
|
|
$orlike[] = [ |
|
|
|
|
'match_phrase' => [$filed => $value] |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$queryParams['body']['query']['bool']['must']['bool']['should'] = $orlike; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($this->queryParams['order'])) { |
|
|
|
|
$queryParams['body']['sort'] = [ |
|
|
|
|
key($this->queryParams['order']) => [ |
|
|
|
|
'order' => current($this->queryParams['order']) |
|
|
|
|
] |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$queryParams['body']['query']['bool']['filter'] = $filter; |
|
|
|
|
|
|
|
|
|
$this->queryParams = $queryParams; |
|
|
|
|
|
|
|
|
|
return $this; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param bool $isTotal isTotal=true时, 返回总数 |
|
|
|
|
* @return array|string |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public function query($isTotal = false) |
|
|
|
|
{ |
|
|
|
|
try { |
|
|
|
|
$this->parseQueryParams(); |
|
|
|
|
|
|
|
|
|
if ($this->debug) { |
|
|
|
|
return \GuzzleHttp\json_encode($this->queryParams); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($isTotal === true) { |
|
|
|
|
|
|
|
|
|
unset( |
|
|
|
|
|
|
|
|
|
$this->queryParams['from'], |
|
|
|
|
|
|
|
|
|
$this->queryParams['size'], |
|
|
|
|
|
|
|
|
|
$this->queryParams['_source'] |
|
|
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
$count = $this->client->count($this->queryParams); |
|
|
|
|
|
|
|
|
|
return (int)$count['count']; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($this->queryParams)) { |
|
|
|
|
|
|
|
|
|
$result = $this->client->search($this->queryParams); |
|
|
|
|
|
|
|
|
|
if (!empty($result['hits']['hits'])) { |
|
|
|
|
|
|
|
|
|
$return = []; |
|
|
|
|
|
|
|
|
|
foreach ($result['hits']['hits'] as $row) { |
|
|
|
|
|
|
|
|
|
$return[] = $row['_source']; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return $return; |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
return []; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
|
|
|
|
|
|
$msg = $e->getMessage(); |
|
|
|
|
|
|
|
|
|
$msg = '服务器开小差了~'; |
|
|
|
|
|
|
|
|
|
throw new Exception($msg); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 添加文档 |
|
|
|
|
* @param $id |
|
|
|
@ -86,6 +358,36 @@ class Client |
|
|
|
|
return $this->client->index($params); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function getIndex() |
|
|
|
|
{ |
|
|
|
|
return $this->index; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 返回ES实例 |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public static function setEs($index = '') |
|
|
|
|
{ |
|
|
|
|
$class = get_called_class(); |
|
|
|
|
if (!self::$instance || !self::$instance instanceof $class) { |
|
|
|
|
self::$instance = new static(); |
|
|
|
|
} |
|
|
|
|
if ($index) { |
|
|
|
|
self::$instance->index = $index; |
|
|
|
|
} |
|
|
|
|
return self::$instance; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected function settings() |
|
|
|
|
{ |
|
|
|
|
return [ |
|
|
|
|
'number_of_shards' => 1, |
|
|
|
|
'number_of_replicas' => 0 |
|
|
|
|
]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 判断文档存在 |
|
|
|
|
* @param int $id |
|
|
|
@ -144,40 +446,306 @@ class Client |
|
|
|
|
return $this->client->update($params); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 删除文档 |
|
|
|
|
* @param int $id |
|
|
|
|
* 搜索文档:分页,排序,权重,过滤 |
|
|
|
|
* @param string $index_name |
|
|
|
|
* @param string $type_name |
|
|
|
|
* @param array $body |
|
|
|
|
* @return array |
|
|
|
|
*/ |
|
|
|
|
public function deleteDoc(int $id = 1, string $index_name = 'gyx_ik', string $type_name = '_doc'): array |
|
|
|
|
public function searchDoc(array $body = [], string $index_name = "goods_list", string $type_name = "_doc"): array |
|
|
|
|
{ |
|
|
|
|
$params = [ |
|
|
|
|
'index' => $index_name, |
|
|
|
|
'type' => $type_name, |
|
|
|
|
'id' => $id |
|
|
|
|
'body' => $body |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
return $this->client->delete($params); |
|
|
|
|
return $this->client->search($params); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
|
|
* @return bool |
|
|
|
|
|
|
|
|
|
* @throws Exception |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public function createIndexNew($mapping) |
|
|
|
|
{ |
|
|
|
|
try { |
|
|
|
|
$params = [ |
|
|
|
|
'index' => $this->index |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
$check = $this->indices()->exists($params); |
|
|
|
|
|
|
|
|
|
if ($check) { |
|
|
|
|
throw new Exception('index: ' . $this->index . ' already exists'); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$params = [ |
|
|
|
|
'index' => $this->index, |
|
|
|
|
'body' => [ |
|
|
|
|
'settings' => $this->settings(), |
|
|
|
|
'mappings' => [ |
|
|
|
|
'_source' => [ |
|
|
|
|
'enabled' => true, |
|
|
|
|
], |
|
|
|
|
'properties' => $mapping |
|
|
|
|
] |
|
|
|
|
] |
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
$result = $this->indices()->create($params); |
|
|
|
|
|
|
|
|
|
return $result['acknowledged'] === true; |
|
|
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
|
|
|
|
|
|
throw new Exception($e->getMessage()); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
|
|
* 删除索引 |
|
|
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
|
|
* @return bool |
|
|
|
|
|
|
|
|
|
* @throws Missing404Exception |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public function deleteIndexNew() |
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
$params = [ |
|
|
|
|
|
|
|
|
|
'index' => $this->index |
|
|
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
$check = $this->indices()->exists($params); |
|
|
|
|
|
|
|
|
|
if (!$check) { |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$result = $this->indices()->delete([ |
|
|
|
|
|
|
|
|
|
'index' => $this->index |
|
|
|
|
|
|
|
|
|
]); |
|
|
|
|
|
|
|
|
|
return $result['acknowledged'] === true; |
|
|
|
|
|
|
|
|
|
} catch (Missing404Exception $e) { |
|
|
|
|
|
|
|
|
|
throw new Missing404Exception('no such index ' . $this->index); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* 搜索文档:分页,排序,权重,过滤 |
|
|
|
|
* @param string $index_name |
|
|
|
|
* @param string $type_name |
|
|
|
|
* @param array $body |
|
|
|
|
* @return array |
|
|
|
|
|
|
|
|
|
* 批量写入 |
|
|
|
|
|
|
|
|
|
* type 1.增加/修改 2.删除 |
|
|
|
|
|
|
|
|
|
* $data = [ |
|
|
|
|
|
|
|
|
|
* ['id' => 1, 'name' => 'llf', 'age' => 30], |
|
|
|
|
|
|
|
|
|
* ['id' => 1, 'name' => 'llf', 'age' => 30], |
|
|
|
|
|
|
|
|
|
* ['id' => 1, 'name' => 'llf', 'age' => 30], |
|
|
|
|
|
|
|
|
|
* ['id' => 1, 'name' => 'llf', 'age' => 30], |
|
|
|
|
|
|
|
|
|
* ]; |
|
|
|
|
|
|
|
|
|
* @param array $data |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public function doBulkDocument($type = 1,$data = []) |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
|
|
|
|
|
$params = ['body' => []]; |
|
|
|
|
|
|
|
|
|
if($type == 1){ |
|
|
|
|
|
|
|
|
|
foreach ($data as $key => $row) { |
|
|
|
|
|
|
|
|
|
$params['body'][] = [ |
|
|
|
|
|
|
|
|
|
'index' => [ |
|
|
|
|
|
|
|
|
|
'_index' => $this->index, |
|
|
|
|
|
|
|
|
|
'_id' => $row['info_id'].'-'.$row['info_type'] |
|
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
$params['body'][] = $row; |
|
|
|
|
|
|
|
|
|
if (($key+1)%10000 == 0) { |
|
|
|
|
|
|
|
|
|
$this->client->bulk($params); |
|
|
|
|
|
|
|
|
|
$params = ['body' => []]; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
|
|
foreach ($data as $key => $row) { |
|
|
|
|
|
|
|
|
|
$params['body'][] = [ |
|
|
|
|
|
|
|
|
|
'delete' => [ |
|
|
|
|
|
|
|
|
|
'_index' => $this->index, |
|
|
|
|
|
|
|
|
|
'_id' => $row['info_id'].'-'.$row['info_type'] |
|
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!empty($params['body'])) { |
|
|
|
|
|
|
|
|
|
$this->client->bulk($params); |
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} catch (\Exception $e) { |
|
|
|
|
|
|
|
|
|
throw new Exception($e->getMessage()); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
|
|
* @return array @todo |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
public function searchDoc(array $body = [], string $index_name = "gyx_ik", string $type_name = "_doc"): array |
|
|
|
|
|
|
|
|
|
public function updateIndex() |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
$putParams = [ |
|
|
|
|
|
|
|
|
|
'index' => $this->index, |
|
|
|
|
|
|
|
|
|
//'type' => '_doc', |
|
|
|
|
|
|
|
|
|
'body' => [ |
|
|
|
|
|
|
|
|
|
'properties' => $this->mappings() |
|
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
return $this->indices()->putMapping($putParams); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
|
|
* 方便调试, 直接返回拼接的query |
|
|
|
|
|
|
|
|
|
* @return $this |
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
public function setDebug() |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
$this->debug = true; |
|
|
|
|
|
|
|
|
|
return $this; |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private function indices() |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
return $this->client->indices(); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function analyze($text = '') |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
$params = [ |
|
|
|
|
'index' => $index_name, |
|
|
|
|
'type' => $type_name, |
|
|
|
|
'body' => $body |
|
|
|
|
|
|
|
|
|
'index' => $this->index, |
|
|
|
|
|
|
|
|
|
'body' => [ |
|
|
|
|
|
|
|
|
|
'analyzer' => 'ik_smart', |
|
|
|
|
|
|
|
|
|
'text' => $text |
|
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
return $this->client->search($params); |
|
|
|
|
return $this->indices()->analyze($params); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public function update($id = 0, $updateParams = []) |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
|
|
$params = [ |
|
|
|
|
|
|
|
|
|
'index' => $this->index, |
|
|
|
|
|
|
|
|
|
'id' => $id, |
|
|
|
|
|
|
|
|
|
'body' => [ |
|
|
|
|
|
|
|
|
|
'doc' => $updateParams |
|
|
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
|
|
]; |
|
|
|
|
|
|
|
|
|
return $this->client->update($params); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|