【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插件进行查看,例如:
在这里插入图片描述

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