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

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

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

Java注解(3):一个真实Elasticsearch案例的更多相关文章

  1. 游戏服务端中使用Servlet和Java注解的一个好设计

    SNS类游戏基本都是使用HTTP短连接,用Java来开发服务端时能够使用Servlet+Tomcat非常轻松的架构起服务端来.在这里介绍一种使用Servlet比較好的一种设计,我也见过非常多基于HTT ...

  2. Java注解最全详解(超级详细)

    Java注解是一个很重要的知识点,掌握好Java注解有利于学习Java开发框架底层实现.@mikechen Java注解定义 Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称 ...

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

    昨天把拼了一半的注解+Elasticsearch积木放下了,因为东西太多了拼不好,还容易乱.休息了一晚上接着来. 接着昨天,创建elasticsearch文档注解(相当于数据表的注解): /** * ...

  4. Java注解开发与应用案例

    Java注解开发与应用案例 Annotation(注解)是JDK5.0及以后版本引入的,可以对包.类.属性.方法的描述,给被述对象打上标签,被打上标签后的类.属性.方法将被赋予特殊的“功能”:打个比喻 ...

  5. 记录Java注解在JavaWeb中的一个应用实例

    概述 在学习注解的时候,学了个懵懵懂懂.学了JavaWeb之后,在做Demo项目的过程中,借助注解和反射实现了对页面按钮的权限控制,对于注解才算咂摸出了点味儿来. 需求 以"角色列表&quo ...

  6. Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)

    如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API ...

  7. 使用JAVA实现的一个简单IOC注入实例

    https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...

  8. Java注解小记

    java注解是jdk1.5以后新出的特性,注解提升了Java语言的表达能力,有效地实现了应用功能和底层功能的分离,框架/库的程序员可以专注于底层实现. 1.Java内置注解 主要有三个: @Overr ...

  9. java 注解 总结

    http://www.importnew.com/23564.html 注解的好处: 1.能够读懂别人写的代码,特别是框架相关的代码. 2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以 ...

随机推荐

  1. 数据分表Mybatis Plus动态表名最优方案的探索

    一.应用场景 大家在使用Mybatis进行开发的时候,经常会遇到一种情况:按照月份month将数据放在不同的表里面,查询数据的时候需要跟不同的月份month去查询不同的表. 但是我们都知道,Mybat ...

  2. Luogu2798 爆弹虐场 (二分,Kruskal)

    二分答案,判定连通性 #include <iostream> #include <cstdio> #include <cstring> #include <a ...

  3. 非常全的一份Python爬虫的Xpath博文

    非常全的一份Python爬虫的Xpath博文 Xpath 是 python 爬虫过程中非常重要的一个用来定位的一种语法. 一.开始使用 首先我们需要得到一个 HTML 源代码,用来模拟爬取网页中的源代 ...

  4. 快速创建springboot项目,并进行增删改

    创建普通maven项目,pom依赖如下 <parent> <artifactId>spring-boot-starter-parent</artifactId> & ...

  5. 【HMS core】【FAQ】典型问题合集7

    ​1.[HMS core][Account Kit][问题描述] 集成华为帐号服务后,登录服务异常,无法获取用户信息,报statusCode为907135001,抓取报错日志:Failed to re ...

  6. 1.4_HTML的标签简介

    HTML 标签 HTML 标记标签通常被称为 HTML 标签 (HTML tag). HTML 标签是由尖括号包围的关键词,比如 <html> HTML 标签通常是成对!出现的,比如 &l ...

  7. 【Java】学习路径46-两种创建多线程的方法、以及在匿名内部类创建线程

    两种方法: 1.创建一个继承自Thread的线程类,然后再main(不限)中构造这个线程类对象.方法在之前讲过. 2.创建一个使用Runnable接口的线程类,然后在main(不限)中构造这个Runn ...

  8. django_day06

    django_day06 内容回顾 事务 try: with transaction.atomic(): #事务 #一系列的操作 pass except Exception as e: print(e ...

  9. 第八十一篇:Vue购物车(二) 名称,图片,价格的渲染

    好家伙, 1,为组件封装属性, 需要封装以下属性: 需要定义的属性 属性名 值的类型 商品名 title String 商品图片 pic String 商品价格 price Number 是否勾选 s ...

  10. 第十篇:vue.js for循环语句(大作业进行时)

    Vue.js 循环语句 <div id="app"> <ol> <li v-for="site in sites"> /*f ...