欢迎投稿

今日深度:

Mongodb与Elasticsearch配合使用进一步研究(二),

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());

     上面代码的目的就是想本地时间加上8个小时,然后再存入Mongodb。

      然后用下面的代码向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());		    		}   	    	    

www.htsjk.Com true http://www.htsjk.com/Elasticsearch/32953.html NewsArticle Mongodb与Elasticsearch配合使用进一步研究(二),           有一个问题:Mongodb与Elasticsearch通过River连接起来之后,想通过Elasticsearch查询存储在Mongodb上面的一段时间内的数据。      ...
相关文章
    暂无相关文章
评论暂时关闭