【elasticsearch系列】SpringBoot整合elasticsearch客户端

2021-12-01 09:55:58 浏览数 (1)

目录

  • 文档
  • ElasticSearch Head
  • 实践
  • 踩坑点

文档

Elasticsearch: 权威指南 Java REST Client

可以跟着官网示例写demo

工欲善其事必先利其器,对于ES数据的查看,首先先安装一个谷歌浏览器的插件ElasticSearch Head,便于大家后期确认测试数据是否成功;

ElasticSearch Head

谷歌浏览器左上角存在一个“应用”标签,进入谷歌的应用商店;

搜索""安装成为扩展程序即可;然后打开,输入自己的ES服务地址,连接集群即可;

插件安装好之后,进入实践项目;

实践

1、pom.xml

代码语言:javascript复制
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.elasticsearch.client</groupId>
            <artifactId>elasticsearch-rest-high-level-client</artifactId>
            <version>7.15.0</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

2、配置文件

代码语言:javascript复制
server:
  port: 8096
spring:
  application:
    name: elasticsearch

elasticsearch:
  host: #{自定义服务器地址},例如127.0.0.1
  port: 9200 端口
  scheme: http

3、配置类

代码语言:javascript复制
@Configuration
public class ElasticsearchConfig {

    @Value("${elasticsearch.host}")
    private String host;

    @Value("${elasticsearch.port}")
    private Integer port;

    @Value("${elasticsearch.scheme}")
    private String scheme;

    /**
     * 创建es客户端,设置主机服务器
     *
     * @return
     */
    @Bean
    public RestHighLevelClient restHighLevelClient() {

        RestClientBuilder builder = RestClient.builder(
                //单机部署
                new HttpHost(host, port, scheme)
        );

        return new RestHighLevelClient(builder);
    }
}

5、工具类

代码语言:javascript复制
@Slf4j
public class ElasticsearchUtil {

    @Autowired
    private RestHighLevelClient restHighLevelClient;

    //请求选项:设置授权等
    public static final RequestOptions COMMON_OPTIONS;

    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
        //设置授权
        //builder.addHeader("Authorization", "Bearer "   TOKEN);
        //自定义消费响应
        //builder.setHttpAsyncResponseConsumerFactory(
        //new HttpAsyncResponseConsumerFactory
        //.HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }


    /**
     * 创建索引
     *
     * @param elasticsearchIndex
     * @throws IOException
     */
    public void createIndex(ElasticsearchIndex elasticsearchIndex) throws IOException {
        if (elasticsearchIndex == null) {
            return;
        }
        IndexRequest indexRequest = new IndexRequest(elasticsearchIndex.getIndex());
        indexRequest.id(elasticsearchIndex.getId());
        //注意:json方式存入
        indexRequest.source(elasticsearchIndex.getLogContent(), XContentType.JSON);
        IndexResponse indexResponse = restHighLevelClient.index(indexRequest, COMMON_OPTIONS);
        log.info("create es index success, response:{}", indexResponse);
    }

    /**
     * 判断索引是否存在
     *
     * @param index
     * @return
     * @throws IOException
     */
    public boolean existsIndex(String index) throws IOException {
        GetRequest request = new GetRequest(index);
        boolean exists = restHighLevelClient.exists(request, COMMON_OPTIONS);
        log.info("existsIndex: "   exists);
        return exists;
    }
todo 后面关于索引、文档等各类工具类自定义补充,此处简单举例说明而已

}

6、ES实体

代码语言:javascript复制
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ElasticsearchIndex {
    /**
     * 索引名字
     */
    private String index;

    /**
     * 索引类型
     */
    private String type;

    /**
     * 文档记录id
     */
    private String id;

    /**
     * 内容
     */
    private String content;

}

封装一个实体对象,统一交互ES;

7、单测

注意:此处文档内容直接封装成JSON格式,故工具类创建索引时采用JSON类型,如果需要改动,可以自定义;

代码语言:javascript复制
public class ElasticsearchTest {
    @Autowired
    private ElasticsearchUtil elasticSearchUtil;


    @Test
    public void test() throws IOException {
        String content = "{"name":"测试"}";
        ElasticsearchIndex index = ElasticsearchIndex.builder()
                .index("test_index")
                .id(UUID.randomUUID().toString().replace("-",""))
                .logContent(content)
                .build();
        elasticSearchUtil.createIndex(index);
    }



}

通过插件查看测试索引和文档是否创建成功

踩坑点

[testIndex] ElasticsearchStatusException[Elasticsearch exception [type=invalid_index_name_exception, reason=Invalid index name [testIndex], must be lowercase] 溪源更开始入门时,定义索引名字时,按照Java规范定义驼峰格式testIndex,发现报以上错误,报错信息也是提示我们索引名字必须以小写格式,故定义索引等其他字段时可以参考MySQL数据库字段格式要求,"_"下划线连接多个字段;

0 人点赞