程序员

PHP使用elasticsearch

2020-05-27  本文已影响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();
上一篇下一篇

猜你喜欢

热点阅读