记录一次elasticsearch-php工作过程
初始化
$hosts = array('192.168.30.41');
$this->client = \Elasticsearch\ClientBuilder::create()->setHosts($hosts)->build();
新建和设置index
$params = [
'index' => 'order',
'body' => [
'settings' => [
'max_result_window' => 10000000 #由于默认只能读取前10000条数据,这里设置为100w,但是代价就是分页越靠后,效率越低。也可以使用scan解决
],
'mappings' => [
'goods' => [
'_source' => [
'enabled' => true
],
'properties' => [
'product_code' => [
'type'=>'string',
'store'=>'yes',
'fielddata'=>true,
'fields'=>[
'raw'=>[ #由于需要按照这个字段分组统计,且不能进行分词,固这样配置。统计时字段需要写为 product_code.raw
'type'=>'string',
'index'=>'not_analyzed'
]
]
],
'order_id'=>[
'fielddata'=>true,
'type'=>'string'
],
'price'=>[
'type'=>'double'
],
'num'=>[
'type'=>'integer'
],
'pay_time'=>[
'type'=>'date',
'format'=>'yyyy-MM-dd HH:mm:ss'
],
'take_province'=>[
'type'=>'string',
'fielddata'=>true,
'store'=>'yes',
'fields'=>[
'raw'=>[
'type'=>'string',
'index'=>'not_analyzed'
]
]
],
'buyer_nike'=>[
'type'=>'string',
'fielddata'=>true
]
]
]
]
]
];
$response = $this->client->indices()->create($params);
插入数据(这里引用了官方文档的例子,大数据导入不使用insert,而使用更为效率的bulk)
$params = ['body' => []]; for ($i = 1; $i <= 1234567; $i++) {
$params['body'][] = [
'index' => [
'_index' => 'my_index',
'_type' => 'my_type',
'_id' => $i
]
]; $params['body'][] = [
'my_field' => 'my_value',
'second_field' => 'some more values'
]; // Every 1000 documents stop and send the bulk request
if ($i % 1000 == 0) {
$responses = $client->bulk($params); // erase the old bulk request
$params = ['body' => []]; // unset the bulk response when you are done to save memory
unset($responses);
}
} // Send the last batch if it exists
if (!empty($params['body'])) {
$responses = $client->bulk($params);
}
相关查询
1、查询某商品某时间段内订单数、售卖总数和总价格
#where product_code="xxx" and pay_time BETWEEN "2017-01-01 00:00:00" AND "2017-01-31 23:59:59"
$params = [
'index' => 'order',
'type' => 'goods',
'body' => [
'size' => 1,
'query' => [
"bool"=>[
"must"=>[
"term"=>["product_code.raw"=>$code] #上面解释过了,这里采用不分词的统计,使用字段.raw
],
"filter"=>[
"range"=>[
"pay_time"=>[
"gte"=>$start_time,
"lte"=>$end_time
]
]
]
]
],
'aggs' => [
'sum_this_product'=>['sum'=>['field'=>"num"]], #售卖总数量,sum累加
'total_price'=>['sum'=>['field'=>"price"]], #总价格
'distinct_orderid'=>['cardinality'=>['field'=>'order_id']] #去重订单数
]
]
];
$response = $this->client->search($params);
2、统计某时间段所有商品的订单数、售卖总数和总价格
#where pay_time BETWEEN "2017-01-01 00:00:00" AND "2017-01-31 23:59:59"
$params = [
'index' => 'order',
'type' => 'goods',
'body' => [
'size' => 0,
'query' => [
"bool"=>[
"filter"=>[
"range"=>[
"pay_time"=>[
"gte"=>$start_time,
"lte"=>$end_time
]
]
]
]
],
'aggs' => [
'num'=>[
'terms'=>[
'field'=>'product_code.raw',
'size'=>100,
'order'=>['sum_this_product'=>'desc'] #根据统计出来的售卖总数排序
],
'aggs'=>[
'sum_this_product'=>['sum'=>['field'=>'num']],
'total_this_product'=>['sum'=>['field'=>'price']],
'distinct_orderid'=>['cardinality'=>['field'=>'order_id']]
]
]
]
]
];
$response = $this->client->search($params);
唠叨:
1、这次使用的是docker环境,使用阿里镜像:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.21.F0KOV2&repoId=1209
2、官方文档:https://www.elastic.co/guide/en/elasticsearch/client/php-api/current/index.html
3、本次工作数据量大约1500w,需要复杂的统计和展现,mysql已经不能满足,故使用es。但是es不支持类似mysql:select in select这样的子查询,着实折腾了不少时间
4、感谢一位大神的博客:https://segmentfault.com/a/1190000004433446,这是个文章系列,很值得参考。
记录一次elasticsearch-php工作过程的更多相关文章
- Elasticsearch 的坑爹事——记录一次mapping field修改过程
Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapp ...
- Elasticsearch 的坑爹事——记录一次mapping field修改过程(转)
原文:http://www.cnblogs.com/Creator/p/3722408.html 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticse ...
- (转)Elasticsearch 的坑爹事——记录一次mapping field修改过程
Elasticsearch 的坑爹事 本文记录一次Elasticsearch mapping field修改过程 团队使用Elasticsearch做日志的分类检索分析服务,使用了类似如下的_mapp ...
- Nginx reopen reload作用及工作过程
http://www.iigrowing.cn/nginx-reopen-reload-zuo-yong-ji-gong-zuo-guo-cheng.html Nginx reopen reload作 ...
- 【Canal源码分析】parser工作过程
本文主要分析的部分是instance启动时,parser的一个启动和工作过程.主要关注的是AbstractEventParser的start()方法中的parseThread. 一.序列图 二.源码分 ...
- TCP工作过程;TCP Flood的攻击的原理和现象;TCP协议设计的安全隐患与防范对策
TCP分三个阶段 连接建立(三次握手) 数据传输 连接释放(四次挥手) TCP工作过程 TCP连接建立阶段 第一次握手:Client将标志位SYN置为1,随机产生一个值seq=J,并将该数据包发送给S ...
- ARP工作过程、ARP欺骗的原理和现象、如何防范ARP欺骗
地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议. 下面假设在一个局域网内,主机A要向主机B发送IP数据报. ARP ...
- 【Canal源码分析】client工作过程
client的工作过程,需要我们自己去编写对应的逻辑,我们目前只能从example写的例子来看.目前examle中提供了两个例子,一个是单机的,一个是集群的cluster,我们后续如果需要进行开发的话 ...
- 【流媒体】UPnP的工作过程
UPnP简介 通用即插即用(英语:Universal Plug and Play,简称UPnP)是由“通用即插即用论坛”(UPnP™ Forum)推广的一套网络协议. 该协议的目标是使家庭网络(数据共 ...
- MapReduce程序的工作过程
转自:http://www.aboutyun.com/thread-15494-1-2.html 问题导读1.HDFS框架组成是什么?2.HDFS文件的读写过程是什么?3.MapReduce框架组成是 ...
随机推荐
- MySQL的安装与维护
一.数据库的基本概念 数据库: 以一定方式储存在一起.能为多个用户共享.具有尽可能小的冗余度的特点.是与应用程序彼此独立的数据集合. DBMS(DataBase Management System,数 ...
- groovy编程注意事点
集合中一些方法工作在集合的一个副本上并且完成的时候返回这个副本,而另外一些方法直接操作这个集合对象. 和Java一样不能通过迭代移除元素. list和map遵循java规则限制,但通过附加的方法降低了 ...
- 杭电 OJ 提交代码需要注意的问题
杭电acm 提交代码需要注意的问题 1. 用 Java 的时候类名请用 Main 2. Java 提交出现 PE 的可能原因有 1) 最基本的错误是空格问题,比如注意每行的末尾是否输出空格 2) 用 ...
- 解决hash冲突之分离链接法
解决hash冲突之分离链接法 分离链接法:其做法就是将散列到同一个值的所有元素保存到一个表中. 这样讲可能比较抽象,下面看一个图就会很清楚,图如下 相应的实现可以用分离链接散列表来实现(其实就是一个l ...
- Android瀑布流照片
http://blog.csdn.net/guolin_blog/article/details/10470797 记得我在之前已经写过一篇关于如何在Android上实现照片墙功能的文章了,但那个时候 ...
- 总结:独立开发 jar 包组件——功能主要是支持查询数据库的所有表数据
前言:开发完一个项目,必定总结,这次就将总结记录在博客,第一次开发组件 jar 包,包含前端,后台,中间遇到好多问题,这里一一描述.转载请注明出处: https://www.cnblogs.com/y ...
- 记一次Full GC问题的排查
今天看到监控平台显示项目的Full GC次数过多,查看了一下监控曲线,如下图,发现发生的时间点基本上都是在上午十点之后,到下午五点. 分析:考虑到业务形态,开始初步怀疑是访问人数增多引起的虚拟机内存不 ...
- 华中农业大学第五届程序设计大赛网络同步赛-G
G. Sequence Number In Linear algebra, we have learned the definition of inversion number: Assuming A ...
- JQ面试问题(转载)
1 你在公司是怎么用jquery的? 答:在项目中是怎么用的是看看你有没有项目经验(根据自己的实际情况来回答) 你用过的选择器啊,动画啊,表单啊,ajax事件等 配置Jquery环境 下载jquery ...
- python解释器介绍以及Pycharm的破解
python语言是弱类型解释型语言,弱类型指的是没有强制规定它的类型. 由于是解释型语言,则必有解释器与其匹配,根据不同的工作环境以及需求,python的解释器有很多种, 官方推荐的是CPython, ...