2016年的时候一无所有,还整天逛着逛那,没有压力,多亏2016年出手买了房。公司一个小伙可能月薪1万2,但是房贷就有5000块,刨去吃饭1200,水电物业费同学聚会偶尔花销,一个月也所剩无几。想起2016年房价7000块的时候,那时候满大街都是阿姨骑着电动车给售楼部拉人,拉一个人进售楼部就给阿姨奖励50块。住房公积金贷款首付20%就可以买套房,也就是说那时候首付16万就可以买个80多平的房子。
好了,废话不多说,咋还得努力换个车不是,下次买车必须换2.0T。
今天我们就看一下Spring Boot整合solr,首先我们需要修改pom文件,引入spring solr data依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> <version>2.2.10.RELEASE</version> </dependency>
接下来我们增加application.properties中spring data solr的配置
spring.data.solr.host=http://localhost:8081/solr/personalsite
ok,我们先把solr启动起来看看数据准备好了没
ok,solr启动起来了,我们看一下personalsite这个collection的数据
数据是有的,然后我们根据Schema去创建我们的实体类
对应创建的实体类如下
public class TechArticle implements Serializable { @Field("id") private String id; @Field("ArticleId") private String articleId; @Field("Title") private String title; @Field("Contents") private String content; @Field("Tags") private String tag; public String getArticleId() { return articleId; } public void setArticleId(String articleId) { this.articleId = articleId; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getTag() { return tag; } public void setTag(String tag) { this.tag = tag; } public String getId() { return id; } public void setId(String id) { this.id = id; } }
ok,实体类的注解Field必须和solr中的field name一致。
接下来我们去创建一个service,包含两个方法,一个是查询,一个是新增
@Service public class TechArticleService implements ITechArticleService { @Autowired private TechArticleReviewMapper mapper; @Autowired private SolrClient solrClient; public List<TechArticle> getTechArticleBySolr(@Nullable String title) { SolrQuery solrQuery = new SolrQuery(); solrQuery.setQuery("*:*"); solrQuery.setStart(0); solrQuery.setRows(50); if (title != null && !title.isEmpty()) { solrQuery.setQuery(String.format("Title:*%s*", title.trim())); } solrQuery.setSort("ArticleId", SolrQuery.ORDER.desc); QueryResponse response = new QueryResponse(); try { response = solrClient.query(solrQuery); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return response.getBeans(TechArticle.class); } public String createTechArticleBySolr(TechArticle techArticle) { try { if (techArticle.getId() == null || techArticle.getId().isEmpty()) { UUID uuid = UUID.randomUUID(); techArticle.setId(uuid.toString()); } solrClient.addBean(techArticle); solrClient.commit(); } catch (IOException e) { e.printStackTrace(); } catch (SolrServerException e) { e.printStackTrace(); } return techArticle.getId(); } }
查询方法很简单,只有一个title参数,如果用户传入了title,就用title查询,否则查所有,从第1页开始查50条,以ArticleId字段倒序排列,注意这里如果需要返回实体类,而不是solr的原生document对象,就使用getBeans方法转化为实体集合。
OK我们先看一下控制器
@RestController @RequestMapping("techarticle") public class techArticleController { private final String RESPONSE_CODE = "100100002"; @Autowired private ITechArticleService techArticleService; @GetMapping("retrieve") public List<TechArticle> getTechArticleList(@RequestParam("title") String title) { return techArticleService.getTechArticleBySolr(title); } @PostMapping(value = "create", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) public String createTechArticleBySolr(@RequestBody TechArticle techArticle) { return techArticleService.createTechArticleBySolr(techArticle); } }
接下来我们在post man先请求一下查询的api,我们查询文章标题中有Silver的文章,结果如下
查询没有问题,接下来我们再试一下创建
可以看见已经创建成功了,返回了id,接下来我们拿着这个id去solr admin页面查一下
看起来没有任何问题,ok,今天就到这里,晚安!