elasticsearch的多索引联合查询以及范围日期查询示例
一、前言
首先,博主这边要用ES
来代替传统的mysql
操作,那么原来的多表联合查询操作自然也要转换为多索引联合查找。这里使用elasticsearch-php
库来操作ES
,原生的ES
也是大同小异的。
日期查询优秀文章参考:
1、 自定义日期格式以及ES内置的日期格式
官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html
优秀博客:
https://blog.csdn.net/u011019726/article/details/69541946
https://blog.csdn.net/gui66497/article/details/80433693
2、 日期问题,可能是需要先设置好mapping才能 查
链接:https://blog.csdn.net/weixin_36270623/article/details/84794652 (这个在新建索引的时候最好就设置好)
二、正文示例
一直听说ES
的日期查询有个坑,那就是时区问题,现在终于轮到我碰到了,有点期待呢。记录一下。 这里我本地刚开始是搜索不到的,传过来的日期参数形如:2019-03-28 11:23:52
。后来看到kibana
中显示:02/Apr/2019:18:18:20 -0700
,所以试着在原来2019-03-29T01:43:01.368Z
的基础上加上7小时,发现可以搜索到了。这是因为在数据入库的时候,没有指定时区为asia/shanghai
,而ES
默认选择时区为UTC
,因此存储的数据和本地的json
数据存在时间差7小时。
1、多索引联合日期范围查询
代码:
$params = ['index' => ['zeusa.evony.com.accesslog-2019.03.28','zeusa.evony.com.accesslog-2019.03.29'], 'type' => 'doc','body' => ['from'=>10,'size'=>20, "_source"=>["includes"=>[ "pixel*"],// "excludes"=> [ "*.description" ]],'query' => ["range" =>["@timestamp" => [ "gt" => "2019-03-28T23:58:56.052Z", "lt" =>"2019-03-29T23:58:56.052Z", "time_zone" =>"+07:00",]] ]]];$repos = $this->client->search($params);$arr = [];foreach($repos['hits']['hits'] as $v){$arr[] = $v['_source'];}
解释:
(1)多索引查询: 多索引一起用,逗号隔开以数组的形式传过去,实测可以。根据业务把索引名拼成一个数组传进去即可
(2)关于size: 默认只查出来10条,可以自己控制条数,单默认设置不超过10000
条。如果要获取查询的数量,设置为0即可。
如果要查询的数据很多,参考:https://blog.csdn.net/bushanyantanzhe/article/details/79109721 设置max_result_window
参数即可
(3)关于查询字段: 字段名称要和kibana
中看到的ES
数据名称保持一致,比如这个字段前面的@
一定要有,因为kibana中的字段是有@
的
(4)时间日期格式: 格式要和元数据的格式保持一致,不能是简单的2019-03-28 11:23:52
,要么查询不出来数据,要不就会报错:
failed to parse date field [2019-03-28 11:23:52] with format [strict_date_optional_time||epoch_millis]: [Text '2019-03-28 11:23:52' could not be parsed, unparsed text found at index 10
(5)时间日期部分: 查询的时候,可以不精确到最后的sss
,一样可以正常查询出来.但必须要带上T
和Z
,不然会报错:
failed to parse date field [2019-03-29 08:43:11] withformat[strict_date_optional_time||epoch_millis
这里的TZ参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-date-format.html ,直接搜索 strict_date_time
即可找到该定义
(6)time_zone: 经过反复测试,这个字段没起到作用。可能是我的问题,欢迎指导,谢谢
(7)_source: 这部分是为了筛选数据,因为正常查询出来的数据总是含有很多无用的字段,我们做分析只需要部分字段即可。所以可以通过_source
的"includes
“属性
规定返回的字段,”excludes
"属性规定哪部分不反悔。我这里要查询的字段都有个前缀pixel
,例如pixel.user_id
等,所以使用pixel.*
过滤。
参考官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/1.7/docs-get.html#get-source-filtering
2、如果要精准查询,替换range为:
"bool"=>["filter" =>["term" => [ "@timestamp" =>"2019-03-29T08:43:11.274Z" ]]]
注意: 如果想要精准匹配,那就要用term
,这样只会查出user_id=2478
的记录。如果是用match
查询,那么会查出所有带有user_id=2478
的记录,也就是会有很多,比如 xxxxx&user_id=2478xxxxx
也会查出来。
3、格式化日期加上7小时
$start = "2019-03-28 16:48:11"; //转化搜索的时间为TZ格式,并且加上7小时 date('Y-m-d H:i:s',strtotime("$start+7hour")));$st_arr = explode(' ',date('Y-m-d H:i:s',strtotime("$start+7hour")));$start = $st_arr[0].'T'.$st_arr[1].'Z';
关于日期可以参考:https://blog.csdn.net/li_lening/article/details/80930323
以上就是关于elasticsearch
的多索引查询以及范围日期查询的内容,多索引的关键是用数组的方式传过去,源码部分会遍历这个索引数组,分别查询组合。日期查询的关键是时区转换,其他的就是DSL
的标准格式了。
end
elasticsearch的多索引联合查询以及范围日期查询示例相关推荐
- mysql 日期查询今天_Mysql 日期查询今天、昨天、近7天、近30天、本月、上一月、本季...
今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...
- mysql九九查询法_mysql日期查询法
话说有一文章表article,存储文章的添加文章的时间是add_time字段,该字段为int(5)类型的,现需要查询今天添加的文章总数并且按照时间从大到小排序,则查询语句如下: 02 03 1 sel ...
- 常用MYSQL日期查询
本文来说下常用的MYSQL日期查询 文章目录 常用MYSQL日期查询 常用MYSQL日期查询 MYSQL查询今天.昨天.本周.本月.上一月 .下一月.上一年.下一年.上季度.下季度 -- 今天 sel ...
- 【236期】ElasticSearch 进阶:一文全览各种 ES 查询在 Java 中的实现
点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...
- ElasticSearch进阶:一文全览各种ES查询在Java中的实现
ElasticSearch多种查询操作 前言 1 词条查询 1.1 等值查询-term 1.2 多值查询-terms 1.3 范围查询-range 1.4 前缀查询-prefix 1.5 通配符查询- ...
- sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)
一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...
- Elasticsearch 之 数据索引
对于提供全文检索的工具来说,索引时一个关键的过程--只有通过索引操作,才能对数据进行分析存储.创建倒排索引,从而让使用者查询到相关的信息. 本篇就ES的数据索引操作相关的内容展开: 更多内容参考:El ...
- Elasticsearch基础11——索引之别名使用
Elasticsearch的别名 别名的作用 在之前的文章中,介绍过Elasticsearch索引创建之后,假如尝试修改字段的类型的时候,除了重建索引之外没有别的办法. 假如我们尝试重建一个新的索引并 ...
- Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合
Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...
最新文章
- ISC2015听会小计
- Understanding Spring Web Application Architecture: The Classic Way--转载
- combobox 取消记忆功能_南京长江大桥桥头堡空间改造设计,记忆与纪念的共鸣
- 网络共享服务Samba和NFS配置
- Nginx的http块MIME-Type的使用
- 微服务负载均衡实现高可用_使用负载平衡实现大容量可用性
- 5.3 使用SQL还是NoSQL
- php会不会被人工智能取代,人工智能真的会取代前端开发吗?
- matlab 中的元组(cell)
- 随机矩阵理论在电力大数据分析中的应用
- 【算法java版09】:利用java实现对二进制数进行AMI编码
- 【论文】(COPRA)Finding overlapping communities in networks by label propagation
- sre工程师_什么是SRE? 现场可靠性工程师的重要作用
- diy 单片机 自动浇花_基于51单片机的自动浇花装置(很详细)
- 硬件安全技术——芯片安全设计技术1
- 安装 Win10+GTX1050ti+cuda8.0+cuDNN5.1+Tensorflow-gpu1.2
- 从mysql2ch到synch,一次重构与升级
- 换发型特效怎么制作?建议收藏这些方法
- Xshell 6的 InstallShield: 1628 完成基于脚本的安装失败
- 用Comparator接口进行排序 --java