ES 功能类库
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2021/4/2
* Time: 17:36
*/
use Elasticsearch\ClientBuilder;
class ES{
private $es;
private $host;
/**
* 构造函数
* ES constructor.
*/
public function __construct()
{
require(Spider_PATH . "config/config.elasticsearch.php");
$this->host = $es_config;//es服务器地址
$this->es = $this->client();//连接es
}
/**
* 连接es
* @return \Elasticsearch\Client|mixed
*/
public function client(){
$this->es = ClientBuilder::create()->setHosts($this->host)->build();
return $this->es;
}
/**
* 创建索引 可根据数据库自动创建索引
* @param $index string 数据表名称
* @param $type string type
* @param $properties array 数据结构
* @return array
*/
public function esCreateIndex($index,$type,$properties = []){
$params = [
'index' => $index,
'body' => [
'settings' => [
'number_of_shards' => 1,
'number_of_replicas' => 0
],
'mappings' => [//映射
'_default_' => [//默认配置,每个类型缺省的配置使用默认配置
'_all' => [
'enabled' => 'false'//关闭所有字段的检索
],
'_source'=>[ // 存储原始文档
'enabled' => 'true'
],
'properties' => $properties,
],
$type => [
'properties' => [],
],
],
],
];
return $this->es->indices()->create($params);
}
/**
* 判断索引是否存在
* @param $index string 索引
* @return bool
*/
public function exists($index){
$params = [
'index' => $index
];
return $this->es->indices()->exists($params);
}
/**
* 查看mappings
* @param $index string 索引
* @return array
*/
public function getMappings($index){
$params = [
'index' => $index
];
return $this->es->indices()->getMapping($params);
}
/**
* 设置mappings
* @param $index string 索引
* @param $type string type
* @param $properties array
* @return array
*/
public function putMappings($index,$type,$properties){
$params = [
'index' => $index,
'type' => $type,
'body' => [
'properties' => $properties,
],
];
return $this->es->indices()->putMapping($params);
}
/**
* es分页搜索
* @param $index string 索引
* @param $type string type
* @param $form int 页数
* @param $size int 每页显示多少条
* @param $query array 搜索条件
* @return array
*/
public function esSearch($index,$type,$query,$form = 0,$size = 10){
$params = [
'index' => $index,
'type' => $type,
'body' => array_merge([
'from' => $form * $size,
'size' => $size,
],$query),
];
return $this->es->search($params);
}
/**
* 统计
* @param $index string 索引
* @param $type string type
* @param $body array 查询条件
* @return array
*/
public function esCount($index,$type,$body = []){
$params = [
'index' => $index,
'type' => $type,
'body' => $body,
];
return $this->es->count($params);
}
/**
* es通过id获取|删除|修改
* @param $index string 索引
* @param $type string type
* @param $id string id
* @param $opera string get获取 del删除 edit修改
* @param $body array 更新数据
* @return array
*/
public function esOperaById($index,$type,$id,$opera = 'get',$body = []){
$params = [
'index' => $index,
'type' => $type,
'id' => $id,
];
if ($opera == 'del'){
return $this->es->delete($params);
}elseif ($opera == 'edit'){
$params['body'] = $body;
return $this->es->update($params);
}
return $this->es->get($params);
}
/**
* 删除index索引
* @param $index string 索引
* @return array
*/
public function esDel($index){
$params = [
'index' => $index
];
return $this->es->indices()->delete($params);
}
/**
* es插入单条
* @param $index string 索引
* @param $type string type
* @param $body array 插入数据
* @return array
*/
public function esIndexOne($index,$type,$body){
$params = [
'index' => $index,
'type' => $type,
'body' => $body
];
return $this->es->index($params);
}
/**
* 插入多条
* @param $index string 索引
* @param $type string type
* @param $body array 数据
* @return array
*/
public function esBulk($index,$type,$body){
$params = [
'index' => $index,
'type' => $type,
'body' => $body
];
return $this->es->bulk($params);
}
}
使用
require_once("../vendor/autoload.php");
require_once("./es/class.es.php");
$es = new ES();
//通过查询 数据表 字段 创建索引
$index = $es->esCreateIndex("sm_chenggu","chenggu",[],$db);
//$db为数据库连接类库,如下图
//判断索引是否存在
$bool = $es->exists('sm_chenggu');//索引名称
//查看mappings配置
$mappings = $es->getMappings('sm_chenggu');//索引名称
//设置字段类型
$properties = [
'id' => [
'type' => 'text',//原先字段类型必须一致
'fields' => [//设置的其余类型
'raw' => [
'type' => 'keyword'
],
],
]
],
$fielddata = $es->putMappings('sm_chenggu','chenggu',$properties);
//es搜索
//具体query请自行搜索相关文档,网上很多
//https://www.cnblogs.com/bigben0123/articles/11075949.html
$query = [
'query' => [
'bool' => [
'must' => [
[
'match_phrase' => ['title' => $q]//搜索条件 多个条件
],
],
],
],
'sort' => [
'id' => 'desc',
],//排序
'_source' => [
'id','title'
],//显示字段
];
$data = $es->esSearch('sm_chenggu','chenggu',$query);
//统计
//$body与es搜索中的$query一样,都是搜索条件,相当于mysql的where
$body = [
'query' => [
'bool' => [
'must' => [
[
'match_phrase' => ['title' => $q]
],
],
],
],
];
$count = $es->esCount('suanming', 'zgjm_data', $body);
//es通过id获取|删除|修改
$data = $es->esOperaById('sm_chenggu','chenggu','1','get');//获取
$del = $es->esOperaById('sm_chenggu','chenggu','1','del');//删除
$edit = $es->esOperaById('sm_chenggu','chenggu','1','edit',$body);//修改
//删除index索引
$del_index = $es->esDel('sm_chenggu');
//es插入单条
$res = $es->esIndexOne('sm_chenggu','chenggu',$body);
//插入多条
for ($i = 0;$i <= $page;$i++){
$j = $i * 1000;
$k = ($i + 1) * 1000;
if ($i == $page){
$k = $j + $num;
}
//分页搜索,每次1000条
$sql = "select * from $db_name limit $j,$k";
$data = $db->get_all($sql);
foreach ($data as $key=>$val){
foreach ($column as $k=>$v){
$val[$v] = $this->operaStr($val[$v]);
}
//数据拼装
$body[] = [
'index' => [
'_id' => $val['id'],
],
];
$body[] = $val;
}
$es->esBulk($index,$db_name,$body);
}