zoukankan      html  css  js  c++  java
  • php使用elasticsearch

    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);
    }
    
  • 相关阅读:
    iOS UI基础05
    iOS UI基础04
    document.referrer
    节点
    特殊符号编码
    margin和padding的百分比
    XSS要点总结
    页面加载的过程
    函数声明和函数表达式
    jpg和png
  • 原文地址:https://www.cnblogs.com/ljkltt/p/14692572.html
Copyright © 2011-2022 走看看