學會了技術就要使用,否則很容易忘記,因為自然界壓根就不存在什么代碼、變數之類的玩意,這都是一些和生活常識格格不入的東西,只能多用多練,形成肌肉記憶才行,
在一次實際的產品開發中,由于業務需求的緣故,需要使用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 =https://www.cnblogs.com/xiangwang1111/p/ 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 =https://www.cnblogs.com/xiangwang1111/p/ 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 ""; }
先分享這么多,學技術不在于接受能力,而在于消化能力,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514324.html
標籤:Java
