学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西。只能多用多练,形成肌肉记忆才行。
在一次实际的产品开发中,由于业务需求的缘故,需要使用Elasticsearch搜索引擎。搜索引擎是通过索引和文档检索数据的,索引类似于MySQL的数据库,而文档类似于MySQL的表。要想使用搜索引擎,就必须事先创建索引和文档。
有两种解决方案可以实现:
第一种方案是把创建索引和文档的语句直接集成在代码里,每次启动时都检查相应的索引、文档是否存在,不存在就创建;
第二种方案是通过脚本的形式,把每个索引和文档的创建语句都保存下来,如果有字段改动则删除,再重新创建。
考虑到开发时字段可能会经常变动,此时就必然会导致修改代码,所以采取第二种方案时既要修改代码,又要同时修改脚本,否则会报错,比较费事。而采用第一种方案,只需要删掉索引和文档再重新启动应用就可以了,不必再单独执行脚本,非常方便,也不容易忘记。综合开发进度及其他现实因素,决定采用第一种方案来解决创建索引和文档的问题。
这里不打算创建一个完整的项目,只需要演示用Java创建Elasticsearch索引相关部分就行了。
即使是这么一点内容,代码量也不少,对于初学者来说仍然有些复杂,所以决定分为两部分来讲。
今天先来准备一下「材料」。事先声明:这里的代码都是应用于本地Elasticsearch服务的,而不是云原生服务,否则代码和配置等内容会有很大不同。
首先,引入所需要的依赖:
1 | < 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 >< dependency >< groupid >com.alibaba</ groupid >< artifactid >fastjson</ artifactid >< version >1.2.68</ version ></ dependency >< dependency >< groupid >org.apache.commons</ groupid >< artifactid >commons-lang3</ artifactid ></ dependency > |
然后修改application.properties属性文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ## 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配置类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | /** * 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 { requestConfigBuilder.setConnectTimeout(connectTimeOut); requestConfigBuilder.setSocketTimeout(socketTimeOut); requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeOut); return requestConfigBuilder; }).setHttpClientConfigCallback(httpClientBuilder -> { httpClientBuilder.disableAuthCaching(); return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); }); return new RestHighLevelClient(builder); } } |
上面这些都属于常规动作,没啥好说明的。
接下来,还是按照昨天的套路进行:
先创建elasticsearch字段类型枚举:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /** * 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的字段:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /** * 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注解之Elasticsearch的案例详解的详细内容,更多关于Java Elasticsearch的资料请关注IT俱乐部其它相关文章!