1. 程式人生 > >ElasticSearch程式設計例項—時間範圍查詢

ElasticSearch程式設計例項—時間範圍查詢

          一般情況下,把java.util.Date儲存到中再取出來的時候,要想保證它是個Date ,需要做額外任何轉換。本文介紹如何在ElasticSearch中進行時間範圍查詢操作。

public class EsMulConditionQuery {

	private static String index = "test_index5";
	private static String type = "test_type5";

	public static void main(String[] args) throws IOException, ParseException {
		Settings settings = ImmutableSettings.settingsBuilder().put("cluster.name", "elasticsearch")
				.put("client.transport.sniff", true)// 開啟ES嗅探功能,確保叢集連上多個節點
				.build();
		// 建立客戶端
		TransportClient transportClient = new TransportClient(settings);
		// 新增es的節點資訊,可以新增1個或多個
		TransportAddress transportAddress = new InetSocketTransportAddress("218.193.126.32", 9300);
		transportClient.addTransportAddresses(transportAddress);

		// 連線到的節點
		ImmutableList<DiscoveryNode> connectedNodes = transportClient.connectedNodes();
		for (DiscoveryNode discoveryNode : connectedNodes) {
			System.out.println(discoveryNode.getHostAddress());
		}
                 /**進行Mapping設定,這一步設定了索引欄位的儲存格式,極其重要,否則後面的查詢會查出0條記錄*/
		 XContentBuilder mapping = XContentFactory.jsonBuilder()
				.startObject()
				   .startObject("properties")
				   	 .startObject("PolicyCode")
				   	 	.field("type", "string")
				   	 	.field("index","not_analyzed")
				   	 .endObject()
				   	 .startObject("ServiceId")
				   	    .field("type", "string")
				   	    .field("index", "not_analyzed")
				   	  .endObject()
		           .startObject("CreateTime")
		                .field("type", "date")
		                .field("format","yyyy-MM-dd HH:mm:ss")
		            .endObject()
		           .endObject()
		         .endObject();
		
		 CreateIndexRequestBuilder prepareCreate =transportClient.admin().indices().prepareCreate(index);
		 prepareCreate.setSettings(settings).addMapping(type, mapping).execute().actionGet();
		
		 /**向索引庫中插入資料*/
		 for (int i = 0; i < 10; i++) {
		 HashMap<String, Object> hashMap = new HashMap<String, Object>();
		 if (i % 2 == 0) {
		 hashMap.put("PolicyCode", "5674504720");
		 hashMap.put("ServiceId", "SE2");
		 hashMap.put("CreateTime", "2016-08-21 00:00:01");
		 } else {
		 hashMap.put("PolicyCode", "666666666");
		 hashMap.put("ServiceId", "SE3");
		 hashMap.put("CreateTime", "2016-10-21 00:00:01");
		 }
		 IndexResponse indexResponse = transportClient.prepareIndex(index,
		 type).setSource(hashMap).get();
		 }
		
		/** 
		 * rangeQuery時間範圍查詢
		 * 以下三種查詢方式的效果一樣
		 */
		 //多條件查詢
		SearchResponse searchResponse = transportClient.prepareSearch(index)
				.setTypes(type)
				.setQuery(QueryBuilders.boolQuery()
						  .must(QueryBuilders.matchPhraseQuery("PolicyCode", "5674504720"))
						  .must(QueryBuilders.rangeQuery("CreateTime").from("2016-8-21 00:00:01")
									.to("2017-7-21 00:00:03")))
				.get();
//		
//		 SearchResponse searchResponse = transportClient.prepareSearch(index)
//				 .setTypes(type)
//		         .setQuery(QueryBuilders.rangeQuery("CreateTime").from("2016-07-21 11:00:00").to("2017-07-21 11:00:00"))
//		         .get();
//		 
//		 SearchResponse searchResponse = transportClient.prepareSearch(index)
//				 .setTypes(type)
//		         .setQuery(QueryBuilders.rangeQuery("CreateTime").gt("2016-07-21 11:00:00").lt("2017-07-21 11:00:00"))
//		         .get();

		/**
		 * rangeFilter時間範圍查詢
		 * 以下兩種查詢方式的效果一樣
		 */
//		 SearchResponse searchResponse = transportClient.prepareSearch(index)
//				 .setTypes(type)
//		         .setPostFilter(FilterBuilders.rangeFilter("age").gt(2).lt(5)).get();
//		         .setPostFilter(FilterBuilders.rangeFilter("age").from(2).to(5)).get();
		
		
		// 獲取查詢結果
		SearchHits hits = searchResponse.getHits();
		long totalHits = hits.getTotalHits();
		System.out.println("總數目=" + totalHits);
		SearchHit[] hits2 = hits.getHits();
		for (SearchHit searchHit : hits2) {
			System.out.println(searchHit.getSourceAsString());
		}
    }

ES索引庫中的原始資料:


查詢結果: