SpringBoot整合ElasticSearch
一、基於spring-boot-starter-data-elasticsearch整合
開發環境:springboot版本:2.0.1,elasticSearch-5.6.8.jar版本:5.6.8,服務器部署ElasticSearch版本:6.3.2
1、application.properties
spring.data.elasticsearch.cluster-name=elasticsearch spring.data.elasticsearch.cluster-nodes=127.0.0.1:9300 spring.data.elasticsearch.repositories.enabled=true
2、pom.xml
<!--spring整合elasticsearch包--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <!--實體工具包--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--集合工具包--> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>19.0</version> </dependency>
3、Notice實體
@Data @AllArgsConstructor @NoArgsConstructor //indexName代表所以名稱,type代表表名稱 @Document(indexName = "wantu_notice_info", type = "doc") public class Notice { //id @JsonProperty("auto_id") private Long id; //標題 @JsonProperty("title") private String title; //公告標簽 @JsonProperty("exchange_mc") private String exchangeMc; //公告發布時間 @JsonProperty("create_time") private String originCreateTime; //公告閱讀數量 @JsonProperty("read_count") private Integer readCount; }
4、NoticeRepository類
import com.jincou.elasearch.domain.Notice; import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; import org.springframework.stereotype.Component; @Component public interface NoticeRepository extends ElasticsearchRepository<Notice, Long> { }
5、NoticeController
@RestController @RequestMapping("/api/v1/article") public class NoticeController { @Autowired private NoticeRepository nticeRepository; @GetMapping("save") public CommandResult<Void> save(long id, String title){ Notice article = new Notice(); article.setId(id); article.setReadCount(123); article.setTitle("springboot整合elasticsearch,這個是新版本 2018年"); nticeRepository.save(article); return CommandResult.ofSucceed(); } /** * @param title 搜索標題 * @param pageable page = 第幾頁參數, value = 每頁顯示條數 */ @GetMapping("search") public CommandResult<List<Notice>> search(String title,@PageableDefault(page = 1, value = 10) Pageable pageable){
//按標題進行搜索 QueryBuilder queryBuilder = QueryBuilders.matchQuery("title", title);
//如果實體和數據的名稱對應就會自動封裝,pageable分頁參數 Iterable<Notice> listIt = nticeRepository.search(queryBuilder,pageable);
//Iterable轉list List<Notice> list= Lists.newArrayList(listIt); return CommandResult.ofSucceed(list); } }
6、查看運行結果
它會進行中文分詞查詢,然后安裝相識度進行排序

總體步驟還是蠻清晰簡單的,因為有spring-boot-starter-data-elasticsearch進行了整合,所以我們可以少敲很多代碼。
二、 基於TransportClient整合
首先明白:如果項目SpringBoot1.5.X以下的,那么elasticSearch.jar最高是2.4.4版本的,只有SpringBoot2.X+,elasticSearch.jar才是5.X+
如果你的SpringBoot是1.5.X以下,那你又想用elasticSearch.jar5.X+怎么辦呢,那就不要用spring-boot-starter-data-elasticsearch,用原生的TransportClient實現即可。
這個相當於用原生的去使用elasticsearch,這里面並沒有用到spring-boot-starter-data-elasticsearch相關jar包,因為我們公司的springBoot版本是1.5.9。
如果用spring-boot-starter-data-elasticsearch的話,那么elasticsearch版本最高只有2.4.4,這也太落后了,現在elasticsearch已經到6.3.2了,為了用更好的版本有兩個方案:
1、提高springboot版本到2.X(不過不現實,船大難掉頭),2、用原生的TransportClient實現。最終落地實現是通過TransportClient實現
把關鍵代碼展示出來。
1、pom.xml
<dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch</artifactId> <version>5.6.8</version> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>5.6.8</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency>
2、創建實體
@Configuration public class ServerModule { @Bean public TransportClient transportClient() { Settings settings = Settings.builder().put("cluster.name", "biteniuniu").build(); //我用6.3.2版本的時候這里一直報異常說找不到InetSocketTransportAddress類,這應該和jar有關,當我改成5.6.8就不報錯了 TransportClient client = new PreBuiltTransportClient(settings);//6.3.2這里TransportAddress代替InetSocketTransportAddress client.addTransportAddress(new InetSocketTransportAddress( new InetSocketAddress(InetAddresses.forString("127.0.0.1"), 9300))); return client; } }
3、NoticeController類
@RestController @RequestMapping("/api/v1/notice") public class NoticeController { @Autowired private TransportClient transportClient; /** *利用TransportClient實現搜索功能 * @param title 搜索標題 * @param page = 從第幾條結果返回 | Integer(比如一次size=20,page=0,如果要顯示下一頁20條記錄則需要size=20,page=20)這個和之前有點區別, size = 每頁顯示條數 */ @RequestMapping(value = "trsearch", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public CommandResult<List<Notice>> search(@RequestParam(value = "title", defaultValue = "比特幣")String title, @RequestParam(value = "page", defaultValue = "0")Integer page, @RequestParam(value = "size", defaultValue = "20")Integer size) { BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery(); //按標題進行查找 boolQueryBuilder.must(QueryBuilders.matchQuery("title", title));
//在這里輸入索引名稱和type類型 SearchResponse response = transportClient.prepareSearch("wantu_notice_info").setTypes("doc") // 設置查詢類型java .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) // 設置查詢關鍵詞 .setQuery(boolQueryBuilder) // 設置查詢數據的位置,分頁用 .setFrom(page) // 設置查詢結果集的最大條數 .setSize(size) // 設置是否按查詢匹配度排序 .setExplain(true) // 最后就是返回搜索響應信息 .get(); SearchHits searchHits = response.getHits(); List<Notice> list = Lists.newArrayListWithCapacity(size); for (SearchHit searchHit : searchHits) { Map<String, Object> sourceAsMap = searchHit.getSourceAsMap(); //獲得titie數據 String titles = (String) sourceAsMap.get("title"); //獲得閱讀量數據 Integer readCount = (Integer) sourceAsMap.get("read_count"); //把數據裝入對象中 Notice notice=new Notice(); notice.setTitle(titles); notice.setReadCount(readCount); list.add(notice); } return CommandResult.ofSucceed(list); } }
4、運行結果

總結下:第一種整合相對簡單很多,因為本身封裝很多東西,比如分頁,封裝數據等。第二種的話可以在不用spring的情況下使用它。
我只是偶爾安靜下來,對過去的種種思忖一番。那些曾經的舊時光里即便有過天真愚鈍,也不值得譴責。畢竟,往后的日子,還很長。不斷鼓勵自己,
天一亮,又是嶄新的起點,又是未知的征程(上校4)
