【ELK】使用Java客戶端如何管理elasticsearch

關於elasticsearch,一般基本的操作就是:創建索引庫、創建Mapping、添加文檔、查看內容,本篇博客就從這幾個方面介紹如何使用。

首先要做的就是新建一個項目,引入相關依賴

 <dependencies>
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>transport</artifactId>
        <version>5.6.8</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-to-slf4j</artifactId>
        <version>2.9.1</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.24</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.21</version>
    </dependency>
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.12</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.8</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.8.1</version>
    </dependency>
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.8.1</version>
    </dependency>
</dependencies>

一、使用Java客戶端創建索引庫

操作步驟

1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、使用client對象創建一個索引庫
4、關閉client對象

代碼實現

 @Test
 public void createIndex() throws Exception{
      // 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
      // elasticsearch.yml文件默認的是cluster的名字是elasticsearch,如果這裏你自己改了的話,要對應自己配置的名字
       Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
       // 2、創建一個客戶端client對象
      TransportClient client = new PreBuiltTransportClient(settings);
      // 192.168.226.132、192.168.226.133、192.168.226.133是我這裏的搭建elasticsearch的集羣ip,當然這裏使用一臺也是可以的
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
      // 3、使用client對象創建一個索引庫
      client.admin().indices().prepareCreate("index_hello")
              // 執行操作
              .get();
      // 4、關閉client對象
      client.close();
  }

二、使用Java客戶端設置Mapping

操作步驟

1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、創建一個mapping信息,一個json數據,可以是字符串,也可以是XContentBuilder對象
4、使用client把mapping信息設置到索引庫中
5、關閉client對象

代碼實現

@Test
public void createMapping() throws Exception{
    // 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
    Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
    // 2、創建一個客戶端client對象
    TransportClient client = new PreBuiltTransportClient(settings);
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
    // 3、創建一個mapping信息,一個json數據,可以是字符串,也可以是XContentBuilder對象
    XContentBuilder builder = XContentFactory.jsonBuilder()
            .startObject()
                .startObject("article")
                    .startObject("properties")
                        .startObject("id")
                            .field("type","long")
                            .field("store",true)
                        .endObject()
                        .startObject("title")
                            .field("type","text")
                            .field("store",true)
                            .field("analyzer","standard")
                        .endObject()
                        .startObject("content")
                            .field("type","text")
                            .field("store",true)
                            .field("analyzer","standard")
                        .endObject()
                    .endObject()
                .endObject()
            .endObject();
    // 4、使用client把mapping信息設置到索引庫中
    client.admin().indices()
            // 設置要做映射的索引
            .preparePutMapping("index_hello")
            // 設置要做映射的type
            .setType("article")
            // mapping信息,可以是XContentBuild對象,可以是jsona格式的字符串
            .setSource(builder)
            // 執行操作
            .get();
    // 5、關閉client對象
    client.close();

}

XContentBuilder的使用

關於XContentBuilder這個使用,這裏再介紹一下,XContentBuilder是elasticsearch提供的一種構造json格式的數據對象的類,它的startObject類似一個左大括號“{”,endObject類似一個右大括號“}”。下邊就來對比下,它的格式與json格式,看是如何對應的
在這裏插入圖片描述

三、使用Java客戶端添加文檔

操作步驟

1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、創建一個文檔對象,一個json數據,可以是字符串,也可以是XContentBuilder對象
4、將文檔對象添加到索引庫
5、關閉client對象

代碼實現

(1)通過XContentBuilder構造json的方式直接放數據到elasticsearch中

 @Test
 public void testAddDocument() throws Exception{
      // 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
      Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
      // 2、創建一個客戶端client對象
      TransportClient client = new PreBuiltTransportClient(settings);
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
      client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
      // 3、創建一個文檔對象
      XContentBuilder builder=XContentFactory.jsonBuilder()
              .startObject()
                  .field("id",1L)
                  .field("title","烽火佳人")
                  .field("content","像風走過八千里")
              .endObject();
      // 4、將文檔對象添加到索引庫
      client.prepareIndex()
              // 設置索引名稱
              .setIndex("index_hello")
              // 設置type
              .setType("article")
              // 設置文檔的id,如果不設置會自動生成一個id
              .setId("1")
              // 設置文檔信息
              .setSource(builder)
              // 執行操作
              .get();
      // 5、關閉client對象
      client.close();
  }

