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) -
... -
- 很多时候需要用到类似mysql的and/or 查询es搜索也能做到.
- 这个时候我们就要用到es的组合过滤器
- https://www.elastic.co/guide/cn/elasticsearch/guide/current/combining-filters.html 官方文档如下
- 以下是测试过的一个例子
-
{
-
"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 -
} -
} -
} -
} -

浙公网安备 33010602011771号