ES中TransportClient 5.6版本之前JAVA-API使用方法

1、配置

    /**
     * 連接池
     */
    private static String POOL_SIZE = "5";
    TransportClient client;
    //es 客戶端名稱 例如my-application
    private static final String ES_CLUSTER_NAME = "es.cluster.name";
    //服務(wù)地址 
    private static final String ES_HOST_NAME = "es.host.name";

    //端口號(hào) 例如 默認(rèn)是 9300
    private static final String ES_PORT = "es.port";
    //es搜索歷史索引名稱
    private static final String SEARCH_HISTORY = "myFirstIndex";

2、初始化

  public void init()   {
        // 配置信息
                Settings esSetting = Settings.builder()
                        .put("cluster.name", AppContext.current().getConfig().getProperty(ES_CLUSTER_NAME))
                        .put("thread_pool.search.size", Integer.parseInt(POOL_SIZE))//增加線程池個(gè)數(shù),暫時(shí)設(shè)為5
                        .build();
                //配置信息Settings自定義
                client = new PreBuiltTransportClient(esSetting);
        TransportAddress transportAddress = null;

        try {
            transportAddress = new TransportAddress
                    (InetAddress.getByName(AppContext.current().getConfig().getProperty(ES_HOST_NAME))
                            , Integer.valueOf(AppContext.current().getConfig().getProperty(ES_PORT)));
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        client.addTransportAddresses(transportAddress);

    }

3、使用方法 - 增刪改查(封裝好的)

新增 prepareIndex
/**
*根據(jù)id,新增實(shí)體數(shù)據(jù),如果id存在會(huì)默認(rèn)更新實(shí)體數(shù)據(jù)。參數(shù) jsonObject 是json格式
**/
public  IndexResponse getDocHistoryIndex(JSONObject jsonObject, String id) {
        IndexResponse    response = getClient().prepareIndex(SEARCH_HISTORY, "_doc", id)
                    .setSource(jsonObject.toString(), XContentType.JSON).get();
        return response;
    }
更新 prepareUpdate
/**
     *根據(jù)id,和實(shí)體數(shù)據(jù)更新
     * @param jsonObject
     * @param id
     * @return
     */
    public  UpdateResponse updateDocHistoryIndex(JSONObject jsonObject, String id) {

         UpdateResponse   updateResponse = getClient().prepareUpdate(SEARCH_HISTORY, "_doc", id)
                    .setDoc(jsonObject.toString(), XContentType.JSON).execute().actionGet();
        return updateResponse;
    }
查詢 獲取 SearchRequestBuilder對(duì)象
/**
*獲取 SearchRequestBuilder對(duì)象
**/
public  SearchRequestBuilder prepareHistorySearch() {
         SearchRequestBuilder   searchRequestBuilder = getClient().prepareSearch(SEARCH_HISTORY).
                    setSearchType(SearchType.DFS_QUERY_THEN_FETCH);

        return searchRequestBuilder;
    }
刪除 prepareDelete
/**
*根據(jù)id刪除
**/
public  DeleteResponse prepareHistoryDelete(String documentId) {
         DeleteResponse   deleteResponse = getClient().prepareDelete(SEARCH_HISTORY, "_doc", documentId).get();

        return deleteResponse;
    }
根據(jù)id查詢 prepareGet
public  GetResponse getHistoryById(String id) {
        GetRequestBuilder    getRequestBuilder = getClient().prepareGet(SEARCH_HISTORY, "_doc", id);
        GetResponse response = getRequestBuilder.get();
        return response;
    }

批量更新某個(gè)字段 UpdateByQueryRequestBuilder(查詢并更新)
/**
     *先查詢結(jié)果集--然后 批量更新某個(gè)字段
     */
    public  UpdateByQueryRequestBuilder updateByQueryRequestBuilder() {
        UpdateByQueryRequestBuilder updateByQuery = new UpdateByQueryRequestBuilder(client, UpdateByQueryAction.INSTANCE)
                .source(SEARCH_HISTORY);
        return updateByQuery;

    }

//例子:
/**
     * 批量更新某個(gè)字段值 業(yè)務(wù)是:根據(jù)條件查出結(jié)果然后.script腳本對(duì)要更新的字段操作,如把結(jié)果集字段isDelete 狀態(tài)改成1 批量邏輯刪除操作。
     */
    public Result clearAllHistory() {
        Result result = new Result();
        try {
            UpdateByQueryRequestBuilder updateByQuery = clientUtil.updateByQueryRequestBuilder()
                    //查詢要修改的結(jié)果集
                    .filter(QueryBuilders.termQuery("isDelete", 0))
                    //修改操作
                    .script(new Script("ctx._source['isDelete'] = '1'"));
            //響應(yīng)結(jié)果集
            BulkByScrollResponse response = updateByQuery.get();
            long updated = response.getUpdated();
            result.setMessage("刪除" + updated + "個(gè)");
        } catch (Exception e) {
            e.printStackTrace();
            result.setSuccess(false);
            result.setMessage(TipMessage.DELETE_FAIL);

        }
        return result;

    }

高亮字段處理 HighlightField
/**
     * 高亮結(jié)果集 特殊處理
     *
     * @param esDocForm 查出來的對(duì)象 
     * @SearchHit 
     * @param highlightField 要高亮的字段
     *@content 要處理的字段內(nèi)容
例如:查出來一篇文檔,我只要匹配到的關(guān)鍵字那一小段內(nèi)容,供前端顯示使用(百度文檔形式)
     */
    private void setSearchResponse(EsDocForm esDocForm, SearchHit next, String highlightField, String content) {

        StringBuffer stringBuffer = new StringBuffer();
        HighlightField highlightDocNameField = next.getHighlightFields().get(highlightField);
        Map<String, HighlightField> highlightFields = next.getHighlightFields();
        HighlightField highlightContent = highlightFields.get(content);
        //處理文檔內(nèi)容
        if (highlightContent != null) {
            Text[] contentText = highlightContent.getFragments();
            //出來文檔內(nèi)容里關(guān)鍵字提取
            if (contentText != null) {
                //只取一段
                esDocForm.setContent(contentText[0].string() + "...");
            }
        }
        if (highlightDocNameField != null) {
            Text[] docNameText = highlightDocNameField.getFragments();
            if (docNameText != null) {
                for (Text str : docNameText) {
                    stringBuffer.append(str.string());
                }
                esDocForm.setDocName(stringBuffer.toString());
            }
        }


    }
統(tǒng)計(jì)AggregationBuilder
 /**
     * 統(tǒng)計(jì)查詢 根據(jù)時(shí)間段 統(tǒng)計(jì)不同類型的總數(shù) 
     *例:要查詢出7天內(nèi),不同文件類型文件有多少,如pdf、doc類型有多少個(gè)
     */
//部分代碼
boolQueryBuilder 是你的查詢條件 searchFiled 是你的分類字段 
AggregationBuilder oneAgg
                = AggregationBuilders.terms(searchFiled).field(searchFiled);
        SearchRequestBuilder searchRequestBuilder = clientUtil.prepareDocSearch().setQuery(boolQueryBuilder).addAggregation(oneAgg);
        SearchResponse searchResponse = searchRequestBuilder.get();
關(guān)閉資源
 /**
     * 關(guān)閉
     */
    public  void close() {
        if (client != null) {
            client.close();
        }
    }

5.6版本之后可使用高級(jí)客戶端Java High Level REST Client初始化需要Java 1.8,并依賴于Elasticsearch核心項(xiàng)目,客戶端版本與客戶端開發(fā)的Elasticsearch版本相同,它接受與TransportClient相同的請(qǐng)求參數(shù),并返回相同的響應(yīng)對(duì)象

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容