当前位置:Gxlcms > PHP教程 > Elasticsearch-PHPapi简介

Elasticsearch-PHPapi简介

时间:2021-07-01 10:21:17 帮助过:45人阅读

这篇文章介绍的内容是关于Elasticsearch-PHP api的简介,现在分享给大家,有需要的朋友可以参考一下

Elasticsearch 是目前流行的大数据处理框架之一,详细的说明可以自行百度等.
以下文章采用es缩写作为代表Elasticsearch

es有官方的php api接口,可以采用github下载或者composer.


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

  1. $params = [ 'index' => 'user_index', //索引名(相当于mysql的数据库)
  2. 'body' => [ 'mappings' => [ 'normal_type' => [ //类型名(相当于mysql的表)
  3. '_all'=>[ // 是否开启所有字段的检索
  4. 'enabled' => 'false'
  5. ], 'properties' => [ //文档类型设置(相当于mysql的数据类型)
  6. 'uid' => [ 'type' => 'integer' // 字段类型为整型
  7. ], 'username' => [ 'type' => 'keyword' // 字段类型为关键字,如果需要全文检索,则修改为text,注意keyword字段为整体查询,不能作为模糊搜索
  8. ], 'platform' => [ 'type' => 'keyword'
  9. ], 'mobile' => [ 'type' => 'integer'
  10. ], 'sex' => [ 'type' => 'integer'
  11. ], 'source' => [ 'type' => 'keyword'
  12. ], 'province' => [ 'type' => 'keyword'
  13. ], 'city' => [ 'type' => 'keyword'
  14. ], 'tag' => [ 'properties' => [ 'tagName' =>[ 'type' => 'text'
  15. ], 'tagWeight' => [ 'type' => 'integer',
  16. ]
  17. ]
  18. ],
  19. ]
  20. ]
  21. ]
  22. ]
  23. ];
  24. $data = $client->indices()->create($params);

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

2.获取索引信息

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

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

返回的结果如下:

  1. array ( 'user_index' =>
  2. array ( 'settings' =>
  3. array ( 'index' =>
  4. array ( 'creation_date' => '1498116455327', 'number_of_shards' => '5', 'number_of_replicas' => '1', 'uuid' => '8pkONoI7RAuw5HjnFa4UaQ', 'version' =>
  5. array ( 'created' => '5020299',
  6. ), 'provided_name' => 'user_index',
  7. ),
  8. ),
  9. ),
  10. )

2.2 获取Mapping信息

  • 接口:$client->indices()->getMapping

  1. $params = [ 'index' => 'user_index', 'client' => [ 'ignore' => 404
  2. ]
  3. ];
  4. $res = $client->indices()->getMapping($params); //获取mapping信息

返回的结果如下:

  1. array ( 'user_index' =>
  2. array ( 'mappings' =>
  3. array ( 'normal_type' =>
  4. array ( '_all' =>
  5. array ( 'enabled' => false,
  6. ), 'properties' =>
  7. array ( 'city' =>
  8. array ( 'type' => 'keyword',
  9. ), 'mobile' =>
  10. array ( 'type' => 'integer',
  11. ), 'platform' =>
  12. array ( 'type' => 'keyword',
  13. ), 'province' =>
  14. array ( 'type' => 'keyword',
  15. ), 'sex' =>
  16. array ( 'type' => 'integer',
  17. ), 'source' =>
  18. array ( 'type' => 'keyword',
  19. ), 'uid' =>
  20. array ( 'type' => 'integer',
  21. ), 'username' =>
  22. array ( 'type' => 'keyword',
  23. ),
  24. ),
  25. ),
  26. ),
  27. ),
  28. )

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

2.3 修改/添加mapping信息

  • 注意事项:已经建立好的字段类型是不能更改的!!

  • 接口:$client->indices()->putMapping();

  1. $params = [ 'index' => 'user_index', //索引名(相当于mysql的数据库)
  2. 'type' => 'normal_type', 'body' => [ 'normal_type' => [ 'properties' =>[ 'tag' =>[ 'type' => 'text'
  3. ]
  4. ]
  5. ]
  6. ]
  7. ];
  8. $client->indices()->putMapping($params);

2.4 删除索引

  • 接口:$client->indices()->delete($params);

  1. $params = [ 'index' => 'user_index', //索引名(相当于mysql的数据库)
  2. ];

3 es的增删改查

