Java注解之Elasticsearch的案例詳解
學(xué)會了技術(shù)就要使用,否則很容易忘記,因?yàn)樽匀唤鐗焊筒淮嬖谑裁创a、變量之類的玩意,這都是一些和生活常識格格不入的東西。只能多用多練,形成肌肉記憶才行。
在一次實(shí)際的產(chǎn)品開發(fā)中,由于業(yè)務(wù)需求的緣故,需要使用Elasticsearch搜索引擎。搜索引擎是通過索引和文檔檢索數(shù)據(jù)的,索引類似于MySQL的數(shù)據(jù)庫,而文檔類似于MySQL的表。要想使用搜索引擎,就必須事先創(chuàng)建索引和文檔。
有兩種解決方案可以實(shí)現(xiàn):
第一種方案是把創(chuàng)建索引和文檔的語句直接集成在代碼里,每次啟動時都檢查相應(yīng)的索引、文檔是否存在,不存在就創(chuàng)建;
第二種方案是通過腳本的形式,把每個索引和文檔的創(chuàng)建語句都保存下來,如果有字段改動則刪除,再重新創(chuàng)建。
考慮到開發(fā)時字段可能會經(jīng)常變動,此時就必然會導(dǎo)致修改代碼,所以采取第二種方案時既要修改代碼,又要同時修改腳本,否則會報錯,比較費(fèi)事。而采用第一種方案,只需要刪掉索引和文檔再重新啟動應(yīng)用就可以了,不必再單獨(dú)執(zhí)行腳本,非常方便,也不容易忘記。綜合開發(fā)進(jìn)度及其他現(xiàn)實(shí)因素,決定采用第一種方案來解決創(chuàng)建索引和文檔的問題。
這里不打算創(chuàng)建一個完整的項(xiàng)目,只需要演示用Java創(chuàng)建Elasticsearch索引相關(guān)部分就行了。
即使是這么一點(diǎn)內(nèi)容,代碼量也不少,對于初學(xué)者來說仍然有些復(fù)雜,所以決定分為兩部分來講。
今天先來準(zhǔn)備一下「材料」。事先聲明:這里的代碼都是應(yīng)用于本地Elasticsearch服務(wù)的,而不是云原生服務(wù),否則代碼和配置等內(nèi)容會有很大不同。
首先,引入所需要的依賴:
<!-- Elasticsearch相關(guān)依賴 --> <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
接著,創(chuàng)建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); } }
上面這些都屬于常規(guī)動作,沒啥好說明的。
接下來,還是按照昨天的套路進(jìn)行:
先創(chuàng)建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; } }
然后創(chuàng)建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注解之Elasticsearch的案例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java Elasticsearch的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java實(shí)戰(zhàn)之課程信息管理系統(tǒng)的實(shí)現(xiàn)
這篇文章主要介紹了如何利用Java實(shí)現(xiàn)課程信息管理系統(tǒng),文中采用到的技術(shù)有:Springboot、SpringMVC、MyBatis、FreeMarker等,感興趣的可以了解一下2022-04-04

@JsonSerialize(using = LongToStringUtil.class)注解的使

詳解Java接口簽名(Signature)實(shí)現(xiàn)方案

Mybatis-Plus開發(fā)提速器generator的使用

基于Java方式實(shí)現(xiàn)數(shù)據(jù)同步