1. 程式人生 > >elasticsearch-java api之文件(document)各種操作

elasticsearch-java api之文件(document)各種操作

使用java api和es互動時,可以是json字串、map物件;es中內建Jackson json序列化機制,可以將自定義物件轉成string或者byte,然後傳給es-java api使用。

1、新增document:

  1. public static boolean add(String indexName,String indexType,Map<String,Object> data){

  2. IndexResponse actionGet = transportClient

  3. .prepareIndex(indexName, indexType)

  4. .setSource(data)

  5. //.setId("1") //自己設定了id,也可以使用ES自帶的,但是看文件說,ES的會因為刪除id發生變動。

  6. .execute().actionGet();

  7. return actionGet.isCreated();

  8. }

注:如果設定了id,那麼id存在的則直接更新(所有欄位覆蓋更新)

2、更新document:

1)使用updateRequest:

  1. public static void update(String indexName,String indexType,String id,Map<String,Object> data){

  2. UpdateRequest updateRequest = new UpdateRequest();

  3. updateRequest.index(indexName)

  4. .type(indexType)

  5. .id(id)

  6. .doc(data);

  7. transportClient.update(updateRequest).actionGet();

  8. //或者使用下面方式(效果一樣)

  9. /*XContentBuilder jsonBuilder =XContentFactory.jsonBuilder();

  10. UpdateRequest updateRequest = new UpdateRequest();

  11. updateRequest.index(indexName)

  12. .type(indexType)

  13. .id(id)

  14. .doc(jsonBuilder

  15. .startObject()

  16. .field("title").value("XContentBuilder")

  17. .endObject());

  18. transportClient.update(updateRequest).actionGet();*/

  19. }

說明:

A、可以更新區域性欄位(map裡有多少欄位更新多少,也可以增加map裡面新欄位);

B、當id不存在時,不會自動插入,直接報錯 2)使用prepareUpdate:

  1. public static void update1(String indexName,String indexType,String id,Map<String,Object> data){

  2. UpdateRequestBuilder prepareUpdate = transportClient.prepareUpdate(indexName,indexType,id);

  3. prepareUpdate

  4. .setDoc(data)

  5. //.setId("")

  6. //.setScript("")

  7. .get();

  8. //或者

  9. /*try {

  10. XContentBuilder jsonBuilder =XContentFactory.jsonBuilder();

  11. UpdateRequestBuilder prepareUpdate1 = transportClient.prepareUpdate(indexName,indexType,id);

  12. prepareUpdate1

  13. .setDoc(jsonBuilder

  14. .startObject()

  15. .field("title").value("XContentBuilder")

  16. .endObject())

  17. .get();

  18. } catch (IOException e) {

  19. e.printStackTrace();

  20. }*/

  21. }

3、刪除document:

  1. public static void delDocument(String indexName,String indexType,String id){

  2. DeleteResponse deleteResponse = transportClient

  3. .prepareDelete(indexName, indexType, id)

  4. .execute().actionGet();

  5. deleteResponse.isFound();

  6. }

4、bulk操作:

bulk是一個批量操作,可以一次請求完成document的增刪改。

  1. public static boolean bulk(String indexName,String indexType,List<Map<String,Object>> datas){

  2. BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();

  3. bulkRequestBuilder.add(transportClient.prepareIndex(indexName, indexType).setSource(datas.get(0)));

  4. bulkRequestBuilder.add(transportClient.prepareDelete(indexName, indexType, "id"));

  5. bulkRequestBuilder.add(transportClient.prepareUpdate(indexName, indexType, "id").setDoc(datas.get(1)));

  6. BulkResponse bulkResponse = bulkRequestBuilder.execute().actionGet();

  7. return bulkResponse.hasFailures();

  8. }

6、get 操作:

可以通過索引名、型別名、文件id一次得到一個文件集合,文件可以來自同一個索引庫,也可以來自不同索引庫。 1)get操作:

  1. public static Map<String, Object> get(String indexName,String indexType,String id){

  2. GetResponse getResponse = transportClient

  3. .prepareGet(indexName, indexType, id)

  4. .execute().actionGet();

  5. return getResponse.getSource();

  6. }

2)mutilget:

  1. public static List<Map<String,Object>> multiGet(String indexName,String indexType,String... ids){

  2. List<Map<String,Object>> list = new ArrayList<>();

  3. MultiGetResponse response = transportClient.prepareMultiGet()

  4. .add(indexName,indexType,ids)

  5. .add("liu1","liu1_type","AV8-YHAr6f3B-qEudDab")//另一個index、indextype和ids

  6. .execute().actionGet();

  7. for(MultiGetItemResponse itemResponse:response){

  8. GetResponse getResponse = itemResponse.getResponse();

  9. if(getResponse.isExists()){

  10. list.add(getResponse.getSource());

  11. //System.out.println(getResponse.getSourceAsString());

  12. }

  13. }

  14. return list;

  15. }