国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Elasticsearch 學習: Java API (一)

taohonghui / 2090人閱讀

摘要:最近在學習,這是一個分布式的大數據搜索引擎,其實也可以看作是一個分布式的數據庫。多查找可以一次返回多個要查找的值。第二個會在批量失敗后執行。在例子中,當請求超過個或者總大小超過時,觸發批量提交動作。

最近在學習 Elasticsearch,這是一個分布式的大數據搜索引擎,其實也可以看作是一個分布式的數據庫。我使用的 Elasticsearch 的版本是 2.4.1,鑒于網上相關的中文資料較少,所以自己看官方文檔學習一下。

使用 Maven 工程,我的 pom 文件如下所示:

    
        
            org.elasticsearch
            elasticsearch
            2.4.1
        
        
            org.apache.logging.log4j
            log4j-api
            2.6.2
        
        
            org.apache.logging.log4j
            log4j-core
            2.6.2
        
    
    
連接機器
TransportClient client = TransportClient.builder()
    .build()
    .addTransportAddress(new InetSocketTransportAddress(InetAddress
    .getByName("localhost"), 9300));       
    
Index API 創建 Index 并且插入 Document

創建索引有很多種方法,這里列舉常用的 2 種:

HashMap json = new HashMap();
json.put("first_name","Shuang");
json.put("last_name", "Peng");
json.put("age", 24);
json.put("about", "I love coding");
IndexResponse response = client
    .prepareIndex("tseg","students","1")
    .setSource(json).get();

IndexResponse response = client.prepareIndex("tseg","students","1")
   .setSource(jsonBuilder()
   .startObject()
   .field("first_name", "Shuang")
   .field("first_name", "Peng")
   .field("age", 24)
   .field("about", "I love coding")
   .endObject())
   .get();
 

注意:Index API 只能用于創建 index,類似于關系型數據庫里面的 create table,他不能對已有的數據庫進行添加。追加操作可以用后面會提到的 Update 或者 Bulk 來完成。

Get API 獲取 Document
GetResponse response2 = client.prepareGet("tseg", "students", "1").get();
Map res = response2.getSource();
for (Map.Entry entry: res.entrySet()){
     System.out.println(entry.getKey() + " : " + entry.getValue());
     }
Delete API 刪除 Index 或者 Document
// 用來刪除對應的 document 
DeleteResponse response3 = 
    client.prepareDelete("tesg","students","1").get();
// 用來刪除對應的 index
DeleteIndexResponse response4 = 
    client.admin().indices().prepareDelete("facebook").execute().actionGet();
Update API 更新操作

更新操作也有兩種方法。建議使用第一種,第二種太復雜了。。。看看就好。

第一種

client.prepareUpdate("tseg", "students", "1")
    .setDoc(jsonBuilder()
    .startObject().field("age", 32)
    .endObject())
    .get();

第二種

IndexRequest indexRequest = new IndexRequest("tseg", "students", "1")
    .source(jsonBuilder()
    .startObject()
    .field("first_name", "Shuang")
    .field("last_name", "Peng")
    .field("age", 32)
    .field("about", "I loving coding")
    .endObject());

UpdateRequest updateRequest = new UpdateRequest("tseg","students", "1")
    .doc(jsonBuilder()
    .startObject().field("age", 32)
    .endObject())
    .upsert(indexRequest);
 client.update(updateRequest).get();

不過這里提一下第二種方法,如果對應的 field 不存在的話,則更新操作自動變為插入操作,否則,就是正常的修改操作。

Multi Get API 多查找

MultiGetResponse API 可以一次返回多個要查找的值。下面介紹了兩種方法,一種是返回一個 Map,我們可以按照不同的 field 取值;第二種方法是直接返回一個字符串(Json格式)。

MultiGetResponse multiGetItemResponses = client.prepareMultiGet()
    .add("tseg", "students", "1", "2", "3").get();