(2)使用實體類的方式向elasticsearch存數據

創建一個實體類

@Data
public class Article {
    private Long id;
    private String title;
    private String content;
}
@Test
public void testAddDocument2() throws Exception{
    // 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
    Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
    // 2、創建一個客戶端client對象
    TransportClient client = new PreBuiltTransportClient(settings);
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));
    // 3、創建一個Article對象
     Article article = new Article();
     // 設置對象屬性
     article.setId(2L);
     article.setTitle("烽火佳人2");
    article.setContent("像風走過八千里2");
    // 將article 對象轉換成json格式的字符串
    ObjectMapper objectMapper = new ObjectMapper();
     String jsonDocument = objectMapper.writeValueAsString(article);
    // 使用client對象把文檔寫入索引庫
    client.prepareIndex("index_hello","article","2")
            .setSource(jsonDocument, XContentType.JSON)
            .get();
    // 關閉客戶端
    client.close();
}

四、使用Java客戶端實現搜索

查詢方式

1、根據id搜索

QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");

2、根據Term搜索(關鍵詞)

我這裏由於用的是standard分析器,elasticsearch自帶的就是這個分析器,這個分析器會將字拆成一個一個的,所以這裏查詢的時候,也只能用一個字的格式的查,如果想用詞語的、多個字的,可以在elasticsearch中裝上IK分析器,設置mapping的analyzer時候設置爲“ik_smart”就可以了
關於standard分析器和IK分析器可參考博客:
elasticsearch中的分析器standard與IK分析器的區別,以及IK分析器如何安裝

QueryBuilder queryBuilder = QueryBuilders.termQuery("title","烽");

3、使用QueryString搜索

QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("烽火").defaultField("title");

操作步驟

1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
2、創建一個客戶端client對象
3、創建一個查詢對象
4、使用client執行查詢
5、取查詢結果
(1)取查詢結果的總記錄數
(2)取查詢結果列表
6、關閉client對象

代碼實現

@Test
public void testSearch () throws Exception{
    // 1、創建一個settings對象,相當於一個配置信息,主要是配置集羣的名稱
    Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
    // 2、創建一個客戶端client對象
    TransportClient client = new PreBuiltTransportClient(settings);
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.132"),9301));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.133"),9301));
    client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("192.168.226.134"),9301));

    // 3、創建一個查詢對象
    //QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
    //QueryBuilder queryBuilder = QueryBuilders.termQuery("title","烽");
    QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("烽火").defaultField("title");

    // 4、使用client執行查詢
    SearchResponse searchResponse = client.prepareSearch("index_hello")
            .setTypes("article")
            .setQuery(queryBuilder)
            .get();

    // 5、取查詢結果
    SearchHits hits = searchResponse.getHits();
    // 5.1、取查詢結果的總記錄數
    System.out.println("查詢結果總記錄數:" + hits.getTotalHits());
    ///5.2、取查詢結果列表
    Iterator<SearchHit> iterator = hits.iterator();
    while (iterator.hasNext()) {
        SearchHit searchHit = iterator.next(); // 每個查詢對象
        // 打印文檔對象
        System.out.println("------------------------------文檔對象");
        System.out.println(searchHit.getSourceAsString()); // 獲取字符串格式打印
        // 取文檔的屬性
        System.out.println("------------------------------文檔的屬性");
         Map<String, Object> doucument = searchHit.getSource();
        System.out.println(doucument.get("title"));
    }

    //6、關閉client對象
    client.close();

}

補充:
這裏查看數據也可以使用kibana來查看,也可以在瀏覽器裏添加Elasticsearch Head插件進行查看,例如:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章