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 "";
}
先分享这么多,学技术不在于接受能力,而在于消化能力。
Java注解(3):一个真实Elasticsearch案例的更多相关文章
- 游戏服务端中使用Servlet和Java注解的一个好设计
SNS类游戏基本都是使用HTTP短连接,用Java来开发服务端时能够使用Servlet+Tomcat非常轻松的架构起服务端来.在这里介绍一种使用Servlet比較好的一种设计,我也见过非常多基于HTT ...
- Java注解最全详解(超级详细)
Java注解是一个很重要的知识点,掌握好Java注解有利于学习Java开发框架底层实现.@mikechen Java注解定义 Java注解又称Java标注,是在 JDK5 时引入的新特性,注解(也被称 ...
- Java注解(4):一个真实的Elasticsearch案例
昨天把拼了一半的注解+Elasticsearch积木放下了,因为东西太多了拼不好,还容易乱.休息了一晚上接着来. 接着昨天,创建elasticsearch文档注解(相当于数据表的注解): /** * ...
- Java注解开发与应用案例
Java注解开发与应用案例 Annotation(注解)是JDK5.0及以后版本引入的,可以对包.类.属性.方法的描述,给被述对象打上标签,被打上标签后的类.属性.方法将被赋予特殊的“功能”:打个比喻 ...
- 记录Java注解在JavaWeb中的一个应用实例
概述 在学习注解的时候,学了个懵懵懂懂.学了JavaWeb之后,在做Demo项目的过程中,借助注解和反射实现了对页面按钮的权限控制,对于注解才算咂摸出了点味儿来. 需求 以"角色列表&quo ...
- Java注解(2)-注解处理器(运行时|RetentionPolicy.RUNTIME)
如果没有用来读取注解的工具,那注解将基本没有任何作用,它也不会比注释更有用.读取注解的工具叫作注解处理器.Java提供了两种方式来处理注解:第一种是利用运行时反射机制:另一种是使用Java提供的API ...
- 使用JAVA实现的一个简单IOC注入实例
https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...
- Java注解小记
java注解是jdk1.5以后新出的特性,注解提升了Java语言的表达能力,有效地实现了应用功能和底层功能的分离,框架/库的程序员可以专注于底层实现. 1.Java内置注解 主要有三个: @Overr ...
- java 注解 总结
http://www.importnew.com/23564.html 注解的好处: 1.能够读懂别人写的代码,特别是框架相关的代码. 2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以 ...
随机推荐
- js屏蔽浏览器默认事件
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- mac下安装YII
新换了台电脑,一个mac,特蛋疼的各种环境安装.两个多小时,总算把开发环境配好了. XAMPP就不用说了,phpstorm(javaEE 6.0),navicat for mysql ,一堆的注册码, ...
- 基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
写在前面 最近两天,公司有个PC客户端的测试任务,除了最基础的功能测试外,还包括稳定性测试和兼容性测试需求.刚好去年接触过Sikuli这款基于GUI图像识别框架的自动化测试工具,于是便应用于测试工作中 ...
- Eplan创建符号详细解说
如何创建新的符号库以及在项目里面导入这个新的符号库 这个就不详细的赘述了 网上很多教程 和我一样的萌新可以参考 https://wenku.baidu.com/view/18c16641e45c3b3 ...
- HDFS基础入门
HDFS简介 HDFS(全称:Hadoop Distribute File System)分布式文件系统,是Hadoop核心组成. HDFS中的重要概念 分块存储 HDFS中的文件在物理上是分块存储的 ...
- 面试突击72:输入URL之后会执行什么流程?
在浏览器中输入 URL 之后,它会执行以下几个流程: 执行 DNS 域名解析: 封装 HTTP 请求数据包: 封装 TCP 请求数据包: 建立 TCP 连接(3 次握手): 参数从客户端传递到服务器端 ...
- Jmeter工具使用总结
Jmeter工具使用总结 目录 Jmeter函数总结 第一章 前言 第二章 常用函数的介绍 2.1. timeShift函数 2.2. time函数 2.3. groovy函数 第三章 常用用法 3. ...
- Hive存储格式之ORC File详解,什么是ORC File
目录 概述 文件存储结构 Stripe Index Data Row Data Stripe Footer 两个补充名词 Row Group Stream File Footer 条纹信息 列统计 元 ...
- Dubbo源码(九) - 服务调用过程
1. 前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 源码分析均基于官方Demo,路径:dubbo/dubbo-demo 如果没有看过之前Dub ...
- 02_Django-路由配置-HTTP协议的请求和响应
02_Django-路由配置-HTTP协议的请求和响应 视频:https://www.bilibili.com/video/BV1vK4y1o7jH 博客:https://blog.csdn.net/ ...