2021年10月24日 23:07
原创作品,转载时请务必以超链接形式标明文章原始出处,否则将追究法律责任。

2016年的时候一无所有,还整天逛着逛那,没有压力,多亏2016年出手买了房。公司一个小伙可能月薪1万2,但是房贷就有5000块,刨去吃饭1200,水电物业费同学聚会偶尔花销,一个月也所剩无几。想起2016年房价7000块的时候,那时候满大街都是阿姨骑着电动车给售楼部拉人,拉一个人进售楼部就给阿姨奖励50块。住房公积金贷款首付20%就可以买套房,也就是说那时候首付16万就可以买个80多平的房子。

image.png

好了,废话不多说,咋还得努力换个车不是,下次买车必须换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启动起来看看数据准备好了没

image.png

ok,solr启动起来了,我们看一下personalsite这个collection的数据

image.png

数据是有的,然后我们根据Schema去创建我们的实体类

image.png

对应创建的实体类如下

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的文章,结果如下image.png

查询没有问题,接下来我们再试一下创建

image.png

可以看见已经创建成功了,返回了id,接下来我们拿着这个id去solr admin页面查一下

image.png

看起来没有任何问题,ok,今天就到这里,晚安!

发表评论
匿名  
用户评论
暂无评论