for (MultiGetItemResponse itemResponses : multiGetItemResponses) {
    GetResponse response5 = itemResponses.getResponse();
    if (response5.isExists()) {
    
// 第一種用法
    Map fields = response5.getSource();
    System.out.println(fields.get("first_name"));

// 第二種用法
    String json2 = response5.getSourceAsString();
    System.out.println(json2);
}
Bulk API 批量操作

Bulk API允許批量提交index和delete請求, 如下:

BulkRequestBuilder bulkRequest = client.prepareBulk();
bulkRequest.add(client.prepareIndex("tseg", "students", "1")
           .setSource(jsonBuilder()
           .startObject()
           .field("first_name", "Allen")
           .field("last_name", "Peng")
           .field("age", "22")
           .endObject()))
           .get();
           
bulkRequest.add(client.prepareIndex("tseg", "students", "2"))
            .setSource(jsonBuilder()
            .startObject()
            .field("first_name", "Hou")
            .field("last_name", "Xue")
            .field("age", "30")
            .endObject()))
            .get();

HashMap json2 = new HashMap();
List list = new ArrayList();
list.add("music");
list.add("football");
json2.put("first_name", "Peng");
json2.put("last_name", "Peng");
json2.put("interests", list);
BulkRequestBuilder bulkRequest2 = client.prepareBulk();

// 兩種執行方法,個人傾向于第一種
bulkRequest2.add(client.prepareIndex("facebook", "info", 
    "3").setSource(json2)).get();
// 第二種方法
bulkRequest2.add(client.prepareIndex("facebook", 
    "info","1").setSource(json2)).execute().actionGet();

還可以這樣做:

BulkRequestBuilder bulkRequest = client.prepareBulk();
bulkRequest.add(client.prepareIndex("index1", "type1", "id1")
    .setSource(source);
bulkRequest.add(client.prepareIndex("index2", "type2", "id2")
    .setSource(source);
BulkResponse bulkResponse = bulkRequest.execute().actionGet();
Bulk Processor API 可在批量操作完成之前和之后進行相應的操作
BulkProcessor bulkProcessor = BulkProcessor.builder(
        client,  
        new BulkProcessor.Listener() {
            @Override
            public void beforeBulk(long executionId,
                                  BulkRequest request) { ... } 

            @Override
            public void afterBulk(long executionId,
                                  BulkRequest request,
                                  BulkResponse response) { ... } 

            @Override
            public void afterBulk(long executionId,
                                  BulkRequest request,
                                  Throwable failure) { ... } 
        })
        .setBulkActions(10000) 
        .setBulkSize(new ByteSizeValue(1, ByteSizeUnit.GB)) 
        .setFlushInterval(TimeValue.timeValueSeconds(5)) 
        .setConcurrentRequests(1) 
         .build();
         
bulkProcessor.add(new IndexRequest("index1", "type1", "id1").source(source1));  
bulkProcessor.add(new DeleteRequest("index2", "type2", "id2");        

beforeBulk 會在批量提交之前執行,可以從 BulkRequest 中獲取請求信息request.requests() 或者請求數量 request.numberOfActions()。

第一個 afterBulk 會在批量成功后執行,可以跟 beforeBulk 配合計算批量所需時間。

第二個 afterBulk 會在批量失敗后執行。

在例子中,當請求超過 10000 個(default=1000)或者總大小超過1GB(default=5MB)時,觸發批量提交動作。

后記

項目代碼已經共享至 GitHub。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69834.html

相關文章

  • Elasticsearch學習上手(

    摘要:是一個基于的開源搜索引擎。的目的是通過簡單的來隱藏的復雜性,從而讓全文搜索變得簡單。它提供了許多合理的缺省值,并對初學者隱藏了復雜的搜索引擎理論。它開箱即用安裝即可使用,只需很少的學習既可在生產環境中使用。 Elasticsearch是一個基于Apache Lucene(TM)的開源搜索引擎。一開始公司里一位同事是直接采用Luncene進行開發的,整體開發下來,代碼量大,比較復雜,我就...

    PumpkinDylan 評論0 收藏0

發表評論

0條評論

taohonghui

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<