[轉] Spring Boot 揭秘與實戰(二) 數據存儲篇 - ElasticSearch


[From] http://www.tuicool.com/articles/JBvQrmj

 

本文講解Spring Boot基礎下,如何使用 ElasticSearch,實現全文搜索。

版本須知

spring data elasticSearch 的版本與Spring boot、Elasticsearch版本需要匹配。

Spring Boot Version (x) Spring Data Elasticsearch Version (y) Elasticsearch Version (z)
x <= 1.3.5 y <= 1.3.4 z <= 1.7.2
x >= 1.4.x 2.0.0 <=y <5.0.0 2.0.0 <= z < 5.0.0

環境依賴

修改 POM 文件,添加 spring-boot-starter-data-elasticsearch 依賴。

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>

數據源

方案一 使用 Spring Boot 默認配置

在 src/main/resources/application.properties 中配置數據源信息。

spring.data.elasticsearch.properties.host = 127.0.0.1 spring.data.elasticsearch.properties.port = 9300

通過 Java Config 創建ElasticSearchConfig。

@Configuration
@EnableElasticsearchRepositories("com.lianggzone.springboot.action.data.elasticsearch") public class ElasticSearchConfig {}

方案二 手動創建

通過 Java Config 創建ElasticSearchConfig。

@Configuration
@EnableElasticsearchRepositories("com.lianggzone.springboot.action.data.elasticsearch") public class ElasticsearchConfig2 { private String hostname = "127.0.0.1"; private int port = 9300; @Bean public ElasticsearchOperations elasticsearchTemplate() { return new ElasticsearchTemplate(client()); } @Bean public Client client() { TransportClient client = new TransportClient(); TransportAddress address = new InetSocketTransportAddress(hostname, port); client.addTransportAddress(address); return client; } }

業務操作

實體對象

@Document(indexName = "springbootdb", type = "news") public class News { @Id private String id; private String title; private String content; @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyyMMdd'T'HHmmss.SSS'Z'") @Field(type = FieldType.Date, format = DateFormat.basic_date_time, index = FieldIndex.not_analyzed) @CreatedDate private Date createdDateTime; // GET和SET方法 }

DAO相關

public interface NewsRepository extends ElasticsearchRepository<News, String> { public List<News> findByTitle(String title); }

Service相關

我們來定義實現類,Service層調用Dao層的方法,這個是典型的套路。

@Service
public class NewsService { @Autowired private NewsRepository newsRepository; public Iterable<News> findAll(){ return newsRepository.findAll(); } public Iterable<News> search(QueryBuilder query){ return newsRepository.search(query); } public List <News> findByTitle(String title) { return this.newsRepository.findByTitle(title); } public void deleteAll(String id){ this.newsRepository.delete(id); } public void init(){ for (int i = 0; i < 100; i++) { News news = new News(); news.setId(i+""); news.setTitle(i + ".梁桂釗單元測試用例"); news.setContent("梁桂釗單元測試用例"+i+"xxxxx"); news.setCreatedDateTime(new Date()); this.newsRepository.save(news); } } }

Controller相關

為了展現效果,我們先定義一組簡單的 RESTful API 接口進行測試。

@RestController
@RequestMapping(value="/data/elasticsearch/news") public class NewsController { @Autowired private NewsService newsService; /**  * 初始化  * @param request  */ @RequestMapping(value = "/init", method = RequestMethod.POST) public void init(HttpServletRequest request) { this.newsService.init(); } /**  * findAll  * @param request  * @return  */ @RequestMapping(value = "/", method = RequestMethod.GET) public Map<String, Object> findList(HttpServletRequest request) { Map<String, Object> params = new HashMap<String, Object>(); params.put("items", this.newsService.findAll()); return params; } /**  * find  * @param request  * @return  */ @RequestMapping(value = "/{title}", method = RequestMethod.GET) public Map<String, Object> search(@PathVariable String title) { // 構建查詢條件  QueryBuilder queryBuilder = QueryBuilders.queryString(title); // Pekkle: spring boot 1.4.1 集成elastic search后看不到此方法,用如下方法代替。
QueryBuilder queryBuilder = QueryBuilders.simpleQueryStringQuery(title);
Map<String, Object> params = new HashMap<String, Object>(); params.put("items", this.newsService.search(queryBuilder)); return params; } }

總結

上面這個簡單的案例,讓我們看到了 Spring Boot 整合 ElasticSearch 流程如此簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM