java操作elasticsearch實現分頁、去重查詢、統計去重后的實際數量


公司要重構一個項目,有部分數據是用阿里的雲elasticsearch作為數據存儲,大概兩千萬,這邊Java主要是做查詢,由於阿里雲文檔不全,記錄下一些比較困難的操作~由於項目緊急,以下僅為個人理解,勿噴。

1.Java連接elasticsearch

引入elasticsearch依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
        </dependency>

創建elasticsearch連接

        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials("es客戶端用戶名", "es客戶端密碼"));

        restClient = RestClient.builder(new HttpHost("es地址", 9200, "http"))
                .setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                    @Override
                    public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                        return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                    }
                }).build();

設置請求方式,查詢就用get或者post

        String method = "POST";

設置要查詢的庫、表的名稱

        String endpoint = "/date/date/_search";

至此,基礎設置已經完成。

2.多個字段的模糊查詢

這里就類似於MySQL中的 select * from user where name like '%張三%' and tel like '%155%';

{
    "query":{
        "bool":{
            "must":[
                {
                    "match_phrase":{
                        "name":"張三"
                    }
                },
                {
                    "match_phrase":{
                        "tel":"188"
                    }
                }
            ],
            "minimum_should_match":1
        }
    }
    }

must: must的兩個條件都必須滿足,類似於mysql中的and,如果想用or的話,可以替換成should

match_phrase:不分詞,不分詞,不分詞,也就是說符合條件的字段內容中必須包含你要搜索的信息,等同於模糊查詢。

3.去重查詢

{
    "query":{
        "collapse":{
            "field":"tel"
        },
        "bool":{
            "must":[
                {
                    "match_phrase":{
                        "name":"小明"
                    }
                },
                {
                    "match_phrase":{
                        "tel":"188"
                    }
                }
            ],
            "minimum_should_match":1
        }
    }
}
field:tel 以tel為條件把重復的數據進行折疊,來達到去重的效果,可是到這里還有問題,查詢出來的條數還是折疊之前的條數,下面我們要統計一下,折疊之后的條數。
{
    "query":{
        "collapse":{
            "field":"tel"
        },
        "bool":{
            "must":[
                {
                    "match_phrase":{
                        "name":"天津"
                    }
                },
                {
                    "match_phrase":{
                        "tel":"188"
                    }
                }
            ],
            "minimum_should_match":1
        }
    },
    "aggs":{
        "count":{
            "cardinality":{
                "field":"tel"
            }
        }
    },
    "size":10,
    "from":0
}

使用aggs count 來統計折疊之后的條數,解析JSON時就可以獲取到了

解析時使用fastjson進行解析~

4.發送請求(查詢)

        Response response = restClient.performRequest(method, endpoint, Collections.<String, String>emptyMap(), entity);

我使用的springboot內置的restclient發送的http請求

5.接收請求並進行解析

//響應的數據        
String str = EntityUtils.toString(response.getEntity());
//獲得總條數
Object countObject = JSON.parseObject(str).get("aggregations");
Object total = JSON.parseObject(countObject.toString()).get("count");
        total = JSON.parseObject(total.toString()).get("value");
//獲得響應的數據
Object json_test = JSON.parseObject(str).get("hits");
Object o = JSON.parseObject(json_test.toString()).get("hits");
List<restEntity> list = JSON.parseArray(o.toString(), restEntity.class);

 

  

 


免責聲明!

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



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