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