美文网首页程序员
PHP使用elasticsearch

PHP使用elasticsearch

作者: 懒人程序猿 | 来源:发表于2020-05-27 02:22 被阅读0次

    Elasticsearch-php 的安装可参考:https://www.elastic.co/guide/cn/elasticsearch/php/current/_installation_2.html
    使用Composer安装,安装时注意版本的对应。
    创建一个php项目,在项目根目录下创建composer.json文件。内容如下:

    {
        "require": {
            "elasticsearch/elasticsearch": "~6.0"
        }
    }
    

    使用 composer 安装客户端:首先要用下面第一个命令来安装 composer.phar ,然后使用第二个命令来执行安装程序。composer 会自动下载所有的依赖,把下载的依赖存储在 /vendor/ 目录下,并且创建一个 autoloader

    curl -s http://getcomposer.org/installer | php
    php composer.phar install --no-dev
    

    执行完上面的命令后,项目目录会出现以下几个文件及目录

    composer.json
    composer.lock
    composer.phar
    vendor
    

    下面开始创建客户端与客户端操作,项目根目录中创建一个demo文件夹。
    demo文件夹中创建一个Elastic类文件:Elastic.php,文件内容如下:

    <?php
    
    require '../vendor/autoload.php';
    
    /**
     * Class Elastic
     *
     */
    class Elastic
    {
        /*
        private static $hosts = [
            '127.0.0.1:9200',        // IP + Port
            '127.0.0.1:9201',        // IP + Port
        ];
        */
        // https安全认证,请参阅:https://www.elastic.co/guide/cn/elasticsearch/php/current/_security.html
        // http安全认证,格式:http://username:password@host:port
        private static $hosts = [
            'http://username:password@es-cn-nif1o3szx0015qjus.public.elasticsearch.aliyuncs.com:9200',
        ];
        private static $client;
    
        /**
         * @return \Elasticsearch\Client
         */
        public static function client()
        {
            try {
                if (empty(self::$client)) {
                    self::$client = Elasticsearch\ClientBuilder::create()->setHosts(self::$hosts)->build();
                }
            } catch (Exception $exception) {
                var_dump($exception->getMessage());
            }
            return self::$client;
        }
    
        /**
         * @return array
         */
        public static function createIndex()
        {
            // 创建一个 demo 的索引
            // 主切片数量1,副本切片数1
            // 索引类型(_doc),elasticsearch7.0以后的版本不再支持定义type类型
            // 设置title、content字段数据类型为text使用ik_max_word分词器,timeout字段数据类型为integer
            // elasticsearch默认分词器为standard,ik分词需要安装插件。
            // ik分词器有两种颗粒拆分,ik_smart: 会做最粗粒度的拆分、ik_max_word: 会将文本做最细粒度的拆分
            $params = array(
                'index' => 'demo',
                'body' => array(
                    'settings' => array(
                        'number_of_shards' => 1,
                        'number_of_replicas' => 1
                    ),
                    'mappings' => array(
                        '_doc' => array(
                            '_source' => array(
                                'enabled' => true
                            ),
                            'properties' => array(
                                'title' => array(
                                    'type' => 'text',
                                    'analyzer' => 'ik_max_word'
                                ),
                                'content' => array(
                                    'type' => 'text',
                                    'analyzer' => 'ik_max_word'
                                ),
                                'timeout' => array(
                                    'type' => 'integer'
                                )
                            )
                        )
                    )
                )
            );
            /**
             *  elasticsearch7.0以后的版本
             *
            $params = array(
                'index' => 'demo',
                'body' => array(
                    'settings' => array(
                        'number_of_shards' => 1,
                        'number_of_replicas' => 1
                    ),
                    'mappings' => array(
                        '_source' => array(
                            'enabled' => true
                        ),
                        'properties' => array(
                            'title' => array(
                                'type' => 'text',
                                'analyzer' => 'ik_max_word'
                            ),
                            'content' => array(
                                'type' => 'text',
                                'analyzer' => 'ik_max_word'
                            ),
                            'timeout' => array(
                                'type' => 'integer'
                            )
                        )
                    )
                )
            );
            */
            return self::client()->indices()->create($params);
        }
    
        /**
         * @return array
         */
        public static function deleteIndex()
        {
            $params = array(
                'index' => 'demo'
            );
            return self::client()->indices()->delete($params);
        }
    
        /**
         * @return array
         */
        public static function putSettings()
        {
            // 修改分区副本数为1
            // -1关闭索引刷新,可设置 '5s' 5秒、'15s' 15秒、'30s' 30秒...
            $params = array(
                'index' => 'demo',
                'body' => array(
                    'settings' => array(
                        'number_of_replicas' => 1,
                        'refresh_interval' => '30s'
                    )
                )
            );
            return self::client()->indices()->putSettings($params);
        }
    
        /**
         * @return array
         */
        public static function getSettings()
        {
            $params = array(
                'index' => ['demo']
            );
            return self::client()->indices()->getSettings($params);
        }
    
        /**
         * @return array
         */
        public static function putMapping()
        {
            $params = array(
                'index' => 'demo',
                'type' => '_doc',
                'body' => array(
                    '_doc' => array(
                        '_source' => array(
                            'enabled' => true
                        ),
                        // analyzer 使用分词器一旦生成不可更改,这里是对新增的字段进行的设置
                        'properties' => array(
                            'news' => array(
                                'type' => 'text',
                                'analyzer' => 'ik_smart'
                            ),
                            'news_title' => array(
                                'type' => 'text',
                                'analyzer' => 'ik_smart'
                            )
                        )
                    )
                )
            );
            return self::client()->indices()->putMapping($params);
        }
    
        /**
         * @return array
         */
        public static function getMapping()
        {
            $params = array(
                'index' => ['demo']
            );
            return self::client()->indices()->getMapping($params);
        }
    
        /**
         * @return array
         */
        public static function bulk()
        {
            $params = array();
            for ($i = 0; $i < 100; $i++) {
                $params['body'][] = array(
                    'index' => array(
                        '_index' => 'demo',
                        '_type' => '_doc'
                    )
                );
                $params['body'][] = array(
                    'title' => '科技的进步与创新,给我们带来了前所未有的体验',
                    'content' => '未来的科技发展会是什么样的呢',
                    'timeout' => $i,
                    'news' => '科技的进步与创新',
                    'news_title' => '未来的科技发展会是什么样的呢?给我们带来了前所未有的体验'
                );
            }
            return self::client()->bulk($params);
        }
    
        /**
         * @return array
         */
        public static function index()
        {
            $params = array(
                'index' => 'demo',
                'type' => '_doc',
                // 不提供id,会自动生成
                // 'id' => 'ids-asd',
                'body' => array(
                    'title' => '科技的进步与创新,给我们带来了前所未有的体验',
                    'content' => '未来的科技发展会是什么样的呢',
                    'timeout' => 100
                )
            );
            return self::client()->index($params);
        }
    
        /**
         * @return array
         */
        public static function create()
        {
            $params = array(
                'index' => 'demo',
                'type' => '_doc',
                'id' => 'ids-asd1p',
                'body' => array(
                    'title' => '科技的进步与创新,给我们带来了前所未有的体验',
                    'content' => '未来的科技发展会是什么样的呢',
                    'timeout' => 100
                )
            );
            return self::client()->create($params);
        }
    
        /**
         * @return array
         */
        public static function update()
        {
            // doc
            $params = array(
                'index' => 'demo',
                'type' => '_doc',
                'id' => 'FCDiUXIBaHckAWMH1vtU',
                'body' => array(
                    'doc' => array(
                        'title' => '科技的进步与创新,给我们带来了前所未有的体验.更新了',
                        'content' => '未来的科技发展会是什么样的呢。更新了',
                        'timeout' => 100
                    )
                )
            );
            return self::client()->update($params);
        }
    
        /**
         * @return array
         */
        public static function updateByQuery()
        {
            $params = array(
                'index' => ['demo'],
                'type' => ['_doc'],
                'body' => array(
                    'query' => array(
                        'match' => array(
                            'title' => '科技'
                        )
                    ),
                    'script' => array(
                        'source' => 'ctx._source.title=params.title;ctx._source.content=params.content;ctx._source.timeout=params.timeout;',
                        'params' => array(
                            'title' => '科技的进步与创新,给我们带来了前所未有的体验.更新了',
                            'content' => '未来的科技发展会是什么样的呢。更新了',
                            'timeout' => 100
                        )
                    )
                )
            );
            return self::client()->updateByQuery($params);
        }
    
        /**
         * @return array
         */
        public static function delete()
        {
            $params = array(
                'index' => 'demo',
                'type' => '_doc',
                'id' => 'KOetUXIBX-ZyL96-un8s'
            );
            return self::client()->delete($params);
        }
    
        public static function deleteByQuery()
        {
            $params = array(
                'index' => ['demo'],
                'type' => ['_doc'],
                'body' => array(
                    'query' => array(
                        'match' => array(
                            'title' => '科技'
                        )
                    )
                )
            );
            return self::client()->deleteByQuery($params);
        }
    
        /**
         * @return array
         */
        public static function get()
        {
            $params = array(
                'id' => 'PecKSHIBX-ZyL96-ywQO',
                'index' => 'demo',
                'type' => '_doc'
            );
            return self::client()->get($params);
        }
    
        /**
         * @return array
         */
        public static function search()
        {
            $params = array(
                'index' => 'demo',
                'type' => '_doc',
                'body' => array(
                    // query 查询
                    'query' => array(
                        'match' => array(
                            'title' => '科技'
                        )
                    ),
                    // 高亮
                    'highlight' => array(
                        "pre_tags" => ["<font color='red'>"],
                        "post_tags" => ["</font>"],
                        'fields' => array(
                            'title' => new \stdClass()
                        )
                    )
                ),
                'from' => 1,
                'size' => 2
            );
            return self::client()->search($params);
        }
    
    }
    
    // var_dump('<pre>', Elastic::createIndex());
    
    // var_dump('<pre>', Elastic::deleteIndex());
    
    // var_dump('<pre>', Elastic::putSettings());
    
    // var_dump('<pre>', Elastic::getSettings());
    
    // var_dump('<pre>', Elastic::getMapping());
    
    // var_dump('<pre>', Elastic::putMapping());
    
    // var_dump('<pre>', Elastic::bulk());
    
    // var_dump('<pre>', Elastic::index());
    
    // var_dump('<pre>', Elastic::create());
    
    // var_dump('<pre>', Elastic::update());
    
    // var_dump('<pre>', Elastic::updateByQuery());
    
    // var_dump('<pre>', Elastic::delete());
    
    // var_dump('<pre>', Elastic::deleteByQuery());
    
    // var_dump('<pre>', Elastic::get());
    
    // var_dump('<pre>', Elastic::search());
    
    

    创建索引

    Elastic::createIndex();
    

    删除索引

    Elastic::deleteIndex();
    

    动态设置索引设置项

    Elastic::putSettings();
    

    获取索引设置

    Elastic::getSettings();
    

    获取索引映射设置

    Elastic::getMapping();
    

    设置索引映射项

    Elastic::putMapping();
    

    批量添加文档

    Elastic::bulk();
    

    新增文档,当索引不存在的情况下会自动创建一个。不传id会自动生成一个id

    Elastic::index();
    

    新增文档,create需要设置id

    Elastic::create();
    

    通过id更新文档

    Elastic::update();
    

    通过匹配条件更新文档

    Elastic::updateByQuery();
    

    根据id删除文档

    Elastic::delete();
    

    通过匹配条件删除文档

    Elastic::deleteByQuery();
    

    通过id获取文档

    Elastic::get();
    

    搜索文档

    Elastic::search();
    

    相关文章

      网友评论

        本文标题:PHP使用elasticsearch

        本文链接:https://www.haomeiwen.com/subject/hfkiahtx.html