Elasticsearch7.X中新API使用

Elasticsearch 升級之后,發(fā)現(xiàn)有很多以前用的API過期了。如elasticRepository中的search方法,ElasticsearchTemplate 等,因此記錄一下使用高版本API 操作,并組裝了一個簡單的工具類供后續(xù)使用。
首先是配置文件

    @Bean
    public RestHighLevelClient restHighLevelClient(){
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")
                        // 如果是集群,可以構建多個
                        /*,new HttpHost("localhost", 9201, "http")*/
                )
        );

        return restHighLevelClient;
    }

1、CRUD

我定義了一個CRUD的接口

public interface HignLevelDocumentHandler<T, ID> {
    public void save(T t) throws Exception;
    public String detail(ID id) throws IOException;
    public void update(T t) throws Exception;
    public void delete(ID id) throws IOException;
}

其次,實現(xiàn)一個默認的可操作的工具類,在使用前需要將工具類注入Bean,并復制索引名稱indexName

/**
 * author: ZGF
 * context : 默認實現(xiàn)
 */

public class DefaultHignLevelDocumentHandler<T, ID> implements HignLevelDocumentHandler<T, ID> {

    @Autowired
    @Qualifier("restHighLevelClient")
    private RestHighLevelClient client;

    @Getter
    @Setter
    private String indexName;

    public DefaultHignLevelDocumentHandler(String indexName){
        this.indexName = indexName;
    }

    @Override
    public void save(T t) throws Exception {
        if (judgeId(t)) {
            Field id = t.getClass().getDeclaredField("id");
            save(t, id.toString());
            return;
        }
        save(t, null);
    }

    public void save(T t, String id) throws IOException {
        jsonSave(t, id, TimeValue.timeValueSeconds(1));
    }

    public void jsonSave(T t, String id, TimeValue timeValue) throws IOException {
        IndexRequest indexRequest = new IndexRequest(indexName);
        indexRequest.id(id);
        indexRequest.timeout(timeValue);
        indexRequest.source(JSON.toJSONString(t), XContentType.JSON);
        client.index(indexRequest, RequestOptions.DEFAULT);
    }

    @Override
    public String detail(ID id) throws IOException {
        GetRequest request = new GetRequest(indexName, id.toString());
        GetResponse getResponse = client.get(request, RequestOptions.DEFAULT);
        return getResponse.getSourceAsString();
    }

    @Override
    public void update(T t) throws Exception {
        if (judgeId(t)) {
            Field id = t.getClass().getDeclaredField("id");
            save(t, id.toString());
        } else {
            update(t, null);
        }
    }

    public void update(T t, String id) throws Exception {
        update(t, id, TimeValue.timeValueSeconds(1));
    }

    public void update(T t, String id, TimeValue timeValue) throws Exception {
        UpdateRequest updateRequest = new UpdateRequest(indexName, id);
        updateRequest.timeout(timeValue);
        updateRequest.doc(JSON.toJSONString(t), XContentType.JSON);
        client.update(updateRequest, RequestOptions.DEFAULT);
    }

    @Override
    public void delete(ID id) throws IOException {
        delete(id, TimeValue.timeValueSeconds(1));
    }

    public void delete(ID id, String timeout) throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest(indexName);
        deleteRequest.timeout(timeout);
        deleteRequest.id(id.toString());
        client.delete(deleteRequest, RequestOptions.DEFAULT);
    }

    public void delete(ID id, TimeValue timeValue) throws IOException {
        DeleteRequest deleteRequest = new DeleteRequest(indexName);
        deleteRequest.timeout(timeValue);
        deleteRequest.id(id.toString());
        client.delete(deleteRequest, RequestOptions.DEFAULT);
    }

    private boolean judgeId(T t){
        //獲取這個類的所有屬性
        Field[] fields = t.getClass().getDeclaredFields();
        boolean flag = false;
        //循環(huán)遍歷所有的fields
        for (int i = 0; i < fields.length; i++) {
            if (fields[i].getName().equals("id")) {
                flag = true;
                break;
            }
        }
        return flag;
    }
}

2、批量操作

注意將增刪改的Request接口通過add方法進BulkRequest對象,就可以進行批量操作了

    @PostMapping("bulk")
    public String bulk() throws IOException {
        BulkRequest bulkRequest = new BulkRequest();
        bulkRequest.timeout(TimeValue.timeValueSeconds(10));
        ArrayList<Item> items = new ArrayList<>();
        items.add(new Item(6L, "狂神說Java", "B站", "愛奇藝", 23D, "b.jpg"));
        items.add(new Item(7L, "馬保國解說日本萌妹子擂臺賽", "Bilibili", "騰訊", 44D, "e.jpg"));
        items.add(new Item(8L, "進擊的巨人", "Bilibili", "騰訊", 55D, "g.jpg"));

        for (int i = 0; i < items.size(); i++) {
            bulkRequest.add(new IndexRequest("naga")
                    // 不指定ID的話,新增時ID是隨機的
                    .id(items.get(i).getId().toString())
                    .source(JSON.toJSONString(items.get(i)), XContentType.JSON)
            );
            // bulkRequest.add(UpdateRequest)   批量更新
            // bulkRequest.add(DeleteRequest)   批量刪除
        }

        // BulkResponse bulkResponse = client.bulk(bulkRequest, RequestOptions.DEFAULT);
        return "bulk insert OK";
    }

3、復雜查詢操作

僅僅列舉兩個最簡單的例子,在新版本的API中,查詢的組裝就像是用代碼,來拼接出在kibana上輸入的JSON參數(shù)一樣。

    /**
     * 分頁,條件查詢
     * @param brandName
     * @return
     */
    @PostMapping("/get")
    public String get(String brandName, int from, int size) throws IOException {
        // 條件構造器
        SearchSourceBuilder builder = new SearchSourceBuilder();
        // 查詢構建器 QueryBuilders工具類可以快速構建
        MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("brand", brandName);
        builder.query(matchQueryBuilder);
        builder.timeout(TimeValue.timeValueSeconds(10));
        /** 分頁查詢 */
        builder.from(from);
        builder.size(size);

        SearchRequest searchRequest = new SearchRequest("naga");
        searchRequest.source(builder);

        SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
        for (SearchHit temp : result.getHits().getHits()) {
            System.out.println(temp.getSourceAsMap());
        }
        return "query OK";
    }

    /**
     * 查詢價格在20以上的
     */
    @PostMapping("/range")
    public String query() throws IOException {
        SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
        BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery()
                .filter(new RangeQueryBuilder("price").gte(20.0D));
        sourceBuilder.query(queryBuilder);

        SearchRequest searchRequest = new SearchRequest();
        searchRequest.source(sourceBuilder);

        SearchResponse result = client.search(searchRequest, RequestOptions.DEFAULT);
        for (SearchHit temp : result.getHits().getHits()) {
            System.out.println(temp.getSourceAsMap());
        }
        return "query OK";
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容