solr使用三(在实际业务中使用SolrJ)

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控制台验证对数据的操作是否生效

SolrJ使用示例

SolrJ查询示例

可以看到solr控制台已经插入了上面方法里的数据,IDE中通过SolrJ查询到刚才插入的数据

上述示例工程代码已放到GitHub,如有需要,请自取。

下一篇solr结合SpringData使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值