Elasticsearch-PHP api简介

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
      }
    }
  }
}


作者:汤敏正
链接:https://www.jianshu.com/p/a2837f487de6
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值