Mongodb与Elasticsearch配合使用进一步研究(二),
有一个问题:Mongodb与Elasticsearch通过River连接起来之后,想通过Elasticsearch查询存储在Mongodb上面的一段时间内的数据。
解决方案一:开始想在Mongodb中存入时间类型(Date),然后通过Elasticsearch进行检索一段时间内的信息,但是问题出现了,存入Mongdb内的数据总是和当前时间总是差8个小时。后来发现 jvm里面的时区和Mongodb的时区是本来就差8个小时。该怎么办呢?
解决方案二:向Mongodb存入数据之前,前对时间进行如下处理:
1 2 3 4 5 6 7 |
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = null;date = format.parse(format.format(new Date()));Calendar cla = Calendar.getInstance();cla.setTime(date);cla.add(Calendar.HOUR_OF_DAY,8);data4.put("start_time",cla.getTime().getTime()); |
然后用下面的代码向Mongodb内存入数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@SuppressWarnings("deprecation")Mongo mongo = new Mongo("192.168.100.103", 10111); // 连接名为xiaodb的数据库,假如数据库不存在的话,mongodb会自动建立 DB db = mongo.getDB("mydb"); DBCollection dbColl = db.getCollection("users"); for(int i = 5; i < 10;i++){ DBObject data4 = new BasicDBObject(); data4.put("_id",i); data4.put("cust_Id",i+""); data4.put("is_Show",i); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; date = format.parse(format.format(new Date())); Calendar cla = Calendar.getInstance(); cla.setTime(date); cla.add(Calendar.HOUR_OF_DAY,8); data4.put("start_time",cla.getTime()); System.out.println(cla.getTime().toString()); dbColl.insert(data4); Thread.sleep(1000);} |
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String startTime = "2015-08-04 19:55:22";String endTime = "2015-08-04 19:55:26"; Date start = null;Date end = null; start = format.parse(startTime);end = format.parse(endTime); System.out.println(start.toString()); Calendar startCla = Calendar.getInstance();startCla.setTime(start);startCla.add(Calendar.HOUR_OF_DAY,8); Calendar endCla = Calendar.getInstance();endCla.setTime(end);endCla.add(Calendar.HOUR_OF_DAY,8); System.out.println(endCla.getTime()); QueryBuilder rangeqb = QueryBuilders.rangeQuery("start_time").from(startCla.getTime()).to(endCla.getTime()); SearchResponse response = client.prepareSearch("myindex") .setTypes("users") .setSearchType(SearchType.DEFAULT) .setQuery(filterQueryBuilder) .setFrom(0).setSize(100) .execute().actionGet(); SearchHits hits = response.getHits(); for (int i = 0; i < hits.getHits().length; i++) { System.out.println(hits.getHits()[i].getSourceAsString()); } |
解决方案三:在向Mongodb内存入数据的时候,不再存结构化时间,而是存时间戳,这样其实Mongdb也是可以将一个长整形理解是一个字符串类型的数据。
通过下面的代码存入数据:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | // 实例化Mongo对象,连接27017端口 @SuppressWarnings("deprecation")Mongo mongo = new Mongo("192.168.100.103", 10111); // 连接名为xiaodb的数据库,假如数据库不存在的话,mongodb会自动建立 DB db = mongo.getDB("mydb"); DBCollection dbColl = db.getCollection("users"); for(int i = 5; i < 10;i++){ DBObject data4 = new BasicDBObject(); data4.put("_id",i); data4.put("cust_Id",i+""); data4.put("is_Show",i); DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = null; date = format.parse(format.format(new Date())); Calendar cla = Calendar.getInstance(); cla.setTime(date); cla.add(Calendar.HOUR_OF_DAY,8); data4.put("start_time",cla.getTime().getTime()); System.out.println(cla.getTime().toString()); dbColl.insert(data4); Thread.sleep(1000);} |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
QueryBuilder rangeLongqb = QueryBuilders.rangeQuery("start_time").from("1438770482000").to("1438770486000").includeLower(true).includeUpper(false); SearchResponse response = client.prepareSearch("myindex") .setTypes("users") .setSearchType(SearchType.DEFAULT) .setQuery(filterQueryBuilder) .setFrom(0).setSize(100) .execute().actionGet(); SearchHits hits = response.getHits(); for (int i = 0; i < hits.getHits().length; i++) { System.out.println(hits.getHits()[i].getSourceAsString()); } |
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。