Elasticsearch-PHP api简介

作者: 汤敏正 | 来源:发表于2017-06-27 14:35 被阅读4622次

    Elasticsearch 是目前流行的大数据处理框架之一,详细的说明可以自行百度等.
    以下文章采用es缩写作为代表Elasticsearch
    es有官方的php api接口,可以采用github下载或者composer.


    1.创建索引($client->indices()->create())

          $params = [
                    'index' => 'user_index',  //索引名(相当于mysql的数据库)
                    'body' => [
                        'mappings' => [
                            'normal_type' => [ //类型名(相当于mysql的表)
                                '_all'=>[   //  是否开启所有字段的检索
                                    'enabled' => 'false'
                                ],
                                'properties' => [ //文档类型设置(相当于mysql的数据类型)
                                    'uid' => [
                                        'type' => 'integer' // 字段类型为整型
                                    ],
                                    'username' => [
                                        'type' => 'keyword' // 字段类型为关键字,如果需要全文检索,则修改为text,注意keyword字段为整体查询,不能作为模糊搜索
                                    ],
    
                                    'platform' => [
                                        'type' => 'keyword'
                                    ],
                                    'mobile' => [
                                        'type' => 'integer'
                                    ],
                                    'sex' => [
                                        'type' => 'integer'
                                    ],
                                    'source' => [
                                        'type' => 'keyword'
                                    ],
                                    'province' => [
                                        'type' => 'keyword'
                                    ],
                                    'city' => [
                                        'type' => 'keyword'
                                    ],
                                  'tag' =>   [
                                    'properties'    =>  [
                                        'tagName'   =>[
                                            'type' => 'text'
                                        ],
                                        'tagWeight'   => [
                                            'type' => 'integer',
                                        ]
                                    ]
                                ],
                                ]
                            ]
                        ]
                    ]
                ];
                $data = $client->indices()->create($params);
    

    简单的索引就创建完毕了,现在我们可以获取下刚创建的索引信息.

    2.获取索引信息

    2.1 获取索引信息($client->indices()->getSettings())

         $params = [
                    'index' => 'user_index',
                    'client' => [
                        'ignore' => 404
                    ]
                ];
        $res = $client->indices()->getSettings($params);//获取库索引设置
    信息
    

    返回的结果如下:

      array (
        'user_index' => 
        array (
        'settings' => 
        array (
          'index' => 
          array (
    
            'creation_date' => '1498116455327',
            'number_of_shards' => '5',
            'number_of_replicas' => '1',
            'uuid' => '8pkONoI7RAuw5HjnFa4UaQ',
            'version' => 
            array (
              'created' => '5020299',
            ),
            'provided_name' => 'user_index',
            ),
          ),
        ),
     )
    

    2.2 获取Mapping信息

    • 接口:$client->indices()->getMapping
    $params = [
                    'index' => 'user_index',
                    'client' => [
                        'ignore' => 404
                    ]
                ];
    $res = $client->indices()->getMapping($params);   //获取mapping信息
    

    返回的结果如下:

    array (
      'user_index' => 
      array (
        'mappings' => 
        array (
          'normal_type' => 
          array (
            '_all' => 
            array (
              'enabled' => false,
            ),
            'properties' => 
            array (
              'city' => 
              array (
                'type' => 'keyword',
              ),
              'mobile' => 
              array (
                'type' => 'integer',
              ),
              'platform' => 
              array (
                'type' => 'keyword',
              ),
              'province' => 
              array (
                'type' => 'keyword',
              ),
              'sex' => 
              array (
                'type' => 'integer',
              ),
              'source' => 
              array (
                'type' => 'keyword',
              ),
              'uid' => 
              array (
                'type' => 'integer',
              ),
              'username' => 
              array (
                'type' => 'keyword',
              ),
            ),
          ),
        ),
      ),
    )
    

    这里获取的相关信息就是我们刚刚创建的索引es可以动态的修改以及添加相关的信息.

    2.3 修改/添加mapping信息

    • 注意事项:已经建立好的字段类型是不能更改的!!
    • 接口:$client->indices()->putMapping();
            $params = [
                'index' => 'user_index',  //索引名(相当于mysql的数据库)
                'type'  => 'normal_type',
                'body'  =>  [
                    'normal_type' => [
                        'properties'    =>[
                            'tag'   =>[
                                'type'  => 'text'
                            ]
                        ]
                    ]
                ]
            ];
    $client->indices()->putMapping($params);
    

    2.4 删除索引

    • 接口:$client->indices()->delete($params);
            $params = [
                'index' => 'user_index',  //索引名(相当于mysql的数据库)
            ];
    

    3 es的增删改查

    3.1 增加数据

    • 单条数据插入
    • 接口:$client->index()
    $params = [
        'index' => 'my_index',
        'type' => 'my_type',
        'id' => 'my_id', // 不填则es会自动生成唯一的id
        'body' => [ 'testField' => 'abc']
    ];
    $response = $client->index($params);
    
    • 批量数据插入
    • 接口:$client->bulk();
                    foreach($userList as $value){
                        $params['body'][] = [
                            'index' => [
                                '_index' => 'user_index',
                                '_type' => 'normal_type',
                                '_id'  =>$value['uid']
                            ]
                        ];
                        $params['body'][] = [
                            'uid' => $value['uid'],
                            'username' => $value['username'],
                            'platform' => $value['platform'],
                            'mobile' => $value['mobile'],
                            'province' => $value['province'],
                            'city' => $value['city'],
                            'sex' => $value['gender '],
                            'source'=>'xxx'
                        ];
                    }
                    $responses = $client->bulk($params);
    
    • ps:当循环插入大量数据时,需要注意php的内存超出限制的问题.(还不清楚这个框架哪部分操作之后没有释放内存)

    3.2 搜索数据

    • 单条数据搜搜,但是需要知道id
    • 接口:$client->get()
    $params = [
        'index' => 'my_index',
        'type' => 'my_type',
        'id' => 'my_id' // es 自动生成/自己录入的
    ];
    $response = $client->get($params);
    
    • 批量搜索
    • 接口:$client->search()
    $params = [  
        'index' =>  'my_index',   //['my_index1', 'my_index2'],可以通过这种形式进行跨库查询  
        'type' => 'my_type',//['my_type1', 'my_type2'],  
        'body' => [  
            'query' => [  
                'match' => [  // 搜索条件
                    'age' => '24' ,
                    'tag.tagName' =>'tag'  // 如果字段存储的是object.
                                           //这里搜索必须要这样才能搜索出结果.
                ]  
            ],  
            'from' => '0',  // 分页
            'size' => '200'  // 每页数量
            'sort' => [  // 排序
                'age' => 'desc'   //对age字段进行降序排序  
            ]  
        ]  
    ];  
    $res = $client->search($params);  
    

    返回的数据大致如下:

    array (size=4)
      'took' => int 2
      'timed_out' => boolean false
      '_shards' => 
        array (size=3)
          'total' => int 5
          'successful' => int 5
          'failed' => int 0
      'hits' =>  // 搜索到数据
        array (size=3)
          'total' => int 2
          'max_score' => float 1
          'hits' => // 具体数据包
            array (size=1)
              0 => 
                array (size=5)
                  ...
    
    {
        "index": "xxx_index", 
        "type": "normal_type", 
        "body": {
            "size": 20, 
            "from": 0, 
            "query": {
                "bool": {
                    "must": [
                        {
                            "match": {
                                "tag.tagName": "xxxx"
                            }
                        }
                    ]
                }
            }, 
            "sort": {
                "uid": "desc"
            }
        }
    }
    

    3.3 删除数据

    • 注意:数据删除的时候有一定的缓存更新时间,在没更新的时候还是能被搜索出来.
    • 接口:$client->delete();
    $param = [
                    'index' => 'my_index',
                    'type' => 'my_type',
                    'id'    => 'my_id'
                ];
                $ret = $this->client->delete($param);
    

    返回数据如下:

    array (size=7)
      'found' => boolean true
      '_index' => string 'user_index' (length=10)
      '_type' => string 'normal_type' (length=11)
      '_id' => string 'AVzh_QnIZvcaH3gE7MvE' (length=20)
      '_version' => int 2
      'result' => string 'deleted' (length=7)
      '_shards' => 
        array (size=3)
          'total' => int 2
          'successful' => int 1
          'failed' => int 0
    

    3.4 更新数据

    • 接口:$client->update()
    $params = [  
        'index' => 'my_index',  
        'type' => 'my_type',  
        'id' => '3416a75f4cea9109507cacd8e2f2aefc',  
        'body' => [  
            'doc' => [  // 必须带上这个.表示是文档操作
                'age' => 150  
            ]  
        ]  
    ];  
    $res = $client->update($params); 
    

    返回结果

    array (size=6)
      '_index' => string 'user_index' (length=10)
      '_type' => string 'normal_type' (length=11)
      '_id' => string 'AVzh_QnIZvcaH3gE7Mw5' (length=20)
      '_version' => int 2
      'result' => string 'updated' (length=7)
      '_shards' => 
        array (size=3)
          'total' => int 2
          'successful' => int 1 // 当数据没有发生变化时这里是为0
          'failed' => int 0
    

    4.不同索引之间进行倒数据

    • 注意:不同索引之间倒数据时,需要注意字段的类型,类型不一样会导致导入失败,这个时候可以使用script进行处理
    • 此接口不能再phpapi中运行,作为记录存在
    • 接口:POST _reindex
    POST _reindex
    {
      "source": {
        "index": "user_profile"
      },
      "dest": {
        "index": "user_prfile_v1"
      },
      "script": {
        "inline": " ctx._source.tag=params.new_tags",
        "params": {
          "new_tags":{
            "tagName":null,
            "tagWeight":0
          }
        }
      }
    }
    

    相关文章

      网友评论

      • 1ee52b4889a2:感谢分享
      • 牧月浮水:2.3 修改/添加mapping信息 在2.x版本下报错 不知道为什么
        汤敏正:sorry,那么久才回复你,方便贴下错误信息吗

      本文标题:Elasticsearch-PHP api简介

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