本文讲解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 依赖。
复制代码 org.springframework.boot spring-boot-starter-data-elasticsearch
数据源
方案一 使用 Spring Boot 默认配置
在 src/main/resources/application.properties 中配置数据源信息。
spring.data.elasticsearch.properties.host = 127.0.0.1spring.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{ public List findByTitle(String title);}复制代码
Service相关
我们来定义实现类,Service层调用Dao层的方法,这个是典型的套路。
@Servicepublic class NewsService { @Autowired private NewsRepository newsRepository; public IterablefindAll(){ return newsRepository.findAll(); } public Iterable search(QueryBuilder query){ return newsRepository.search(query); } public List 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 MapfindList(HttpServletRequest request) { Map params = new HashMap (); params.put("items", this.newsService.findAll()); return params; } /** * find * @param request * @return */ @RequestMapping(value = "/{title}", method = RequestMethod.GET) public Map search(@PathVariable String title) { // 构建查询条件 QueryBuilder queryBuilder = QueryBuilders.queryString(title); Map params = new HashMap (); params.put("items", this.newsService.search(queryBuilder)); return params; }}复制代码
总结
上面这个简单的案例,让我们看到了 Spring Boot 整合 ElasticSearch 流程如此简单。
源代码
相关示例完整代码:
(完)
更多精彩文章,尽在「服务端思维」微信公众号!