1、條件match query查詢
//條件查詢match query @Test public void test10() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名稱 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //2.創建訪問ES服務器的客戶端 TransportClient client = new PreBuiltTransportClient(settings) //獲取es主機中節點的ip地址及端口號(以下是單個節點案例) .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.94"), 9300)); QueryBuilder builder = QueryBuilders.matchQuery("interests", "changge"); SearchResponse response = client.prepareSearch("lib3").setQuery(builder).get(); SearchHits hits = response.getHits(); for(SearchHit hit:hits) { System.out.println(hit.getSourceAsString()); //將獲取的值轉換成map的形式 Map<String, Object> map = hit.getSourceAsMap(); for(String key:map.keySet()) { System.out.println(key +" key對應的值為:" +map.get(key)); } } }
2、multimatch query查詢
說明:查詢的值在多個字段中進行匹配查詢
//multiMatchQuery 查詢的值在多個字段中進行匹配 @Test public void test11() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名稱 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //2.創建訪問ES服務器的客戶端 TransportClient client = new PreBuiltTransportClient(settings) //獲取es主機中節點的ip地址及端口號(以下是單個節點案例) .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.94"), 9300)); //第一個參數是查詢的值,后面的參數是字段名,可以跟多個字段,用逗號隔開 QueryBuilder builder = QueryBuilders.multiMatchQuery("changge", "address","interests"); SearchResponse response = client.prepareSearch("lib3").setQuery(builder).get(); SearchHits hits = response.getHits(); for(SearchHit hit:hits) { System.out.println(hit.getSourceAsString()); //將獲取的值轉換成map的形式 Map<String, Object> map = hit.getSourceAsMap(); for(String key:map.keySet()) { System.out.println(key +" key對應的值為:" +map.get(key)); } } }
3、term查詢
說明:term查詢是不支持分詞查詢的
//term查詢 @Test public void test12() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名稱 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //2.創建訪問ES服務器的客戶端 TransportClient client = new PreBuiltTransportClient(settings) //獲取es主機中節點的ip地址及端口號(以下是單個節點案例) .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.94"), 9300)); //term查詢是不進行分詞的 QueryBuilder builder = QueryBuilders.termQuery("interests", "changge"); SearchResponse response = client.prepareSearch("lib3").setQuery(builder).get(); SearchHits hits = response.getHits(); for(SearchHit hit:hits) { System.out.println(hit.getSourceAsString()); //將獲取的值轉換成map的形式 Map<String, Object> map = hit.getSourceAsMap(); for(String key:map.keySet()) { System.out.println(key +" key對應的值為:" +map.get(key)); } } }
term中文精確查詢注意點:
當使用term查詢中文時,比如查詢"人類",我們是查不出來的,因為字段設置了ik分詞器,他會將“人類”分成“人”和“類”,所有針對這種情況,我們需要將該字段類型臨時轉成keword類型,轉換成后當字段中有"人類很好"的文章,我們也查詢不出來,只會查詢出字段為人類的文章。如下:
//term中文查詢 @Test public void test12() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名稱 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //2.創建訪問ES服務器的客戶端 TransportClient client = new PreBuiltTransportClient(settings) //獲取es主機中節點的ip地址及端口號(以下是單個節點案例) .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.94"), 9300)); //term查詢是不進行分詞的 QueryBuilder builder = QueryBuilders.termQuery("interests.keword", "人類"); SearchResponse response = client.prepareSearch("lib3").setQuery(builder).get(); SearchHits hits = response.getHits(); for(SearchHit hit:hits) { System.out.println(hit.getSourceAsString()); //將獲取的值轉換成map的形式 Map<String, Object> map = hit.getSourceAsMap(); for(String key:map.keySet()) { System.out.println(key +" key對應的值為:" +map.get(key)); } } }
4、terms查詢
說明:與term的區別在於terms可以同時匹配多個條件
//terms查詢:與term區別在於可以在同個字段中同時匹配多個條件,但是不支持分詞 public void test13() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名稱 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //2.創建訪問ES服務器的客戶端 TransportClient client = new PreBuiltTransportClient(settings) //獲取es主機中節點的ip地址及端口號(以下是單個節點案例) .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.94"), 9300)); //terms查詢是不進行分詞的 與term的區別在terms可以指定一個字段匹配多個查詢內容 QueryBuilder builder = QueryBuilders.termsQuery("interests", "changge","旅游"); SearchResponse response = client.prepareSearch("lib3").setQuery(builder).get(); SearchHits hits = response.getHits(); for(SearchHit hit:hits) { System.out.println(hit.getSourceAsString()); //將獲取的值轉換成map的形式 Map<String, Object> map = hit.getSourceAsMap(); for(String key:map.keySet()) { System.out.println(key +" key對應的值為:" +map.get(key)); } } }
5、reange 范圍查詢
//reange 范圍查詢(日期在多少之間等) @Test public void test14() throws UnknownHostException { //1、指定es集群 cluster.name 是固定的key值,my-application是ES集群的名稱 Settings settings = Settings.builder().put("cluster.name", "my-application").build(); //2.創建訪問ES服務器的客戶端 TransportClient client = new PreBuiltTransportClient(settings) //獲取es主機中節點的ip地址及端口號(以下是單個節點案例) .addTransportAddress(new TransportAddress(InetAddress.getByName("192.168.1.94"), 9300)); //rangeQurey 第一個參數為字段名,后面是范圍 在設置日期格式 QueryBuilder builder = QueryBuilders.rangeQuery("birthday").from("1990-01-01").to("2000-10-10").format("yyyy-MM-dd"); SearchResponse response = client.prepareSearch("lib3").setQuery(builder).get(); SearchHits hits = response.getHits(); for(SearchHit hit:hits) { System.out.println(hit.getSourceAsString()); //將獲取的值轉換成map的形式 Map<String, Object> map = hit.getSourceAsMap(); for(String key:map.keySet()) { System.out.println(key +" key對應的值為:" +map.get(key)); } } }
下一篇博客本人將書寫java操作elasticsearch實現前綴查詢、wildcard模糊查詢、fuzzy模糊查詢、ids查詢。對后期博客感興趣的朋友可以關注交流,轉發請說明出處,本人的博客地址為:https://www.cnblogs.com/chenyuanbo/
技術在於交流!