Elasticsearch入門系列~通過Java一系列操作Elasticsearch


Elasticsearch索引的創建、數據的增刪該查操作

  上一章節已經在Linux系統上安裝Elasticsearch並且可以外網訪問,這節主要通過Java代碼操作Elasticsearch

1、創建Maven工程

  添加pom依賴,pom.xml代碼如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sun.elasticsearch</groupId>
    <artifactId>Elasticsearch01</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <!-- Elasticsearch核心依賴包 -->
        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>transport</artifactId>
            <version>5.5.2</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- 日志依賴 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.21</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>
</project>

2、通過Java程序連接Elasticsearch

  需要注意的是,上一章節我們通過瀏覽器http://192.168.1.140:9200訪問可以正常訪問,這里需要知曉,9200端口是用於Http協議訪問的,如果通過客戶端訪問需要通過9300端口才可以訪問

,具體調用代碼如下  

 1 package com.sun.elasticsearch;
 2 
 3 import java.net.InetAddress;
 4 import java.net.UnknownHostException;
 5 
 6 import org.elasticsearch.client.transport.TransportClient;
 7 import org.elasticsearch.common.settings.Settings;
 8 import org.elasticsearch.common.transport.InetSocketTransportAddress;
 9 import org.elasticsearch.transport.client.PreBuiltTransportClient;
10 import org.junit.Test;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13 
14 /**
15  * Elasticsearch的基本測試
16  * @ClassName: ElasticsearchTest1  
17  * @author sunt  
18  * @date 2017年11月22日 
19  * @version V1.0
20  */
21 public class ElasticsearchTest1 {
22 
23     private Logger logger = LoggerFactory.getLogger(ElasticsearchTest1.class);
24     
25     public final static String HOST = "192.168.1.140";
26     
27     public final static int PORT = 9300;//http請求的端口是9200,客戶端是9300
28     
29     /**
30      * 測試Elasticsearch客戶端連接
31      * @Title: test1 
32      * @author sunt  
33      * @date 2017年11月22日
34      * @return void
35      * @throws UnknownHostException 
36      */
37     @SuppressWarnings("resource")
38     @Test
39     public void test1() throws UnknownHostException {
40         //創建客戶端
41         TransportClient client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddresses(
42                                  new InetSocketTransportAddress(InetAddress.getByName(HOST),PORT));
43         
44         logger.debug("Elasticsearch connect info:" + client.toString());
45 
46         //關閉客戶端
47         client.close();
48     }
49 }    

 3、Elasticsearch索引庫的創建

  為了簡化代碼,我們在修改Junit測試類,在方法執行之前連接Elasticsearch,方法調用之后自動執行關閉Elasticsearch,通過@Before和@After注解實現,具體代碼如下

 1 private Logger logger = LoggerFactory.getLogger(ElasticsearchTest2.class);
 2     
 3     public final static String HOST = "192.168.1.140";
 4     
 5     public final static int PORT = 9300; //http請求的端口是9200,客戶端是9300
 6     
 7     private TransportClient client = null;
 8     /**
 9      * 獲取客戶端連接信息
10      * @Title: getConnect 
11      * @author sunt  
12      * @date 2017年11月23日
13      * @return void
14      * @throws UnknownHostException 
15      */
16     @SuppressWarnings({ "resource", "unchecked" })
17     @Before
18     public void getConnect() throws UnknownHostException {
19         client = new PreBuiltTransportClient(Settings.EMPTY).addTransportAddresses(
20                  new InetSocketTransportAddress(InetAddress.getByName(HOST),PORT));
21         logger.info("連接信息:" + client.toString());
22     }
23     
24     /**
25      * 關閉連接
26      * @Title: closeConnect 
27      * @author sunt  
28      * @date 2017年11月23日
29      * @return void
30      */
31     @After
32     public void closeConnect() {
33         if(null != client) {
34             logger.info("執行關閉連接操作...");
35             client.close();
36         }
37     }

 

創建索引庫:

/**
     * 創建索引庫
     * @Title: addIndex1
     * @author sunt  
     * @date 2017年11月23日
     * @return void
     * 需求:創建一個索引庫為:msg消息隊列,類型為:tweet,id為1
     * 索引庫的名稱必須為小寫
     * @throws IOException 
     */
    @Test
    public void addIndex1() throws IOException {
        IndexResponse response = client.prepareIndex("msg", "tweet", "1").setSource(XContentFactory.jsonBuilder()
                .startObject().field("userName", "張三")
                .field("sendDate", new Date())
                .field("msg", "你好李四")
                .endObject()).get();
        
        logger.info("索引名稱:" + response.getIndex() + "\n類型:" + response.getType()
                    + "\n文檔ID:" + response.getId() + "\n當前實例狀態:" + response.status());
    }

 

PS: 索引庫名稱必須為小寫,如果為大寫會包如下錯誤信息

第二、Elasticsearch是5.5.2版本,最新的6.0版本代碼運行會報如下錯誤,折騰了半天還是沒有調試成功,最后無奈只能換為5.5.2版本,

這里重點說明,可能當初寫的比較粗略,這里指得版本號是安裝軟件的版本號,maven版本號最好跟軟件的大版本號保持一致

