linux下es安装
https://blog.csdn.net/yjclsx/article/details/81302041
不使用root帐户开启elasticsearch软件啊啊
elasticsearch所在目录进行授权 chmod -R 777 elasticsearch-6.2.4
bin/elasticsearch -d
es安装出现问题
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
在虚拟机的设置中,将处理器的处理器核心数量改成2,重新执行启动命令后,能够正常运行。若还是未能执行成功,可进一步将处理器数量也改成2.
远程连接修改配置文件 config/elasticsearch.yml
network.bind_host: 0.0.0.0
cluster.name: elastic-cluster
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
bootstrap.memory_lock: true
discovery.type: single-node
http.cors.enabled: true
http.cors.allow-origin: "*"
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($userListas$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'=> int2'timed_out'=> booleanfalse'_shards'=>array(size=3)'total'=> int5'successful'=> int5'failed'=> int0'hits'=>// 搜索到数据array(size=3)'total'=> int2'max_score'=> float1'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'=> booleantrue'_index'=> string'user_index'(length=10)'_type'=> string'normal_type'(length=11)'_id'=> string'AVzh_QnIZvcaH3gE7MvE'(length=20)'_version'=> int2'result'=> string'deleted'(length=7)'_shards'=>array(size=3)'total'=> int2'successful'=> int1'failed'=> int0
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'=> int2'result'=> string'updated'(length=7)'_shards'=>array(size=3)'total'=> int2'successful'=> int1// 当数据没有发生变化时这里是为0'failed'=> int0
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} } }}
网友评论