从01开始 从01开始
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)

peterjxl

人生如逆旅,我亦是行人
首页
  • 计算机科学导论
  • 数字电路
  • 计算机组成原理

    • 计算机组成原理-北大网课
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • Git
  • JavaSE
  • Java高级
  • JavaEE

    • Ant
    • Maven
    • Log4j
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • Servlet
  • Spring
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC
  • SpringBoot
  • 学习网课的心得
  • 输入法
  • 节假日TodoList
  • 其他
  • 关于本站
  • 网站日记
  • 友人帐
  • 如何搭建一个博客
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

  • JavaWeb

  • Spring

  • 主流框架

    • Redis

    • Mybatis

    • Lucene

    • Elasticsearch

      • Elasticsearch简介
      • ES的安装和启动
      • ES相关术语
      • ES索引库的维护
      • ES索引库的查询
      • ES集成IK分词器
      • ES集群
      • 使用Java操作ES
        • 学习目标
        • 环境准备
        • 创建索引库
        • 设置Mappings
        • 添加一个初始化方法
        • 添加文档
        • 添加文档的另一种方式
        • 源码
      • 使用Java查询ES
      • SpringDataElasticSearch
      • Elasticsearch
    • MQ

    • MyCat

    • Lombok

    • 主流框架
  • SpringMVC

  • SpringBoot

  • Java并发

  • Java源码

  • JVM

  • 韩顺平

  • Java
  • Java
  • 主流框架
  • Elasticsearch
2023-05-22
目录

使用Java操作ES

# 60.使用Java操作ES

在项目中,我们通常是使用编程语言来操作索引库,例如Java。

‍

# 学习目标

  1. 能够使用 Java 客户端完成创建、删除索引的操作
  2. 能够使用 Java 客户端完成文档的增删改的操作
  3. 能够使用 Java 客户端完成文档的查询操作
  4. 能够完成文档的分页操作
  5. 能够完成文档的高亮查询操作
  6. 能够搭建Spring Data ElasticSearch的环境
  7. 能够完成Spring Data ElasticSearch的基本增删改查操作
  8. 能够掌握基本条件查询的方法命名规则

‍

‍

# 环境准备

创建一个Maven工程,准备Maven的依赖(主要是前两个重要,其他的是一些日志相关的依赖)

<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.13.3</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.32</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>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.6</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.9.0</version>
    </dependency>
  </dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

‍

# 创建索引库

编写测试方法实现创建索引库

  1. 创建一个Settings对象,相当于是一个配置地对象,主要配置集群的名称。
  2. 创建一个客户端Client对象
  3. 使用Client对象创建一个索引库
  4. 关闭Client对象

写个测试方法:

package com.peterjxl.es;

import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;

public class ElasticsearchClientTest {


    @Test
    public void createIndex() throws Exception {
        // 1. 创建一个Settings对象,相当于是一个配置地对象,主要配置集群的名称。
        Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();

        // 2. 创建一个客户端Client对象,相当于是一个连接。
        TransportClient client = new PreBuiltTransportClient(settings);
        // 除了配置对象,还需要配置连接的地址。注意我们不是使用HTTP形式,用的是TCP形式,所以使用的是TransportClient对象,并且端口是9301。
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301 ));
        // 为了保证集群的高可用,我们需要配置多个节点。
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302 ));
        client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303 ));


        // 3. 使用Client对象创建一个索引库。admin()是管理的意思,indices()是索引的意思,prepareCreate()是创建的意思,最后get()是执行。
        client.admin().indices().prepareCreate("index_hello").get();

        // 4. 关闭Client对象
        client.close();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

‍

执行完后:可以看到有这个索引

