Elasticsearch 教程,Elasticsearch 日期查询详解,Elasticsearch Date 查询Java API

soゝso 2017-05-24 15:36:31 37163

介于之前出过一系列的  Elasticsearch  入门  Java  教程,包含了增删改查。更多Elasticsearch 相关请查看 Elasticsearch教程 链接:https://www.sojson.com/tag_elasticsearch.html

最近几天有几位同学问题,  Elasticsearch  日期字段怎么处理,怎么查询。确实看上去有点复杂,今天我在这里详细说下日期查询。另外之前写了深入Elasticsearch Date类型存储的博客:https://www.sojson.com/blog/149.html 有时间可以看看,先看下面的吧。

Elasticsearch 日期存储 Java API

存储的时候,我采用的方式是直接存储Date 类型。上部分代码。

//Map集合		
for (Map<String,Object> source : jsonArray) {
	//直接
	IndexRequestBuilder lrb = ESTools.client.prepareIndex(index, type,id)
		//直接set
		.setSource(source);
	//TTL
	if(null !=  timer && timer.length > 0){
		lrb.setTTL(timer[0]);
	}
	bulkRequest.add(lrb);	
}

如果有日期查询,大量的日期查询,建议想清楚,是以String Date ,还是Long 类型的毫秒值,怎么存储怎么查询。

Elasticsearch 日期查询 Java API

先来一个完整的业务代码。里面包含时间查询,其实业务很简单,我就需要当天的数据。

/**
 * 浏览记录,分页查询
 * @param key		用户key
 * @param pageSize	size
 * @param pageNo	no
 * @param isToday	是否只返回当天数据
 * @return			分页对象
 */
public static Pagination<HistoryBo> findByHistoryPage(String key, Integer pageSize, Integer pageNo,boolean isToday) {
	Pagination<HistoryBo> page = new Pagination<HistoryBo>();
	pageNo = null==pageNo?1:pageNo;
	page.setPageNo(pageNo);
	page.setPageSize(pageSize);
	
	
	Client client = ESTools.client;
	SearchRequestBuilder srb = client.prepareSearch(BaseMapping.HISTORY_INDEX);
	//根据用户key查询
    srb.setQuery(QueryBuilders.termQuery("key",key) );
    
    /*******************************|日期查询代码 start|***********************************/
    //是否只查询当天
    if(isToday){
    	//取到当天凌晨时间
    	Calendar cal = Calendar.getInstance();
    	cal.set(Calendar.HOUR_OF_DAY,0);
    	cal.set(Calendar.MINUTE, 0);
    	cal.set(Calendar.SECOND, 0);
    	cal.add(Calendar.DATE,0);
    	//查询今天的的数据,查询createDate 字段,大于当天0点的时间
    	srb.setQuery(QueryBuilders.rangeQuery("createDate").gt(cal.getTime()));
    }
    /*******************************|日期查询代码 end|***********************************/
    
    
	/**设置返回version,默认是false**/
    srb.setVersion(Boolean.TRUE);
    srb.addSort("createDate", SortOrder.DESC);
	srb.setFrom((pageNo - 1) * pageSize).setSize(pageSize);
	//srb.setExplain(Boolean.TRUE)
	//get() == execute().actionGet(); 新版本把execute().actionGet() 封装成get().
	SearchResponse response = srb.get();
	SearchHits hits = response.getHits();
	//total
	int total = (int)hits.getTotalHits();
	page.setTotalCount(total);
	
	List<HistoryBo> list = new ArrayList<HistoryBo>(total);
	for (SearchHit searchHit : hits) {
		Map<String, Object> source = searchHit.getSource();
		String id = searchHit.getId();
		//获取version,作为count返回
		long v = searchHit.getVersion();
		//先创建,防止catch后 null.toString()异常。
		
		Gson gson = new Gson();
		String json = "";
		try {
			json = gson.toJson(source);
			HistoryBo entity =  gson.fromJson(gson.toJson(source), HistoryBo.class);
			entity.setCount(v);
			entity.setKey(id);//把ID取出来,给key赋值,方便删除操作
			list.add(entity);
		} catch (Exception e) {
			LoggerUtils.fmtError(SelectManager.class, e, "转换为<HistoryBo>失败,Data[%s]", json);
			continue;
		}
	}
	page.setList(list);
	return page;
	
}

