Elasticsearch-PHP api简介

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

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

 

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

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

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

2.获取索引信息

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

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

返回的结果如下:

  1.  
    array (
  2.  
    'user_index' =>
  3.  
    array (
  4.  
    'settings' =>
  5.  
    array (
  6.  
    'index' =>
  7.  
    array (
  8.  
     
  9.  
    'creation_date' => '1498116455327',
  10.  
    'number_of_shards' => '5',
  11.  
    'number_of_replicas' => '1',
  12.  
    'uuid' => '8pkONoI7RAuw5HjnFa4UaQ',
  13.  
    'version' =>
  14.  
    array (
  15.  
    'created' => '5020299',
  16.  
    ),
  17.  
    'provided_name' => 'user_index',
  18.  
    ),
  19.  
    ),
  20.  
    ),
  21.  
    )
  22.  
     

2.2 获取Mapping信息

  • 接口:$client->indices()->getMapping
  1.  
    $params = [
  2.  
    'index' => 'user_index',
  3.  
    'client' => [
  4.  
    'ignore' => 404
  5.  
    ]
  6.  
    ];
  7.  
    $res = $client->indices()->getMapping($params); //获取mapping信息
  8.  
     

返回的结果如下:

  1.  
    array (
  2.  
    'user_index' =>
  3.  
    array (
  4.  
    'mappings' =>
  5.  
    array (
  6.  
    'normal_type' =>
  7.  
    array (
  8.  
    '_all' =>
  9.  
    array (
  10.  
    'enabled' => false,
  11.  
    ),
  12.  
    'properties' =>
  13.  
    array (
  14.  
    'city' =>
  15.  
    array (
  16.  
    'type' => 'keyword',
  17.  
    ),
  18.  
    'mobile' =>
  19.  
    array (
  20.  
    'type' => 'integer',
  21.  
    ),
  22.  
    'platform' =>
  23.  
    array (
  24.  
    'type' => 'keyword',
  25.  
    ),
  26.  
    'province' =>
  27.  
    array (
  28.  
    'type' => 'keyword',
  29.  
    ),
  30.  
    'sex' =>
  31.  
    array (
  32.  
    'type' => 'integer',
  33.  
    ),
  34.  
    'source' =>
  35.  
    array (
  36.  
    'type' => 'keyword',
  37.  
    ),
  38.  
    'uid' =>
  39.  
    array (
  40.  
    'type' => 'integer',
  41.  
    ),
  42.  
    'username' =>
  43.  
    array (
  44.  
    'type' => 'keyword',
  45.  
    ),
  46.  
    ),
  47.  
    ),
  48.  
    ),
  49.  
    ),
  50.  
    )
  51.  
     

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

2.3 修改/添加mapping信息

  • 注意事项:已经建立好的字段类型是不能更改的!!
  • 接口:$client->indices()->putMapping();
  1.  
    $params = [
  2.  
    'index' => 'user_index', //索引名(相当于mysql的数据库)
  3.  
    'type' => 'normal_type',
  4.  
    'body' => [
  5.  
    'normal_type' => [
  6.  
    'properties' =>[
  7.  
    'tag' =>[
  8.  
    'type' => 'text'
  9.  
    ]
  10.  
    ]
  11.  
    ]
  12.  
    ]
  13.  
    ];
  14.  
    $client->indices()->putMapping($params);
  15.  
     

2.4 删除索引

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

3 es的增删改查

3.1 增加数据

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

3.2 搜索数据

  • 单条数据搜搜,但是需要知道id
  • 接口:$client->get()
  1.  
    $params = [
  2.  
    'index' => 'my_index',
  3.  
    'type' => 'my_type',
  4.  
    'id' => 'my_id' // es 自动生成/自己录入的
  5.  
    ];
  6.  
    $response = $client->get($params);
  7.  
     
  • 批量搜索
  • 接口:$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' ,
  8.  
    'tag.tagName' =>'tag' // 如果字段存储的是object.
  9.  
    //这里搜索必须要这样才能搜索出结果.
  10.  
    ]
  11.  
    ],
  12.  
    'from' => '0', // 分页
  13.  
    'size' => '200' // 每页数量
  14.  
    'sort' => [ // 排序
  15.  
    'age' => 'desc' //对age字段进行降序排序
  16.  
    ]
  17.  
    ]
  18.  
    ];
  19.  
    $res = $client->search($params);
  20.  
     

返回的数据大致如下:

  1.  
    array (size=4)
  2.  
    'took' => int 2
  3.  
    'timed_out' => boolean false
  4.  
    '_shards' =>
  5.  
    array (size=3)
  6.  
    'total' => int 5
  7.  
    'successful' => int 5
  8.  
    'failed' => int 0
  9.  
    'hits' => // 搜索到数据
  10.  
    array (size=3)
  11.  
    'total' => int 2
  12.  
    'max_score' => float 1
  13.  
    'hits' => // 具体数据包
  14.  
    array (size=1)
  15.  
    0 =>
  16.  
    array (size=5)
  17.  
    ...
  18.  
     
  1.  
    {
  2.  
    "index": "xxx_index",
  3.  
    "type": "normal_type",
  4.  
    "body": {
  5.  
    "size": 20,
  6.  
    "from": 0,
  7.  
    "query": {
  8.  
    "bool": {
  9.  
    "must": [
  10.  
    {
  11.  
    "match": {
  12.  
    "tag.tagName": "xxxx"
  13.  
    }
  14.  
    }
  15.  
    ]
  16.  
    }
  17.  
    },
  18.  
    "sort": {
  19.  
    "uid": "desc"
  20.  
    }
  21.  
    }
  22.  
    }

3.3 删除数据

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

返回数据如下:

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

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);
  12.  
     

返回结果

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

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

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

posted @ 2020-09-11 10:20  星云惊蛰  阅读(635)  评论(0)    收藏  举报