java操作elasticsearch實現條件查詢(match、multiMatch、term、terms、reange)


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/

技術在於交流!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM