Java注解之Elasticsearch的案例详解

作者:湘王 时间:2022-03-30 12:28:58 

学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西。只能多用多练,形成肌肉记忆才行。

在一次实际的产品开发中,由于业务需求的缘故,需要使用Elasticsearch搜索引擎。搜索引擎是通过索引和文档检索数据的,索引类似于MySQL的数据库,而文档类似于MySQL的表。要想使用搜索引擎,就必须事先创建索引和文档。

有两种解决方案可以实现:

第一种方案是把创建索引和文档的语句直接集成在代码里,每次启动时都检查相应的索引、文档是否存在,不存在就创建;

第二种方案是通过脚本的形式,把每个索引和文档的创建语句都保存下来,如果有字段改动则删除,再重新创建。

考虑到开发时字段可能会经常变动,此时就必然会导致修改代码,所以采取第二种方案时既要修改代码,又要同时修改脚本,否则会报错,比较费事。而采用第一种方案,只需要删掉索引和文档再重新启动应用就可以了,不必再单独执行脚本,非常方便,也不容易忘记。综合开发进度及其他现实因素,决定采用第一种方案来解决创建索引和文档的问题。

这里不打算创建一个完整的项目,只需要演示用Java创建Elasticsearch索引相关部分就行了。

即使是这么一点内容,代码量也不少,对于初学者来说仍然有些复杂,所以决定分为两部分来讲。

今天先来准备一下「材料」。事先声明:这里的代码都是应用于本地Elasticsearch服务的,而不是云原生服务,否则代码和配置等内容会有很大不同。

首先,引入所需要的依赖:

<!-- Elasticsearch相关依赖 -->

<dependency>

<groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-high-level-client</artifactId>
   <exclusions>

<exclusion>
           <groupId>org.elasticsearch</groupId>
           <artifactId>elasticsearch</artifactId>
       </exclusion>

<exclusion>
           <groupId>org.elasticsearch.client</groupId>
           <artifactId>elasticsearch-rest-client</artifactId>
       </exclusion>
   </exclusions>
</dependency>

<dependency>

<groupId>org.elasticsearch.client</groupId>
   <artifactId>elasticsearch-rest-client</artifactId>
</dependency>

<dependency>
   <groupId>org.elasticsearch</groupId>
   <artifactId>elasticsearch</artifactId>
</dependency>

<!-- fastjson -->
<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>fastjson</artifactId>
   <version>1.2.68</version>
</dependency>

<!-- apache commons -->

<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-lang3</artifactId>
</dependency>

然后修改application.properties属性文件:

## ELASTICSEARCH

spring.elastic.rhlc.schema=http

spring.elastic.rhlc.hosts=127.0.0.1:9200

spring.elastic.rhlc.username=elastic

spring.elastic.rhlc.password=123456

spring.elastic.rhlc.connectTimeOut=5000

spring.elastic.rhlc.socketTimeOut=5000

spring.elastic.rhlc.connectionRequestTimeOut=10000

spring.elastic.rhlc.maxConnectNumber=10000

spring.elastic.rhlc.maxConnectPerRoute=8

接着,创建elasticsearch配置类:

/**
* Elasticsearch配置类
*
* @author xiangwang
*/
@Configuration
public class ElasticConfiguration {
   @Value("${spring.elastic.rhlc.schema}")
   private String schema;
   @Value("${spring.elastic.rhlc.hosts}")
   private String hosts;
   @Value("${spring.elastic.rhlc.username}")
   private String username;
   @Value("${spring.elastic.rhlc.password}")
   private String password;
   @Value("${spring.elastic.rhlc.connectTimeOut}")
   private int connectTimeOut;
   @Value("${spring.elastic.rhlc.socketTimeOut}")
   private int socketTimeOut;
   @Value("${spring.elastic.rhlc.connectionRequestTimeOut}")
   private int connectionRequestTimeOut;

@Bean
   public RestHighLevelClient client() {
       String[] hosts = this.hosts.split(",");
       HttpHost[] httpHosts = new HttpHost[hosts.length];
       for (int i = 0; i < hosts.length; i++) {
           httpHosts[i] = new HttpHost(hosts[i].split(":")[0], Integer.parseInt(hosts[i].split(":")[1]), schema);
       }
       final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
       credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(username, password));
       RestClientBuilder builder = RestClient.builder(httpHosts).setRequestConfigCallback(requestConfigBuilder -> {
           requestConfigBuilder.setConnectTimeout(connectTimeOut);
           requestConfigBuilder.setSocketTimeout(socketTimeOut);
           requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut);
           return requestConfigBuilder;
       }).setHttpClientConfigCallback(httpClientBuilder -> {
           httpClientBuilder.disableAuthCaching();
           return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
       });
       return new RestHighLevelClient(builder);
   }
}

上面这些都属于常规动作,没啥好说明的。

接下来,还是按照昨天的套路进行:

先创建elasticsearch字段类型枚举:

/**
* elastic字段类型枚举
*
* @author xiangwang
*/
public enum FieldType {
   Auto("auto"),
   Text("text"),
   Keyword("keyword"),
   Long("long");

public String value;

private FieldType(final String value) {
       this.value = value;
   }

public static String getValue(final String value) {
       for (FieldType field : FieldType.values()) {
           if (field.getValue().equalsIgnoreCase(value)) {
               return field.value;
           }
       }
       return null;
   }

public String getValue() {
       return value;
   }

public void setValue(final String value) {
       this.value = value;
   }
}

然后创建elasticsearch的字段:

/**
* elastic字段注解,定义每个elasticsearch字段上的属性
*
* @author xiangwang
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface DocField {
   @AliasFor("name")
   String value() default "";

@AliasFor("value")
   String name() default "";

FieldType type() default FieldType.Auto;

boolean index() default false;

String format() default "";

String pattern() default "";

boolean store() default false;

boolean fielddata() default false;

String searchAnalyzer() default "";

String analyzer() default "";

String normalizer() default "";
}

来源:https://www.cnblogs.com/xiangwang1111/p/16795004.html

标签:Java,Elasticsearch
0
投稿

猜你喜欢

  • Flink支持哪些数据类型?

    2023-01-15 06:55:43
  • Java利用过滤器实现完善登录功能

    2021-07-20 15:07:05
  • SpringBoot 集成 Druid过程解析

    2023-02-25 12:07:59
  • 在Maven下代理服务器设定的方式

    2023-10-15 02:17:13
  • Java多态中动态绑定原理解析

    2021-08-01 06:39:23
  • SpringAOP+RabbitMQ+WebSocket实战详解

    2023-01-01 18:40:25
  • java线程池详解及代码介绍

    2023-09-16 07:21:57
  • Go Java算法猜数字游戏示例详解

    2022-03-02 21:01:50
  • 阿里、华为、腾讯Java技术面试题精选

    2023-11-25 02:29:39
  • java实现随机数生成器

    2023-06-15 04:26:53
  • 关于SpringMVC在Controller层方法的参数解析详解

    2022-10-29 01:06:10
  • java虚拟机内存溢出及泄漏实例

    2023-11-27 15:22:06
  • 如何用java实现分页查询

    2023-09-23 06:50:24
  • Java 获取当前系统时间的三种方法

    2023-11-21 12:51:51
  • 如何处理maven仓库中后缀LastUpdated文件

    2022-01-21 22:15:44
  • Java swing五子棋的实现方法

    2021-06-01 15:25:20
  • 如何为Spring Cloud Gateway加上全局过滤器

    2022-06-19 09:14:47
  • C#中结构(struct)的部分初始化和完全初始化实例分析

    2021-11-01 16:33:36
  • java selenium 操作浏览器实例

    2023-04-13 17:57:13
  • Java如何根据不同系统动态获取换行符和盘分割符

    2022-02-27 10:33:10
  • asp之家 软件编程 m.aspxhome.com