此時運行代碼控制台打印出如下結果,說明此時已經在ElasticSearch中創建成功一個為msg的索引庫

4、向索引庫中添加json字符串

 1 /**
 2      * 添加索引:傳入json字符串
 3      * @Title: addIndex2 
 4      * @author sunt  
 5      * @date 2017年11月23日
 6      * @return void
 7      */
 8     @Test
 9     public void addIndex2() {
10         String jsonStr = "{" +
11                 "\"userName\":\"張三\"," +
12                 "\"sendDate\":\"2017-11-30\"," +
13                 "\"msg\":\"你好李四\"" +
14             "}";
15         IndexResponse response = client.prepareIndex("weixin", "tweet").setSource(jsonStr,XContentType.JSON).get();
16         logger.info("json索引名稱:" + response.getIndex() + "\njson類型:" + response.getType()
17         + "\njson文檔ID:" + response.getId() + "\n當前實例json狀態:" + response.status());
18         
19     }

 執行結果如下:CREATED說明向索引庫添加數據成功

5、向索引庫添加一個Map集合

 1 /**
 2      * 創建索引-傳入Map對象
 3      * @Title: addIndex3 
 4      * @author sunt  
 5      * @date 2017年11月23日
 6      * @return void
 7      */
 8     @Test
 9     public void addIndex3() {
10         Map<String, Object> map = new HashMap<String,Object>();
11         map.put("userName", "張三");
12         map.put("sendDate", new Date());
13         map.put("msg", "你好李四");
14         
15         IndexResponse response = client.prepareIndex("momo", "tweet").setSource(map).get();
16         
17         logger.info("map索引名稱:" + response.getIndex() + "\n map類型:" + response.getType()
18         + "\n map文檔ID:" + response.getId() + "\n當前實例map狀態:" + response.status());
19     }

執行結果:

6、向索引庫添加JsonObject

 1 /**
 2      * 傳遞json對象
 3      * 需要添加依賴:gson
 4      * @Title: addIndex4 
 5      * @author sunt  
 6      * @date 2017年11月23日
 7      * @return void
 8      */
 9     @Test
10     public void addIndex4() {
11         JsonObject jsonObject = new JsonObject();
12         jsonObject.addProperty("userName", "張三");
13         jsonObject.addProperty("sendDate", "2017-11-23");
14         jsonObject.addProperty("msg","你好李四");
15         
16         IndexResponse response = client.prepareIndex("qq", "tweet").setSource(jsonObject, XContentType.JSON).get();
17         
18         logger.info("jsonObject索引名稱:" + response.getIndex() + "\n jsonObject類型:" + response.getType()
19         + "\n jsonObject文檔ID:" + response.getId() + "\n當前實例jsonObject狀態:" + response.status());
20     }

執行結果:

7、從索引庫獲取數據

 1 /**
 2      * 從索引庫獲取數據
 3      * @Title: getData1 
 4      * @author sunt  
 5      * @date 2017年11月23日
 6      * @return void
 7      */
 8     @Test
 9     public void getData1() {
10         GetResponse getResponse = client.prepareGet("msg", "tweet", "1").get();
11         logger.info("索引庫的數據:" + getResponse.getSourceAsString());
12     }

執行結果:

8、更新索引庫數據

/**
     * 更新索引庫數據
     * @Title: updateData 
     * @author sunt  
     * @date 2017年11月23日
     * @return void
     */
    @Test
    public void updateData() {
        JsonObject jsonObject = new JsonObject();
        
        jsonObject.addProperty("userName", "王五");
        jsonObject.addProperty("sendDate", "2008-08-08");
        jsonObject.addProperty("msg","你好,張三,好久不見");
        
        UpdateResponse updateResponse = client.prepareUpdate("msg", "tweet", "1")
                                        .setDoc(jsonObject.toString(),XContentType.JSON).get();
        
        logger.info("updateResponse索引名稱:" + updateResponse.getIndex() + "\n updateResponse類型:" + updateResponse.getType()
        + "\n updateResponse文檔ID:" + updateResponse.getId() + "\n當前實例updateResponse狀態:" + updateResponse.status());
    }

執行結果:

更新結束之后,再次調用從索引庫獲取數據執行結果如下:

9、刪除索引庫的數據

 1 /**
 2      * 根據索引名稱,類別,文檔ID 刪除索引庫的數據
 3      * @Title: deleteData 
 4      * @author sunt  
 5      * @date 2017年11月23日
 6      * @return void
 7      */
 8     @Test
 9     public void deleteData() {
10         DeleteResponse deleteResponse = client.prepareDelete("msg", "tweet", "1").get();
11         
12         logger.info("deleteResponse索引名稱:" + deleteResponse.getIndex() + "\n deleteResponse類型:" + deleteResponse.getType()
13         + "\n deleteResponse文檔ID:" + deleteResponse.getId() + "\n當前實例deleteResponse狀態:" + deleteResponse.status());
14     }

執行結果:

刪除之后再次執行從索引庫獲取數據,結果如下

索引庫的數據變為null了,說明刪除成功

 

歡迎各位加群討論:534073451

最新更新地址: https://www.sunnyblog.top/index.html

我的博客即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=28ksbsiji2m8o


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM