Solr官方提供了对于不同客户端的例子,详见SolrJ官方文档
一、引入pom文件
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>${solr.version}</version>
</dependency>
二、创建solr中对应的实体类-SolrUserEntity,对于solr中的Field需要加入@Field注解
/**
* 用来对应solr中的实体
* @author jacksparrow414
* @date 2020-05-03
* @description: TODO
*/
public class SolrUserEntity {
@Field
private String userId;
@Field
private String name;
@Field
private Long age;
// 省略get、set方法
...
@Override
public String toString() {
return "SolrUserEntity{" +
"userId='" + userId + '\'' +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
三、使用SolrJ进行添加、更新、删除、查询操作
1、提供一个统一获取SolrClient的工具类,所有与solr的操作均使用一个SolrClient
/**
* @author jacksparrow414
* @date 2020-05-03
* @description: TODO
*/
class SolrUtil {
private static SolrClient solrClient=null;
static SolrClient getSolrClient(){
if (ObjectUtil.isNull(solrClient)){
synchronized(SolrUtil.class){
if (ObjectUtil.isNull(solrClient)){
String solrUrl = "http://localhost:8983/solr";
solrClient = new HttpSolrClient.Builder(solrUrl)
.withConnectionTimeout(10000)
.withSocketTimeout(6000)
.build();
}
}
}
return solrClient;
}
}
2、创建SolrService类,完成对cusdomData的操作
/**
* @author jacksparrow414
* @date 2020-05-03
* @description: TODO
*/
@Service
public class SolrService {
private final String SOLR_CORE = "customData";
private final SolrClient solrClient = SolrUtil.getSolrClient();
/**
* 向solr中添加数据
* 第一种方式
* @throws Exception
*/
public void insertDataToSolr() throws Exception{
SolrInputDocument solrInputDocument = new SolrInputDocument();
solrInputDocument.addField("userId","31234738");
solrInputDocument.addField("name","testInsert");
solrInputDocument.addField("age",19);
UpdateResponse updateResponse = solrClient.add(SOLR_CORE,solrInputDocument);
// 最后必须提交
solrClient.commit(SOLR_CORE);
solrClient.close();
}
/**
* 向solr中添加数据
* 第二种方式
* @throws Exception
*/
public void insertDataToSolrByBean() throws Exception{
SolrUserEntity entity = new SolrUserEntity();
entity.setUserId("1977362");
entity.setName("我的");
entity.setAge(18L);
solrClient.addBean(SOLR_CORE,entity);
solrClient.commit(SOLR_CORE);
solrClient.close();
}
/**
* 更新solr中的数据
* @throws Exception
*/
public void updateDataToSolrByBean() throws Exception{
SolrUserEntity updateEntity = new SolrUserEntity();
updateEntity.setUserId("31234738");
updateEntity.setName("update");
updateEntity.setAge(56L);
solrClient.addBean(SOLR_CORE,updateEntity);
solrClient.commit(SOLR_CORE);
solrClient.close();
}
/**
* 从solr中查询数据
* 第一种方式
* @throws Exception
*/
public void queryDataFromSolr()throws Exception{
Map<String,String> queryMap = CollectionUtil.newHashMap(16);
queryMap.put("q","*:*");
queryMap.put("sort","age desc");
MapSolrParams mapSolrParams = new MapSolrParams(queryMap);
QueryResponse queryResponse = solrClient.query(SOLR_CORE,mapSolrParams);
List<SolrUserEntity> beans = queryResponse.getBeans(SolrUserEntity.class);
beans.forEach(System.out::println);
solrClient.close();
}
/**
* 从solr中查询数据
* 第二种方式
* @throws Exception
*/
public void queryDataFromSolrBySolrQuery() throws Exception{
SolrQuery solrQuery = new SolrQuery("userId:1977362");
solrQuery.addField("userId");
solrQuery.addField("name");
solrQuery.setSort("userId", SolrQuery.ORDER.desc);
List<SolrUserEntity> entities = solrClient.query(SOLR_CORE,solrQuery)
.getBeans(SolrUserEntity.class);
entities.forEach(System.out::println);
solrClient.close();
}
/**
* 根据查询条件删除solr中的数据
* @throws Exception
*/
public void deleteDataFromSolr()throws Exception{
solrClient.deleteByQuery(SOLR_CORE, "name:update");
solrClient.commit(SOLR_CORE);
solrClient.close();
}
}
说明:solr提供了两种对数据CRUD的方式,一种不需要实体类,另一种需要对应的实体类,并需要@Field注解。
个人建议使用实体类方式,结合实际业务场景来看,一般的业务顺序基本如下:
接收前端JSON数据->将JSON数据转换为对应的实体类->入MySQL数据库表->更新Solr中对应的core
所以直接使用前面的实体即可,从上面的例子也可以看出,添加/更新实体类基本只需要调用addBean即可,此外solr还提供很丰富的其他方法,addBeans-批量添加/更新、deleteById-更加ID删除等
注意:solrClient.commit()时候需要指定对应的core,提交完毕之后关闭客户端连接
四、在solr控制台验证对数据的操作是否生效
可以看到solr控制台已经插入了上面方法里的数据,IDE中通过SolrJ查询到刚才插入的数据
上述示例工程代码已放到GitHub,如有需要,请自取。