ElasticSearch Java API方法简单使用实例

1、获取ElasticSearch client对象

public Client getEsClient(){
    Client client = null;
    try{
        Settings settings = ImmutableSettings.settingsBuilder()
            .put("client.transport.sniff", true) //自动嗅探整个ES集群节点
            .put("client", true)
            .put("data",false)
            .put("cluster.name","elasticsearch") //设置集群名字
            .put("number_of_shards", 2) //2个主分片
            .put("index.refresh_interval", "5s") //每5秒提交一次数据,类似oracle中的commit
            .build();
        client = new TransportClient(settings).addTransportAddress(new InetSocketTransportAddress("hostName", 9200));
    }catch(Exception ex){
        ex.printStackTrace();
    }
    return client;
}

2、查询List方法

List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>();
Client client = null;
try{
    //获取Elasticsearch client对象
    client = getEsClient();
    //设置查询条件(类似sql中 eventid = eventid )
    QueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.termQuery("eventid", eventid));
    // 设置ES中 indexName 和 indexType,以及QueryBuilders 对象
    SearchRequestBuilder requestBuilder = client.prepareSearch(EventBean.indexName)
        .setTypes(EventBean.indexType)
        .setQuery(qb);
    //执行查询 (可以设置排序、分页)
    SearchResponse actionGet = requestBuilder.addSort(SortBuilders.fieldSort("occurtime").order(SortOrder.DESC))
        .setFrom((pageNum-1) * pageSize)
        .setSize(pageNum * pageSize)
        .execute().actionGet();
    //遍历查询结果
    if(actionGet != null){
        SearchHits hits = actionGet.getHits();
        if(hits != null && hits.getHits() != null){
            Map<String, Object> hitMap = null;
            for (SearchHit hit : hits.getHits()){
                hitMap = hit.getSource();
                if(hitMap == null || hitMap.size() <= 0){
                    continue;
                }
                dataList.add(hitMap );
            }
        }
    }
}catch(Exception ex){
    ex.printStackTrace();
}finally{
    //关闭client
}
return dataList ;

3、查询总数方法

int rowTotal = 0;
Client client = null;
try{
    //获取Elasticsearch client对象
    client = getEsClient();
    //设置查询条件 (类似sql中 title like '%searchtext%')
    QueryBuilder qb = QueryBuilders.boolQuery().must(QueryBuilders.wildcardQuery("title", "*"+searchtext+"*"));
    // 设置ES中 indexName 和 indexType,以及QueryBuilders 对象
    CountRequestBuilder requestBuilder = client.prepareCount(EventBean.indexName)
        .setTypes(EventBean.indexType)
        .setQuery(qb);
    // 查询动作
    rowTotal = ConverUtils.Obj2int( requestBuilder.execute()
        .actionGet().getCount(), 0);
}catch(Exception ex){
    ex.printStackTrace();
}finally{
    //关闭client
}
return rowTotal;

4、添加方法

boolean optFlag = false;
Client client = null;
try{
    //获取Elasticsearch client对象
    client = getEsClient();
    //构造请求对象
    BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
    IndexRequestBuilder indexRequestBuilder = null;
    //根据请求对象bodyList, 组织bulkRequestBuilder对象
    String indexId = "";
    Map<String, Object> bodyMap = null;
    for (int count = 0; count < bodyList.size(); count++) {
        bodyMap = bodyList.get(count);
        if (bodyMap == null) {
            break;
        }
        //组织索引对象id
        indexId = ConverUtils.Obj2Str(bodyMap.get("id"), "");
        indexRequestBuilder = client.prepareIndex(indexName, indexType).setId(indexId).setSource(bodyMap);
        bulkRequestBuilder.add(indexRequestBuilder);
    }
    //批量更新执行
    BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();
    if (bulkResponse.hasFailures()) {
        optFlag = false;
    } else {
        optFlag = true;
    }
}catch(Exception ex){
    ex.printStackTrace();
}finally{
    //关闭client
}
return optFlag ;

5、更新方法

boolean optFlag = false;
Client client = null;
try{
    //获取Elasticsearch client对象
    client = getEsClient();
    //构造请求对象
    BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
    UpdateRequestBuilder updateRequestBuilder = null;
    //根据请求对象cvdMap,组织索引对象
    String indexId = getEsIndexId(client, ConverUtils.Obj2long(cvdMap.get("id"), 0L)); 
    //获取索引(getEsIndexId)
    updateRequestBuilder = client.prepareUpdate(indexName, indexType, indexId).setDoc(cvdMap);
    bulkRequestBuilder.add(updateRequestBuilder);
    //批量更新执行
    BulkResponse bulkResponse = bulkRequestBuilder.setRefresh(true).execute().actionGet();
    if (bulkResponse.hasFailures()) {
        optFlag = false;
    } else {
    optFlag = true;
    }
}catch(Exception ex){
    ex.printStackTrace();
}finally{
    //关闭client
}
return optFlag ;

6、删除方法

boolean optFlag = false;
Client client = null;
try{
    //获取Elasticsearch client对象
    client = getEsClient();
    //根据id_array数组, 组织索引对象
    BulkRequestBuilder bulkRequestBuilder = client.prepareBulk();
    DeleteRequestBuilder deleteRequestBuilder = null;
    for(int i=0; i<id_array.length; i++){
        if(id_array[i] == null || id_array[i].trim().equals("")){
            continue;
        }
        //根据indexName, indexType, indexId进行删除(这里nfa_dictionary索引中ID字段值和ES自有_id值相同, 可以操作)
        deleteRequestBuilder = client.prepareDelete(indexName, indexType, id_array[i]);
        bulkRequestBuilder.add(deleteRequestBuilder.request());
    }
    //进行批量删除操作
    BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();
    if (bulkResponse.hasFailures()) {
        optFlag = false;
    }else {
        optFlag = true;
    }
}catch(Exception ex){
    ex.printStackTrace();
}finally{
    //关闭client
}
return optFlag ;
其它:
 public static void main(String[] args) throws Exception{
        searchmethod6();
    }

    /**
     * 方法一
     * @throws Exception
     */
    public static void searchmethod1() throws Exception{
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));

        SearchResponse response = client.prepareSearch("movies").setTypes("movie").get();
        println(response);
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }

    /**
     * 方法二
     * @throws Exception
     */
    public static void searchmethod2() throws Exception{
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));

        QueryBuilder qb1 = termQuery("user","10");
//      QueryBuilder qb2 = QueryBuilders.multiMatchQuery("git", "title", "content");
        SearchResponse response = client.prepareSearch("movies").setQuery(qb1).get();
        for (SearchHit  searchHit: response.getHits()) {
            println(searchHit);
        }
    }

    /**
     * 方法三
     * @throws Exception
     * 这个相当于之前的分页,使用的是Scroll方法
     */
    public static void searchmethod3() throws Exception{
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));
        QueryBuilder qb = termQuery("user", "kimchy");

        SearchResponse scrollResp = client.prepareSearch("movies")
                .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC)
                .setScroll(new TimeValue(60000))
                .setQuery(qb)
                .setSize(1).get(); 
        do {
            for (SearchHit hit : scrollResp.getHits().getHits()) {
                println(hit);
            }


            scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
        } while(scrollResp.getHits().getHits().length != 0); 
    }


    /**
     * 方法四
     * @throws Exception
     */
    public static void searchmethod4() throws Exception{
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));

        SearchRequestBuilder srb1 = client.prepareSearch().setQuery(QueryBuilders.queryStringQuery("kimchy"));
        SearchRequestBuilder srb2 = client.prepareSearch().setQuery(QueryBuilders.matchQuery("user", "kimchy"));

        MultiSearchResponse sr = client.prepareMultiSearch().add(srb1).add(srb2).get();

        for (MultiSearchResponse.Item item : sr.getResponses()) {
            SearchResponse response = item.getResponse();
            for (SearchHit searchHit : response.getHits()) {
                println(searchHit);
            }
        }
    }

    /**
     * 方法五
     * 这个方法先欠着,不是很懂
     * @throws Exception
     */
    public static void searchmethod5() throws Exception{
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));

        SearchResponse sr = client.prepareSearch()
                .setQuery(QueryBuilders.matchAllQuery())
                .addAggregation(
                        AggregationBuilders.terms("agg1").field("field")
                )
                .addAggregation(
                        AggregationBuilders.dateHistogram("agg2")
                                .field("birth")
                                .dateHistogramInterval(DateHistogramInterval.YEAR)
                )
                .get();

            // Get your facet results
            Terms agg1 = sr.getAggregations().get("agg1");
//          DateHistogram agg2 = sr.getAggregations().get("agg2");
    }



    /**
     * 方法六
     * 能运行,但是就是不知道为什么查询不到结果,同时感觉这种方法很鸡肋,感觉写起来很麻烦,顺便说一下这个东西好像也可以在script下配置,我测试失败,但是感觉没什么用,就不深究了。
     * https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-template.html
     * @throws Exception
     */
    public static void searchmethod6() throws Exception{
        TransportClient client = new PreBuiltTransportClient(Settings.EMPTY)
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("106.14.112.215"), 9300));

        Map<String, Object> json = new HashMap<>();
        json.put("param_gender", "1962");

        SearchResponse response  = new SearchTemplateRequestBuilder(client)
                .setScript("{\n" +                                  
                        "        \"query\" : {\n" +
                        "            \"match\" : {\n" +
                        "                \"year\" : \"{{param_gender}}\"\n" +
                        "            }\n" +
                        "        }\n" +
                        "}")

                .setScriptType(ScriptType.INLINE)    
                .setScriptParams(json)                  
                .setRequest(new SearchRequest())                   
                .get()                                             
                .getResponse();   
        println(response);
        System.out.println(response.getHits().getTotalHits());
        for (SearchHit searchHit : response.getHits()) {
            println(searchHit);
        }

    }




    /**
     * 输出结果SearchResponse
     * @param response
     */
    public static void println(SearchResponse response){
        System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
        System.err.println(
                "getFailedShards : " + response.getFailedShards() + "\n" +
                "getNumReducePhases : " + response.getNumReducePhases() + "\n" +
                "getScrollId : " + response.getScrollId() +  "\n" +
                "getTookInMillis : " + response.getTookInMillis() + "\n" + 
                "getTotalShards : " + response.getTotalShards() +  "\n" +
                "getAggregations : " + response.getAggregations() + "\n" + 
                "getProfileResults : " + response.getProfileResults() + "\n" + 
                "getShardFailures : " + response.getShardFailures() + "\n" + 
                "getSuggest : " + response.getSuggest() + "\n" + 
                "getTook : " + response.getTook() + "\n" + 
                "isTerminatedEarly : " + response.isTerminatedEarly() + "\n" + 
                "isTimedOut : " + response.isTimedOut() + "\n" + 
                "remoteAddress : " + response.remoteAddress() + "\n" + 
                "status : " + response.status() + "\n" + 
                "getHits : " + response.getHits() 
                );
    }

    /**
     * 输出结果SearchResponse
     * @param response
     */
    public static void println(SearchHit searchHit){
        System.err.println("*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-");
        System.err.println( 
                "docId : " + searchHit.docId() + "\n" +
                "getId : " + searchHit.getId() + "\n" +
                "getIndex : " + searchHit.getIndex()+ "\n" +
                "getScore : " + searchHit.getScore() + "\n" +
                "getSourceAsString : " + searchHit.getSourceAsString() + "\n" +
                "getType : " + searchHit.getType() + "\n" +
                "getVersion : " + searchHit.getVersion() + "\n" +
                "fieldsOrNull : " + searchHit.fieldsOrNull() + "\n" +
                "getExplanation : " + searchHit.getExplanation() + "\n" +
                "getFields : " + searchHit.getFields() + "\n" +
                "highlightFields : " + searchHit.highlightFields() + "\n" +
                "hasSource : " + searchHit.hasSource()
                );
    }


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值