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

学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西 。只能多用多练,形成肌肉记忆才行 。
在一次实际的产品开发中,由于业务需求的缘故,需要使用Elasticsearch搜索引擎 。搜索引擎是通过索引和文档检索数据的 , 索引类似于MySQL的数据库 , 而文档类似于MySQL的表 。要想使用搜索引擎,就必须事先创建索引和文档 。
有两种解决方案可以实现:
第一种方案是把创建索引和文档的语句直接集成在代码里,每次启动时都检查相应的索引、文档是否存在,不存在就创建;
第二种方案是通过脚本的形式,把每个索引和文档的创建语句都保存下来,如果有字段改动则删除,再重新创建 。
考虑到开发时字段可能会经常变动,此时就必然会导致修改代码 , 所以采取第二种方案时既要修改代码,又要同时修改脚本,否则会报错,比较费事 。而采用第一种方案,只需要删掉索引和文档再重新启动应用就可以了,不必再单独执行脚本,非常方便,也不容易忘记 。综合开发进度及其他现实因素 , 决定采用第一种方案来解决创建索引和文档的问题 。
这里不打算创建一个完整的项目 , 只需要演示用Java创建Elasticsearch索引相关部分就行了 。
即使是这么一点内容,代码量也不少,对于初学者来说仍然有些复杂,所以决定分为两部分来讲 。
【3 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属性文件:
## ELASTICSEARCHspring.elastic.rhlc.schema=httpspring.elastic.rhlc.hosts=127.0.0.1:9200spring.elastic.rhlc.username=elasticspring.elastic.rhlc.password=123456spring.elastic.rhlc.connectTimeOut=5000spring.elastic.rhlc.socketTimeOut=5000spring.elastic.rhlc.connectionRequestTimeOut=10000spring.elastic.rhlc.maxConnectNumber=10000spring.elastic.rhlc.maxConnectPerRoute=8接着,创建elasticsearch配置类:
/** * Elasticsearch配置类 * * @author xiangwang */@Configurationpublic 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;@Beanpublic 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);}}

推荐阅读