视频教程分类
推荐视频教程
  • Laraval 9 学习正当时—保姆级教程,想学不会都难!Laraval 9 学习正当时—保姆级教程,想学不会都难!
  • 千万级数据并发解决方案(理论+实战)千万级数据并发解决方案(理论+实战)
  • Laravel基础与实战(模块化)Laravel基础与实战(模块化)
  • UNI-APP开发(仿饿了么)UNI-APP开发(仿饿了么)
  • 首页 >后端开发 >php教程 > 正文

    PHP Elasticsearch的基本使用方法

    原创2022-05-13 11:03:1531204 关注公众号:每天精选资源文章推送
    对于Elasticsearch与Elasticsearch-php的安装,网上有比较多的教程,这里不再累述。只是要注意Elasticsearch、Elasticsearch-php与php的版本。这里笔者使用的是Elasticsearch 5.6.8 windows版、php 5.6 、php onethink框架(以下简称ot)、Elasticsearch-php composer如下:(PHP Composer 视频教程

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

    课程推荐→:《elasticsearch全文搜索实战》(实战视频)

    来自课程《千万级数据并发解决方案(理论+实战)》

    一、连接Elasticsearch:

    1、Elasticsearch开启之后,可以直接通过http://127.0.0.1:9200/查看基本信息。

    2、将composer vendor下的文件复制到ot ThinkPHP\Library\Vendor\elasticsearch目录下。

    3、连接Elasticsearch,

        public $es;
    
        /**
         * 初始化
         */
        public function _initialize()
        {
            Vendor('elasticsearch.autoload');
            //host数组可配置多个节点
            $params = array(
                '127.0.0.1:9200'
            );
            $this->es = \Elasticsearch\ClientBuilder::create()->setHosts($params)->build();
        }

    其中build()方法会将ClientBuilder 对象转换为一个Client对象。

    二、Elasticsearch-php使用:

    1、创建index:

    关于index与type,这里特别纠正一个说法,index 就像关系型数据库里的 database, type 就像 database 里的 table,这种理解是错误的。

        /**
         * 创建索引
         */
        public function createIndex(){
            $params = [
                'index' => 'test', //索引名称
                'body' => [
                    'settings'=> [ //配置
                        'number_of_shards'=> 3,//主分片数
                        'number_of_replicas'=> 1 //主分片的副本数
                    ],
                    'mappings'=> [  //映射
                        '_default_' => [ //默认配置,每个类型缺省的配置使用默认配置
                            '_all'=>[   //  关闭所有字段的检索
                                'enabled' => 'false'
                            ],
                            '_source'=>[   //  存储原始文档
                                'enabled' => 'true'
                            ],
                            'properties'=> [ //配置数据结构与类型
                                'name'=> [ //字段1
                                    'type'=>'string',//类型 string、integer、float、double、boolean、date
                                    'index'=> 'analyzed',//索引是否精确值  analyzed not_analyzed
                                ],
                                'age'=> [ //字段2
                                    'type'=>'integer',
                                ],
                                'sex'=> [ //字段3
                                    'type'=>'string',
                                    'index'=> 'not_analyzed', 
                                ],
                            ]
                        ],
                        'my_type' => [ 
                            'properties' => [
                                'phone'=> [ 
                                    'type'=>'string',
                                ],                            
                            ]
                        ],
                    ],
                ]
            ];
    
            $res = $this->es->indices()->create($params);
        }

    在使用Elasticsearch-php API的时候,参数$params一般是用数组来,因为数组结构能很方便的转换为json。其中

    _default_是默认配置,其他配置的缺省值都与_default_的相同。

    _all设置true会将所有原始文档拼接在一起额外存储,

    _source设置为true会存储原始文档,设置false一般用在只需要索引出文档的标题或者Url,通过Url去访问文档,而不需要在es中保存一份文档内容的场景。

    最后,注意同一index下不同type中的同名称字段的数据类型与配置也必须相同

    2、删除index:

        /**
         * 删除索引
         */
         public function deleteIndex(){
            $params = [
                'index' => 'test'
            ];
    
            $res = $this->es->indices()->delete($params);
         }

    3、查看Mappings:

        public function getMappings(){
            $params = [
                'index' => 'test'
            ];
    
            $res = $this->es->indices()->getMapping($params);
        }

    4、修改Mappings:

        public function putMappings(){
            $params = [           
                'index' => 'test',
                'type' => 'my_type',
                'body' => [
                    'my_type' => [
                        'properties' => [
                            'idcard' => [
                                'type' => 'integer'
                            ]
                        ]
                    ]
                ]
            ]; 
    
            $res = $this->es->indices()->putMapping($params);      
        }

    注意:修改Mappings的API必须要指明type,且只能添加,不能修改已有的属性。

    5、插入单条 Document:

        public function postSinDoc(){
            $params = [
                'index' => 'test',
                'type' => 'my_type',
                'body' => [ 
                    'age' => 17,
                    'name' => 'saki',
                    'sex' => '女性',
                    'idcard' => 1112,
                    'phone' => '1245789',
                ]
            ];
    
            $res = $this->es->index($params);
        }

    6、插入多条 Document:

        public function postBulkDoc(){
            for($i = 0; $i < 5; $i++) {
                $params['body'][] = [
                    'index' => [
                        '_index' => 'test',
                        '_type' => 'my_type',
                    ]
                ];
    
                $params['body'][] = [
                    'age' => 17+$i,
                    'name' => 'reimu'.$i,
                    'sex' => '女性',
                    'idcard' => 1112+$i,
                    'phone' => '1245789'.$i,
                ];
            }
    
            $res = $this->es->bulk($params);
        }

    7、通过id获取Document:

        public function getDocById(){
            $params = [
                'index' => 'test',
                'type' => 'my_type',
                'id' => 'AWIDV5l2A907wJBVKu6k'
            ];
    
            $res = $this->es->get($params);
        }

    8、通过id更新Document:

        public function updateDocById(){
            $params = [
                'index' => 'test',
                'type' => 'my_type',
                'id' => 'AWIDV5l2A907wJBVKu6k',
                'body' => [
                    'doc' => [ //将doc中的文档与现有文档合并
                        'name' => 'marisa'
                    ]
                ]
            ];
    
            $res = $this->es->update($params);
        }

    9、通过id删除Document:

        public function deleteDocById(){
            $params = [
                'index' => 'test',
                'type' => 'my_type',
                'id' => 'AWIDV5l2A907wJBVKu6k'
            ];
    
            $res = $this->es->delete($params);
        }

    注意:以上通过id的三个操作,如果未找到id,Elasticsearch-php会直接报错!

    10、搜索Document:

        public function searchDoc(){
            $params = [
                'index' => 'test',
                'type' => 'my_type',
                'body' => [
                    'query' => [
                        'constant_score' => [ //非评分模式执行
                            'filter' => [ //过滤器,不会计算相关度,速度快
                                'term' => [ //精确查找,不支持多个条件
                                    'name' => 'reimu0'
                                ]
                            ]
                            
                        ]
                    ]
                ]
            ];
    
            $res = $this->es->search($params);

    这里只是搜索的一个示例。

    相关推荐:

    实例详解MySQL 与 Elasticsearch 数据不对称问题

    Elasticsearch是什么?Elasticsearch 能够被用在什么地方?

    Elasticsearch索引和文档操作实例教程

    以上就是PHP Elasticsearch的基本使用方法的详细内容,更多请关注php中文网其它相关文章!

    高并发千万级数据库系统解决方案

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    相关文章

    相关视频


    专题推荐