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

