ElasticSearch程式設計例項—時間範圍查詢
阿新 • • 發佈:2019-02-07
一般情況下,把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索引庫中的原始資料:
查詢結果: