1. 程式人生 > >Elasticsearch批量索引和刪除

Elasticsearch批量索引和刪除

批量索引和刪除
 
Java程式碼  收藏程式碼
BulkRequestBuilder bulkRequest = client.prepareBulk();  
        for(int i=500;i<1000;i++){  
            //業務物件  
            String json = ESUtils.toJson(new LogModel());  
            IndexRequestBuilder indexRequest = client.prepareIndex("twitter", "tweet")  
            //指定不重複的ID        
            .setSource(json).setId(String.valueOf(i));  
            //新增到builder中  
            bulkRequest.add(indexRequest);  
        }  
          
        BulkResponse bulkResponse = bulkRequest.execute().actionGet();  
        if (bulkResponse.hasFailures()) {  
            // process failures by iterating through each bulk response item  
            System.out.println(bulkResponse.buildFailureMessage());  
        }  
 上面只是批量索引的方法,將client.prepareIndex改為client.prepareDelete就是批量刪除操作。ES對批量操作作了優化,所以大家使用時,儘量將操作集中起來呼叫批量介面,速度會更快一些。
 
 
搜尋(Search)


這裡說的搜尋僅僅是簡單相等條件搜尋,並沒有涉及真正意義上的搜尋。比如,我們要搜尋前1000條記錄,程式碼如下:
 
Java程式碼  收藏程式碼
SearchResponse response = client.prepareSearch("twitter")  
//這個在prepareSearch中指定還不行,必須使用setTypes  
                .setTypes("tweet")  
                //設定查詢條件,  
                .setFilter(FilterBuilders.matchAllFilter())  
                .setFrom(0).setSize(1000)  
                .execute()  
                .actionGet();  
        /**
         * SearchHits是SearchHit的複數形式,表示這個是一個列表
         */  
        SearchHits shs = response.getHits();  
        for(SearchHit hit : shs){  
            System.out.println("id:"+hit.getId()+":"+hit.getSourceAsString());  
        }  
        client.close();  
 搜尋有兩種方法,一種是使用Filter進行搜尋,一種是使用Query進行搜尋,例如,想只搜尋某個欄位為具體值的資料,也可以這樣寫。
 
 
Java程式碼  收藏程式碼
Client client = ESUtils.getClient();  
        /**
         * 建立查詢條件,QueryBuilders相當於Hibernate的Restrictions,
         * 而QueryBuilder則相當於一個Criteria,可以不停的增加本身物件
         */  
        BoolQueryBuilder query = QueryBuilders.boolQuery();  
                 //systemName為欄位名稱,oa未欄位值  
        query.must(QueryBuilders.termQuery("systemName", "oa"));  
        SearchResponse response = client.prepareSearch("twitter")  
//這個在prepareSearch中指定還不行,必須使用setTypes  
                .setTypes("tweet")  
                //設定查詢條件,  
                .setQuery(query)  
                .setFrom(0).setSize(60)  
                .execute()  
                .actionGet();  
        /**
         * SearchHits是SearchHit的複數形式,表示這個是一個列表
         */  
        SearchHits shs = response.getHits();  
        for(SearchHit hit : shs){  
            System.out.println(hit.getSourceAsString());  
        }  
        client.close();  
 
 
這些只是使用ES的傳統用法,就是想用ES取代傳統資料庫的用法。但其實ES的主要目的並非如此,相信你使用搜索引擎也不是想做這些簡單的查詢和插入。排名,分詞等更高階的用法,我也沒有完全搞清楚,還望大家多多指教。