摘要:最近在學習,這是一個分布式的大數據搜索引擎,其實也可以看作是一個分布式的數據庫。多查找可以一次返回多個要查找的值。第二個會在批量失敗后執行。在例子中,當請求超過個或者總大小超過時,觸發批量提交動作。
最近在學習 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 種:
HashMapjson = 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 獲取 DocumentGetResponse response2 = client.prepareGet("tseg", "students", "1").get(); MapDelete API 刪除 Index 或者 Documentres = response2.getSource(); for (Map.Entry entry: res.entrySet()){ System.out.println(entry.getKey() + " : " + entry.getValue()); }
// 用來刪除對應的 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()) { // 第一種用法 MapBulk API 批量操作fields = response5.getSource(); System.out.println(fields.get("first_name")); // 第二種用法 String json2 = response5.getSourceAsString(); System.out.println(json2); }
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(); HashMapjson2 = 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是一個基于Apache Lucene(TM)的開源搜索引擎。一開始公司里一位同事是直接采用Luncene進行開發的,整體開發下來,代碼量大,比較復雜,我就...
閱讀 1378·2021-09-26 09:55
閱讀 1917·2019-08-30 12:45
閱讀 1055·2019-08-29 11:20
閱讀 3555·2019-08-26 11:33
閱讀 3411·2019-08-26 10:55
閱讀 1685·2019-08-23 17:54
閱讀 2382·2019-08-23 15:55
閱讀 2341·2019-08-23 14:23