3.1 增加数据

  • 单条数据插入

  • 接口:$client->index()

  1. $params = [ 'index' => 'my_index', 'type' => 'my_type', 'id' => 'my_id', // 不填则es会自动生成唯一的id
  2. 'body' => [ 'testField' => 'abc']
  3. ];
  4. $response = $client->index($params);
  • 批量数据插入

  • 接口:$client->bulk();

  1. foreach($userList as $value){
  2. $params['body'][] = [ 'index' => [ '_index' => 'user_index', '_type' => 'normal_type', '_id' =>$value['uid']
  3. ]
  4. ];
  5. $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'
  6. ];
  7. }
  8. $responses = $client->bulk($params);
  • ps:当循环插入大量数据时,需要注意php的内存超出限制的问题.(还不清楚这个框架哪部分操作之后没有释放内存)

3.2 搜索数据

  • 单条数据搜搜,但是需要知道id

  • 接口:$client->get()

  1. $params = [ 'index' => 'my_index', 'type' => 'my_type', 'id' => 'my_id' // es 自动生成/自己录入的];
  2. $response = $client->get($params);
  • 批量搜索

  • 接口:$client->search()

  1. $params = [
  2. 'index' => 'my_index', //['my_index1', 'my_index2'],可以通过这种形式进行跨库查询
  3. 'type' => 'my_type',//['my_type1', 'my_type2'],
  4. 'body' => [
  5. 'query' => [
  6. 'match' => [ // 搜索条件
  7. 'age' => '24' , 'tag.tagName' =>'tag' // 如果字段存储的是object.
  8. //这里搜索必须要这样才能搜索出结果.
  9. ]
  10. ],
  11. 'from' => '0', // 分页
  12. 'size' => '200' // 每页数量
  13. 'sort' => [ // 排序
  14. 'age' => 'desc' //对age字段进行降序排序
  15. ]
  16. ]
  17. ];
  18. $res = $client->search($params);

返回的数据大致如下:

  1. array (size=4) 'took' => int 2
  2. 'timed_out' => boolean false
  3. '_shards' =>
  4. array (size=3) 'total' => int 5
  5. 'successful' => int 5
  6. 'failed' => int 0
  7. 'hits' => // 搜索到数据
  8. array (size=3) 'total' => int 2
  9. 'max_score' => float 1
  10. 'hits' => // 具体数据包
  11. array (size=1) 0 =>
  12. array (size=5)
  13. ...
  • 很多时候需要用到类似mysql的and/or 查询es搜索也能做到.

  • 这个时候我们就要用到es的组合过滤器

  • https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-filters.html 官方文档如下

  • 以下是测试过的一个例子

  1. { "index": "xxx_index",
  2. "type": "normal_type",
  3. "body": { "size": 20,
  4. "from": 0,
  5. "query": { "bool": { "must": [
  6. { "match": { "tag.tagName": "xxxx"
  7. }
  8. }
  9. ]
  10. }
  11. },
  12. "sort": { "uid": "desc"
  13. }
  14. }
  15. }

3.3 删除数据

  • 注意:数据删除的时候有一定的缓存更新时间,在没更新的时候还是能被搜索出来.

  • 接口:$client->delete();

  1. $param = [ 'index' => 'my_index', 'type' => 'my_type', 'id' => 'my_id'
  2. ];
  3. $ret = $this->client->delete($param);

返回数据如下:

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

3.4 更新数据

  • 接口:$client->update()

  1. $params = [
  2. 'index' => 'my_index',
  3. 'type' => 'my_type',
  4. 'id' => '3416a75f4cea9109507cacd8e2f2aefc',
  5. 'body' => [
  6. 'doc' => [ // 必须带上这个.表示是文档操作
  7. 'age' => 150
  8. ]
  9. ]
  10. ];
  11. $res = $client->update($params);

返回结果

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

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

  • 注意:不同索引之间倒数据时,需要注意字段的类型,类型不一样会导致导入失败,这个时候可以使用script进行处理

  • 此接口不能再phpapi中运行,作为记录存在

  • 接口:POST _reindex

  1. POST _reindex
  2. { "source": { "index": "user_profile"
  3. }, "dest": { "index": "user_prfile_v1"
  4. }, "script": { "inline": " ctx._source.tag=params.new_tags", "params": { "new_tags":{ "tagName":null, "tagWeight":0
  5. }
  6. }
  7. }
  8. }



作者:汤敏正
链接:https://www.jianshu.com/p/a2837f487de6

相关推荐:

php调用接口api的方法

论vue项目api相关代码的组织方式

以上就是Elasticsearch-PHP api简介的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行