Elasticsearch 时间查询Java API说明

按Date类型查询

查询大于一个给定的时间。

//查询大于一个给定的时间
QueryBuilders.rangeQuery("date").gt(date);

查询一个区间时间

//查询区间时间
QueryBuilders.rangeQuery("date").lt(beginDate).gt(endDate);

查询小于给定的时间

//查询小于给定时间的数据
QueryBuilders.rangeQuery("date").lt(beginDate);

Date 以格式化字符串方式查询。

查询小于给定时间的数据

//查询小于给定时间的数据
QueryBuilders.rangeQuery("date").format("yyyyMMdd").lt("20170505");

查询区间时间

//查询区间时间
srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gt("20170505").lt("20170530"));

查询等于给定时间

//查询等于给定时间
srb.setQuery(QueryBuilders.rangeQuery("date").format("yyyyMMdd").gte("20170505"));

小插曲:这里我建议格式化话的时候,中间别带“-” ,只是建议。因为我测试把“20170505” 写成 int 类型的 20170505  查询是OK 的。

有问题加群继续沟通。另外上次记得深入了一次Elasticsearch date 类型存储的博客。

另外存储Date,请认准java.util.Date  , 切勿用 java.sql.Date

有时间可以看看:https://www.sojson.com/blog/149.html


版权所属:SO JSON在线解析

原文地址:https://www.sojson.com/blog/231.html

转载时必须以链接形式注明原始出处及本声明。

本文主题:

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

关于作者
一个低调而闷骚的男人。
相关文章
Elasticsearch教程Elasticsearch count 查询Elasticsearch 查询是否存在
Elasticsearch教程(九) elasticsearch 查询数据 | 分页查询
Elasticsearch教程Elasticsearch Java API创建Mapping,指定分词器
Elasticsearch教程(八) elasticsearch delete 删除数据(Java
Elasticsearch 聚合(aggregation)查询返回所有
Elasticsearch教程(六) elasticsearch Client创建
Elasticsearch教程(五) elasticsearch Mapping的创建
Elasticsearch 分词,Elasticsearch Java API 分词 操作
Elasticsearch教程Elasticsearch配置文件 — elasticsearch.yml
Elasticsearch教程(七) elasticsearch Insert 插入数据(Java
最新文章
使用七牛云存储实现图片API,自动删除图片方案合集 1140
神速ICP备案经验分享,ICP备案居然一天就通过了 2238
百度加强推送URL链接,百度SEO强行推送链接JavaScript代码案例讲解。 2913
SOJSON 拓展服务器被DDos攻击了一晚上,是如何解决的? 3358
湖南地区备案“新增网站需提交组网方案或解释说明”,关于备案做简单叙述 3314
企查查你是个什么企业,骗子的帮凶,诈骗的集中营,通过企查查骚扰企业电话不断,为所欲为的企查查 9623
Java爬取百度云观测对网站的检测数据,获取子域名及域名的安全信息 2555
【2020年】百度搜索词获取,获取百度搜索的关键词【真实有效】 7037
Nodejs环境安装,Nodejs环境安装一篇就够了 1804
iOS版淘宝打开提示“您使用的程序是内测版本,将于2020-03-28到期,到期将无法使用,请尽快下载最新版本” 2505
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 432360
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 417837
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 350803
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 312147
免费天气API,天气JSON API,不限次数获取十五天的天气预报 288054
Elasticsearch教程(四) elasticsearch head 插件安装和使用 221370
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 177535
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 136407
Elasticsearch教程(一),全程直播(小白级别) 119609
Elasticsearch教程(五) elasticsearch Mapping的创建 98909

骚码加入我们 / 千人QQ群:259217951

入群需要5元为的是没有垃圾广告,如果没有QQ钱包,可以加群主拉进。

二维码生成 来自 >> 二维码生成器

支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...