You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

326 lines
8.3 KiB

<?php
use Elasticsearch\ClientBuilder;
class ES
{
//ES客户端链接
private $client;
private $index_name;
/**
* 初始化ES连接
* ES constructor.
*/
public function __construct($index)
{
$params = array(
'127.0.0.1:9200'
);
$this->client = ClientBuilder::create()->setHosts($params)->build();
$this->index_name = $index;
return $this->client;
}
/**
* 判断索引是否存在
* @param string $index_name
* @return bool|mixed|string
*/
public function exists_index($index_name = 'test_ik')
{
$params = [
'index' => $index_name
];
try {
return $this->client->indices()->exists($params);
} catch (\Exception $e) {
return false;
}
}
/**
* 创建索引
* @param string $index_name
* @return array|mixed|string
*/
public function create_index($index_name = 'test_ik')
{
$params = [
'index' => $index_name,
'body' => [
'settings' => [
'number_of_shards' => 3,
'number_of_replicas' => 0
]
]
];
try {
return $this->client->indices()->create($params);
} catch (\Exception $e) {
return false;
}
}
/**
* 删除索引
* @param string $index_name
* @return array
*/
public function delete_index($index_name = 'test_ik')
{
$params = ['index' => $index_name];
$response = $this->client->indices()->delete($params);
return $response;
}
/**
* 添加文档
* @param $params
* $params = [
* 'index' => "es",
* 'type' => "article",
* "body" => [
* "title" => "",
* ]
* ];
* @return array
*/
public function add_doc($params)
{
return $this->client->index($params);
}
/**
* 判断文档存在
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array|bool
*/
public function exists_doc($id = 1, $index_name = 'test_ik', $type_name = 'goods')
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
$response = $this->client->exists($params);
return $response;
}
/**
* 获取文档
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array
*/
public function get_doc($id = 1, $index_name = 'test_ik', $type_name = 'goods')
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
$response = $this->client->get($params);
return $response;
}
/**
* 修改文档
*$params = [
'index' => "es",
'type' => "article",
'id' => "OIwzxXgBzF70K-DobSSC",
"body" => [
"doc" => [
"title" => "6100万颗心的共同记忆 再次C位亮相,闪耀全球!",
"desn" => "刚刚过去的这个清明节,与往年一样,有人凭寄哀思,有人缅怀忠魂。但也有一些瞬间,让人记起久久不能释怀,给这个特殊节气增添了一些格外不同的味道。"
]
]
];
* @param array $params
* @return array
*/
public function update_doc($params = [])
{
$response = $this->client->update($params);
return $response;
}
/**
* 删除文档
* @param int $id
* @param string $index_name
* @param string $type_name
* @return array
*/
public function delete_doc($id = 1, $index_name = 'test_ik', $type_name = 'goods')
{
$params = [
'index' => $index_name,
'type' => $type_name,
'id' => $id
];
$response = $this->client->delete($params);
return $response;
}
/**
* 搜索文档 (分页,排序,权重,过滤)
* @param string $index_name
* @param string $type_name
* @param array $body
$body = [
'query' => [
'bool' => [
'should' => [
[
'match' => [
'cate_name' => [
'query' => $keywords,
'boost' => 4, // 权重大
]
]
],
[
'match' => [
'goods_name' => [
'query' => $keywords,
'boost' => 3,
]
]
],
[
'match' => [
'goods_introduce' => [
'query' => $keywords,
'boost' => 2,
]
]
]
],
],
],
'sort' => ['id'=>['order'=>'desc']],
'from' => $from,
'size' => $size
];
* @return array
*/
public function search_doc($index_name = "test_ik", $type_name = "goods", $body = [])
{
$params = [
'index' => $index_name,
'type' => $type_name,
'body' => $body
];
$results = $this->client->search($params);
return $results;
}
/**
* @param string $index_name 搜索列表
* @param string $type_name
* @return array|callable
*
*/
public function select_doc($index_name = 'test_ik', $type_name = 'goods'){
$params=[
'index' => $index_name,
'type' => $type_name,
];
$response = $this->client->search($params);
return $response;
}
/**
* @param string $index_name // 高亮显示
* @param string $type_name
* @param array $body
* @return array|callable
*
*
$body=[
'query' => [
'match' => [
'desn' => '董事长'
]
],
'highlight' => [
'pre_tags' => ["<b class='key' style='color:red'>"],
'post_tags' => ["</b>"],
'fields' => [
"desn" => new \stdClass()
]
],
];
*/
public function highlight_doc($index_name = 'test_ik', $type_name = 'goods' , $body = []){
$params=[
'index' => $index_name,
'type' => $type_name,
'body' => $body
];
$response = $this->client->search($params);
return $response;
}
public function create_weibo_index() {
$res = $this->exists_index($this->index_name);
if($res) return true;
$params = [
'index' => $this->index_name,
'body' => [
'settings' => [
'number_of_shards' => 2,
'number_of_replicas' => 1,
'analysis' => [
'analyzer' => [
'ik_analyzer' => [
'type' => 'custom',
'tokenizer' => 'ik_max_word'
]
]
]
],
'mappings' => [
'properties' => [
'id' => ['type' => 'long'],
'uid' => ['type' => 'long'],
'wid' => ['type' => 'long'],
'content' => [
'type' => 'text',
'analyzer' => 'ik_max_word',
// 'fields' => [
// 'semantic' => [
// 'type' => 'dense_vector',
// 'dims' => 768
// ]
// ]
],
'created_at' => ['type' => 'date'],
'comments_count' => ['type' => 'long'],
'attitudes_count' => ['type' => 'long'],
'status' => ['type' => 'long']
]
]
]
];
try {
return $this->client->indices()->create($params);
} catch (\Exception $e) {
return false;
}
}
}