Java注解(3):一个真实的Elasticsearch案例

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

在一次实际的产品开发中,由于业务需求的缘故,需要使用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 ""; }

 

 

先分享这么多,学技术不在于接受能力,而在于消化能力。

 

发表评论

评论已关闭。

相关文章