​(https://image.peterjxl.com/blog/image-20230518200339-3gbr1wp.png)​

‍

‍

‍

# 设置Mappings

步骤和之前类似,只是多了设置mappings:

  1. 创建一个Settings对象
  2. 创建一个Client对象
  3. 创建一个mappings信息,可以是JSON,可以是字符串,也可以是XContextBuilder对象(ES提供的,可以用于描述JSON信息)
  4. 使用Client向 ES 发送 mappings 信息
  5. 关闭Client对象

测试方法:

@Test
public void setIndexMappings() throws Exception {
    // 1. 创建一个Settings对象,相当于是一个配置地对象,主要配置集群的名称。
    Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();

    // 2. 创建一个客户端Client对象,相当于是一个连接。
    TransportClient client = new PreBuiltTransportClient(settings)
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301 ))
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302 ))
            .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303 ));

    XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
            .startObject()  // startObject()相当于是一个左大括号 {
                .startObject("article")
                    .startObject("properties")
                        .startObject("id")
                            .field("type", "long")  //field()相当于是一个键值对,这里的意思是id的类型是long
                            .field("store", true)
                        .endObject()
                        .startObject("title")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_smart")
                        .endObject()
                        .startObject("content")
                            .field("type", "text")
                            .field("store", true)
                            .field("analyzer", "ik_smart")
                        .endObject()
                    .endObject()
                .endObject()
            .endObject(); // endObject()相当于是一个右大括号 }

    client.admin().indices().preparePutMapping("index_hello") // preparePutMapping()相当于是一个PUT请求
            .setType("article")
            .setSource(xContentBuilder) // 设置mapping信息,可以是XContentBuilder对象,可以是 JSON 格式的字符串
            .get(); // 执行操作

    // 4. 关闭Client对象
    client.close();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

‍

使用XContextBuilder和自己手动拼接JSON字符串,是差不多的。执行完后,可以在head插件中看到结果:

​(https://image.peterjxl.com/blog/image-20230518205910-pml6c80.png)​

‍

‍

# 添加一个初始化方法

之前我们每个方法都初始化了一次Client对象,还是挺麻烦的,我们可以抽取出来:

private TransportClient client;

@Before
public void init() throws Exception {
    // 1. 创建一个Settings对象,相当于是一个配置地对象,主要配置集群的名称。
    Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build();

    client = new PreBuiltTransportClient(settings)
  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9301 ))
  .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9302 ))
 .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9303 ));
}

@After
public void close() {
    client.close();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

‍

‍

​​

‍

‍

# 添加文档

步骤:

  1. 创建一个Settings对象
  2. 创建一个Client对象
  3. 创建一个文档对象,创建一个json格式的字符串,或者使用XContentBuilder
  4. 使用Client对象吧文档添加到索引库中
  5. 关闭Client
@Test
public void testAddDocument() throws Exception{
    XContentBuilder builder = XContentFactory.jsonBuilder()
            .startObject()
                .field("id", 3L)
                .field("title", "关于梦想")
                .field("content", "编程对我而言,就像是一颗小小的,微弱的希望的种子,我甚至都不愿意让人看见它。生怕有人看见了便要嘲讽它,它太脆弱了,经不起别人的质疑")
            .endObject();

//        client.prepareIndex("index_hello", "article", "1")
    client.prepareIndex()
            .setIndex("index_hello")    //设置索引名称
            .setType("article") //设置type
            .setId("3")         //设置文档的id,如果不设置的话,会自动生成一个
            .setSource(builder) //设置文档信息
            .get();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

‍

‍

可以在head插件中看到:

​​(https://image.peterjxl.com/blog/image-20230518220534-rz2xq6m.png)​​

‍

# 添加文档的另一种方式

我们可以使用Jackson转换JSON,更方便点。步骤:

  1. 创建一个 POJO 类
  2. 使用工具类把 POJO 转换成 JSON 字符串
  3. 把文档写入索引库

‍

定义一个Article类:

package com.peterjxl.es;

public class Article {
    private Long id;
    private String title;
    private String content;
}
1
2
3
4
5
6
7

要生成getter和setter方法

‍

写个测试方法:

@Test
public void testAddDocument2() throws Exception {
    // 创建一个Article对象,设置对象的属性
    Article article = new Article();
    article.setId(4L);
    article.setTitle("关于买房");
    article.setContent("虚假的挥霍:花几千块钱去看看海。真正的挥霍:花100万交个首付买一个名义面积70平,实际面积55平,再还30年贷款的小户型住房");

    // 把Article对象转换为JSON格式的字符串
    ObjectMapper objectMapper = new ObjectMapper();
    String jsonDocument = objectMapper.writeValueAsString(article);
    System.out.println(jsonDocument);

    // 把文档写入索引库
    client.prepareIndex("index_hello", "article", article.getId().toString())
            .setSource(jsonDocument, XContentType.JSON)
            .get();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

‍

‍

​(https://image.peterjxl.com/blog/image-20230518222743-5n71xmj.png)​

‍

‍

# 源码

本项目已将源码上传到Gitee (opens new window)和GitHub (opens new window)上。并且创建了分支demo1,读者可以通过切换分支来查看本文的示例代码

在GitHub上编辑此页 (opens new window)
上次更新: 2023/6/7 08:46:42
ES集群
使用Java查询ES

← ES集群 使用Java查询ES→

Theme by Vdoing | Copyright © 2022-2023 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式