Spring Boot and RESTful API(13)Spring Data SOLR and Partial Update

本文介绍如何使用SpringData SOLR进行文档的部分更新,并展示了如何为SOLR Cloud环境创建定制化的存储库接口及其实现。
Spring Boot and RESTful API(13)Spring Data SOLR and Partial Update

How to use Spring Data SOLR to query on SOLR7 Cloud

Because cloud has different Collection name, so I need another POJO to host the Annotation
package com.sillycat.jobsmonitorapi.domain;

import org.apache.solr.client.solrj.beans.Field;
import org.springframework.data.annotation.Id;
import org.springframework.data.solr.core.mapping.SolrDocument;

@SolrDocument(solrCoreName = "allJobs")
public class JobCloud {

@Id
@Field
private String id;

@Field("source_id")
private Integer sourceID;

@Field("campaign_id")
private Integer campaignID;

@Field("job_reference")
private String jobReference;

private Boolean paused;

@Field("daily_capped")
private Boolean dailyCapped;

private Boolean deduped;

private Boolean expired;

public JobCloud() {

}

public JobCloud(String id, Integer sourceID, Integer campaignID, String jobReference, Boolean paused,
Boolean dailyCapped, Boolean deduped, Boolean expired) {
this.id = id;
this.sourceID = sourceID;
this.campaignID = campaignID;
this.jobReference = jobReference;
this.paused = paused;
this.dailyCapped = dailyCapped;
this.deduped = deduped;
this.expired = expired;
}

…snip… getter and setter

@Override
public String toString() {
return "JobCloud [id=" + id + ", sourceID=" + sourceID + ", campaignID=" + campaignID + ", jobReference="
+ jobReference + ", paused=" + paused + ", dailyCapped=" + dailyCapped + ", deduped=" + deduped
+ ", expired=" + expired + "]";
}

}

Then the interface will work for us
package com.sillycat.jobsmonitorapi.repository;

import java.util.List;

import org.springframework.data.solr.repository.Query;
import org.springframework.data.solr.repository.SolrCrudRepository;
import org.springframework.stereotype.Repository;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

@Repository
public interface JobCloudRepositorySolr extends SolrCrudRepository<JobCloud, String> {

@Query(fields = { "id", "source_id", "campaign_id", "job_reference", "paused", "daily_capped", "deduped",
"expired" })
List<JobCloud> findBySourceID(Integer sourceID);

@Query(fields = { "id", "source_id", "campaign_id", "job_reference", "paused", "daily_capped", "deduped",
"expired" })
List<JobCloud> findByCampaignID(Integer campaignID);

@Query
int countByCampaignID(Integer campaignID);

}

Then the unit test can run that
package com.sillycat.jobsmonitorapi.repository;

import java.util.List;
import org.apache.http.util.Asserts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.Assert;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

/**
*
* mvn -Dspring.profiles.active=cloud -Dtest=JobCloudRepositorySolrTest test
*
* @author carl
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class JobCloudRepositorySolrTest {

@Autowired
JobCloudRepositorySolr jobCloudRepositorySolr;

@Test
public void dummy() {
Asserts.notEmpty("Good", "Good dummy.");
}

@Test
public void queryBySourceID() throws Exception {
List<JobCloud> jobs = jobCloudRepositorySolr.findBySourceID(529);
Assert.notEmpty(jobs, "Fail to queryBySourceID from SOLR");
List<JobCloud> jobEmptys = jobCloudRepositorySolr.findBySourceID(9529);
Assert.isTrue(jobEmptys.isEmpty(), "Fail to filter out other sourceID");
}

}

Partial Update
We need to implement the interface ourself.
package com.sillycat.jobsmonitorapi.repository;

import java.util.List;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

public interface JobCloudPartialRepositorySolr {

public void update(JobCloud job, Boolean commit);

public void updateAll(List<JobCloud> jobs, Boolean commit);
}

The implementation is easy in DATA-SOLR
package com.sillycat.jobsmonitorapi.repository;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.PartialUpdate;
import org.springframework.stereotype.Repository;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

@Repository
public class JobCloudPartialRepositorySolrImpl implements JobCloudPartialRepositorySolr {

private static final String COLLECTION_NAME = "allJobs";

@Resource
private SolrTemplate solrTemplate;

public void update(JobCloud job, Boolean commit) {
PartialUpdate update = new PartialUpdate("id", job.getId());

update.add("source_id", job.getSourceID());
update.add("campaign_id", job.getCampaignID());
update.add("job_reference", job.getJobReference());
update.add("paused", job.getPaused());
update.add("daily_capped", job.getDailyCapped());
update.add("deduped", job.getDeduped());
update.add("expired", job.getExpired());

solrTemplate.saveBean(COLLECTION_NAME, update);
if (commit) {
solrTemplate.commit(COLLECTION_NAME);
}
}

public void updateAll(List<JobCloud> jobs, Boolean commit) {
List<PartialUpdate> updates = new ArrayList<PartialUpdate>();
for (int i = 0; i < jobs.size(); i++) {
JobCloud job = jobs.get(i);
PartialUpdate update = new PartialUpdate("id", job.getId());
update.add("source_id", job.getSourceID());
update.add("campaign_id", job.getCampaignID());
update.add("job_reference", job.getJobReference());
update.add("paused", job.getPaused());
update.add("daily_capped", job.getDailyCapped());
update.add("deduped", job.getDeduped());
update.add("expired", job.getExpired());
updates.add(update);
}
solrTemplate.saveBeans(COLLECTION_NAME, updates);
if (commit) {
solrTemplate.commit(COLLECTION_NAME);
}
}

}

This unit test can cover that.
package com.sillycat.jobsmonitorapi.repository;

import org.apache.http.util.Asserts;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.sillycat.jobsmonitorapi.domain.JobCloud;

/**
*
* mvn -Dspring.profiles.active=cloud -Dtest=JobCloudPartialRepositorySolrTest
* test
*
* @author carl
*
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class JobCloudPartialRepositorySolrTest {

@Autowired
JobCloudPartialRepositorySolr jobCloudPartialRepositorySolr;

@Test
public void dummy() {
Asserts.notEmpty("Good", "Good dummy.");
}

@Test
public void save() {
JobCloud jobCloud = new JobCloud("4689886470", 5639, 9240, "248b74f29637014594709f3358f201ce", false, false, false, false);
jobCloudPartialRepositorySolr.update(jobCloud, true);
}
}


References:
http://sillycat.iteye.com/blog/2379731 Spring Boot and Spring Data SOLR

https://github.com/spring-projects/spring-data-solr/blob/master/README.md

https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-crud-almost/
https://www.petrikainulainen.net/programming/solr/spring-data-solr-tutorial-adding-custom-methods-to-a-single-repository/
https://lucene.apache.org/solr/guide/7_1/updating-parts-of-documents.html
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值