ElasticSearch Java API

lcz393537415發表於2016-06-24
官方地址:
https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-docs.html

通過JAVA api實現對ES的增刪改查.

  1.   
  2. import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;  
  3.   
  4. import java.io.IOException;  
  5. import java.net.InetAddress;  
  6. import java.net.UnknownHostException;  
  7. import java.sql.Connection;  
  8. import java.sql.DriverManager;  
  9. import java.sql.ResultSet;  
  10. import java.sql.ResultSetMetaData;  
  11. import java.sql.SQLException;  
  12. import java.util.ArrayList;  
  13. import java.util.HashMap;  
  14. import java.util.List;  
  15. import java.util.Map;  
  16.   
  17. import org.elasticsearch.action.bulk.BackoffPolicy;  
  18. import org.elasticsearch.action.bulk.BulkProcessor;  
  19. import org.elasticsearch.action.bulk.BulkRequest;  
  20. import org.elasticsearch.action.bulk.BulkRequestBuilder;  
  21. import org.elasticsearch.action.bulk.BulkResponse;  
  22. import org.elasticsearch.action.get.GetResponse;  
  23. import org.elasticsearch.action.update.UpdateRequest;  
  24. import org.elasticsearch.client.Client;  
  25. import org.elasticsearch.client.transport.TransportClient;  
  26. import org.elasticsearch.common.settings.Settings;  
  27. import org.elasticsearch.common.transport.InetSocketTransportAddress;  
  28. import org.elasticsearch.common.unit.ByteSizeUnit;  
  29. import org.elasticsearch.common.unit.ByteSizeValue;  
  30. import org.elasticsearch.common.unit.TimeValue;  
  31.   
  32. public class Test {  
  33.   
  34.     public static void main(String[] args)  
  35.             throws ClassNotFoundException, SQLException, IOException, InterruptedException {  
  36.         // 準備資料  
  37.         long start = System.currentTimeMillis();  
  38.         List<Map<String, ?>> data = prepareData();  
  39.         long end = System.currentTimeMillis();  
  40.         System.out.printf("準備資料用時:%s秒\n", (end - start) / 1000);  
  41.   
  42.         start = System.currentTimeMillis();  
  43.         index(data);  
  44.         end = System.currentTimeMillis();  
  45.         System.out.printf("單條索引:%s秒\n", (end - start) / 1000);  
  46.   
  47.         start = System.currentTimeMillis();  
  48.         update(data);  
  49.         end = System.currentTimeMillis();  
  50.         System.out.printf("單條更新:%s秒\n", (end - start) / 1000);  
  51.   
  52.         start = System.currentTimeMillis();  
  53.         delete(data);  
  54.         end = System.currentTimeMillis();  
  55.         System.out.printf("單條刪除:%s秒\n", (end - start) / 1000);  
  56.   
  57.         start = System.currentTimeMillis();  
  58.         bulk(data);  
  59.         end = System.currentTimeMillis();  
  60.         System.out.printf("批量索引:%s秒\n", (end - start) / 1000);  
  61.   
  62.         start = System.currentTimeMillis();  
  63.         get(data);  
  64.         end = System.currentTimeMillis();  
  65.         System.out.printf("ID查詢:%s秒\n", (end - start) / 1000);  
  66.   
  67.         start = System.currentTimeMillis();  
  68.         bulkProcessor(data);  
  69.         end = System.currentTimeMillis();  
  70.         System.out.printf("bulkProcessor處理:%s秒\n", (end - start) / 1000);  
  71.     }  
  72.   
  73.     private static List<Map<String, ?>> prepareData()  
  74.             throws ClassNotFoundException, SQLException, UnknownHostException, InterruptedException {  
  75.         List<Map<String, ?>> data = new ArrayList<Map<String, ?>>();  
  76.         Class.forName("com.mysql.jdbc.Driver");  
  77.         Connection con = DriverManager.getConnection("jdbc:mysql://172.16.1.25/songod""root""123456");  
  78.         ResultSet rs = con.createStatement().executeQuery("select * from sod_song_ksc limit 20000");  
  79.         ResultSetMetaData metadata = rs.getMetaData();  
  80.         int columnCount = metadata.getColumnCount();  
  81.   
  82.         while (rs.next()) {  
  83.             Map<String, Object> object = new HashMap<String, Object>();  
  84.             for (int i = 1; i <= columnCount; i++) {  
  85.                 object.put(metadata.getColumnName(i), rs.getObject(i));  
  86.             }  
  87.             data.add(object);  
  88.         }  
  89.         rs.close();  
  90.         con.close();  
  91.   
  92.         return data;  
  93.     }  
  94.   
  95.     private static void index(List<Map<String, ?>> data) throws UnknownHostException {  
  96.   
  97.         Client client = getClient();  
  98.         for (Map<String, ?> map : data) {  
  99.             client.prepareIndex("songod""sod_song_ksc").setSource(map).setId(map.get("SongID").toString())  
  100.                     .setRouting(map.get("SongID").toString()).execute().actionGet();  
  101.         }  
  102.         client.close();  
  103.     }  
  104.   
  105.     private static void bulk(List<Map<String, ?>> data) throws UnknownHostException {  
  106.         Client client = getClient();  
  107.         BulkRequestBuilder bulkRequest = client.prepareBulk();  
  108.   
  109.         for (Map<String, ?> map : data) {  
  110.             bulkRequest.add(client.prepareIndex("songod""sod_song_ksc").setSource(map)  
  111.                     .setRouting(map.get("SongID").toString()).setId(map.get("SongID").toString()));  
  112.         }  
  113.         BulkResponse bulkResponse = bulkRequest.get();  
  114.         client.close();  
  115.     }  
  116.   
  117.     private static void get(List<Map<String, ?>> data) throws UnknownHostException {  
  118.         Client client = getClient();  
  119.         for (Map<String, ?> map : data) {  
  120.             GetResponse response = client.prepareGet("songod""sod_song_ksc", map.get("SongID").toString())  
  121.                     .setRouting(map.get("SongID").toString()).get();  
  122.             String str = response.getSourceAsString();  
  123.             // System.out.println(str);  
  124.         }  
  125.         client.close();  
  126.     }  
  127.   
  128.     private static void delete(List<Map<String, ?>> data) throws UnknownHostException {  
  129.         Client client = getClient();  
  130.         for (Map<String, ?> map : data) {  
  131.             client.prepareDelete("songod""sod_song_ksc", map.get("SongID").toString())  
  132.                     .setRouting(map.get("SongID").toString()).get();  
  133.         }  
  134.         client.close();  
  135.   
  136.     }  
  137.   
  138.     private static void update(List<Map<String, ?>> data) throws IOException {  
  139.         Client client = getClient();  
  140.         for (Map<String, ?> map : data) {  
  141.             client.prepareUpdate().setIndex("songod").setType("sod_song_ksc")  
  142.                     .setId(map.get("SongID").toString()).setDoc(jsonBuilder().startObject()  
  143.                             .field("Name""Hello World!!" + map.get("Name").toString()).endObject())  
  144.                     .setRouting(map.get("SongID").toString()).get();  
  145.         }  
  146.         client.close();  
  147.     }  
  148.   
  149.     private static void bulkProcessor(List<Map<String, ?>> data) throws IOException {  
  150.         BulkProcessor bulkProcessor = BulkProcessor.builder(getClient(), new BulkProcessor.Listener() {  
  151.   
  152.             public void afterBulk(long arg0, BulkRequest arg1, BulkResponse arg2) {  
  153.                 // TODO Auto-generated method stub  
  154.   
  155.             }  
  156.   
  157.             public void afterBulk(long arg0, BulkRequest arg1, Throwable arg2) {  
  158.                 // TODO Auto-generated method stub  
  159.   
  160.             }  
  161.   
  162.             public void beforeBulk(long arg0, BulkRequest arg1) {  
  163.                 // TODO Auto-generated method stub  
  164.   
  165.             }  
  166.   
  167.         }).setBulkActions(1000).setBulkSize(new ByteSizeValue(3, ByteSizeUnit.MB))  
  168.                 .setFlushInterval(TimeValue.timeValueSeconds(5)).setConcurrentRequests(1)  
  169.                 .setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3)).build();  
  170.         // .setRouting(map.get("SongID").toString())  
  171.         for (Map<String, ?> map : data) {  
  172.             UpdateRequest updateRequest = new UpdateRequest("songod""sod_song_ksc", map.get("SongID").toString());  
  173.             updateRequest.routing(map.get("SongID").toString());  
  174.             updateRequest.id(map.get("SongID").toString());  
  175.             updateRequest.doc(jsonBuilder().startObject().field("Name""Hello World!!" + map.get("Name").toString())  
  176.                     .endObject());  
  177.             bulkProcessor.add(updateRequest);  
  178.         }  
  179.         bulkProcessor.close();  
  180.     }  
  181.   
  182.     private static Client getClient() throws UnknownHostException {  
  183.         Settings settings = Settings.settingsBuilder().put("cluster.name""es_cluster").build();  
  184.         Client client = TransportClient.builder().settings(settings).build()  
  185.                 .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.16.114"), 9300));  
  186.   
  187.         return client;  
  188.     }  
  189.   
  190. }  

準備資料用時:1秒
單條索引:1381秒
單條更新:1624秒
單條刪除:1393秒
批量索引:4秒
ID查詢:8秒
bulkProcessor處理:10秒

執行環境是開發機.
不過可以看到,單條處理每秒也就是10-20條左右.
而在批量處理的時候,甚至可以達到每秒索引5000條.
所以批量處理幾乎是ES的不二使用方法.


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-2103753/,如需轉載,請註明出處,否則將追究法律責任。

相關文章