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);}}

推薦閱讀