一、前言

首先,博主这边要用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,一样可以正常查询出来.但必须要带上TZ,不然会报错:

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的多索引联合查询以及范围日期查询示例相关推荐

  1. mysql 日期查询今天_Mysql 日期查询今天、昨天、近7天、近30天、本月、上一月、本季...

    今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ...

  2. mysql九九查询法_mysql日期查询法

    话说有一文章表article,存储文章的添加文章的时间是add_time字段,该字段为int(5)类型的,现需要查询今天添加的文章总数并且按照时间从大到小排序,则查询语句如下: 02 03 1 sel ...

  3. 常用MYSQL日期查询

    本文来说下常用的MYSQL日期查询 文章目录 常用MYSQL日期查询 常用MYSQL日期查询 MYSQL查询今天.昨天.本周.本月.上一月 .下一月.上一年.下一年.上季度.下季度 -- 今天 sel ...

  4. 【236期】ElasticSearch 进阶:一文全览各种 ES 查询在 Java 中的实现

    点击上方"Java精选",选择"设为星标" 别问别人为什么,多问自己凭什么! 下方有惊喜,留言必回,有问必答! 每天 08:15 更新文章,每天进步一点点... ...

  5. ElasticSearch进阶:一文全览各种ES查询在Java中的实现

    ElasticSearch多种查询操作 前言 1 词条查询 1.1 等值查询-term 1.2 多值查询-terms 1.3 范围查询-range 1.4 前缀查询-prefix 1.5 通配符查询- ...

  6. sql优化之:数据库索引创建原则,or/in/union与索引优化,聚集索引/非聚集索引/联合索引/索引覆盖,MySQL冗余数据的三种方案,MySQL双主一致性架构优化(来源:架构师之路)

    一.一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order where status!=0 and stauts!=1 not in/not exists都不是好 ...

  7. Elasticsearch 之 数据索引

    对于提供全文检索的工具来说,索引时一个关键的过程--只有通过索引操作,才能对数据进行分析存储.创建倒排索引,从而让使用者查询到相关的信息. 本篇就ES的数据索引操作相关的内容展开: 更多内容参考:El ...

  8. Elasticsearch基础11——索引之别名使用

    Elasticsearch的别名 别名的作用 在之前的文章中,介绍过Elasticsearch索引创建之后,假如尝试修改字段的类型的时候,除了重建索引之外没有别的办法. 假如我们尝试重建一个新的索引并 ...

  9. Elasticsearch(三)——Es搜索(简单使用、全文查询、复合查询)、地理位置查询、特殊查询、聚合操作、桶聚合、管道聚合

    Elasticsearch(三)--Es搜索(简单使用.全文查询.复合查询).地理位置查询.特殊查询.聚合操作.桶聚合.管道聚合 一.Es搜索 这里的 Es 数据博主自己上网找的,为了练习 Es 搜索 ...

最新文章

  1. ISC2015听会小计
  2. Understanding Spring Web Application Architecture: The Classic Way--转载
  3. combobox 取消记忆功能_南京长江大桥桥头堡空间改造设计,记忆与纪念的共鸣
  4. 网络共享服务Samba和NFS配置
  5. Nginx的http块MIME-Type的使用
  6. 微服务负载均衡实现高可用_使用负载平衡实现大容量可用性
  7. 5.3 使用SQL还是NoSQL
  8. php会不会被人工智能取代,人工智能真的会取代前端开发吗?
  9. matlab 中的元组(cell)
  10. 随机矩阵理论在电力大数据分析中的应用
  11. 【算法java版09】:利用java实现对二进制数进行AMI编码
  12. 【论文】(COPRA)Finding overlapping communities in networks by label propagation
  13. sre工程师_什么是SRE? 现场可靠性工程师的重要作用
  14. diy 单片机 自动浇花_基于51单片机的自动浇花装置(很详细)
  15. 硬件安全技术——芯片安全设计技术1
  16. 安装 Win10+GTX1050ti+cuda8.0+cuDNN5.1+Tensorflow-gpu1.2
  17. 从mysql2ch到synch,一次重构与升级
  18. 换发型特效怎么制作?建议收藏这些方法
  19. Xshell 6的 InstallShield: 1628 完成基于脚本的安装失败
  20. 用Comparator接口进行排序 --java

热门文章

  1. 以字符串数组为输入参数的存储过程
  2. yolov5 simplepose人体姿态
  3. sqlite DLL load failed
  4. pil numpy转换二值图
  5. No module named 'dlframework.common.utils.local'
  6. copy of an AVPacket structure
  7. Python 进度条 tqdm
  8. errors_impl.InvalidArgumentError: Input to reshape is a tensor
  9. python 逻辑回归
  10. java获取执行时间