Solr(二)-Solrj操作Solr

一.Solrj实现索引库数据的更新
solrj的版本要和solr的版本对应. solrj是一款java操作solr的工具jar包. spring也可以很方便的整合solrj.

@Test
public void testDel() throws Exception {
    /*声明baseSolrUrl*/
    String baseSolrUrl = "http://192.168.15.30:8983/solr/solr_core";
    /*创建Builder对象, 是HttpSolrClient的内部类*/
    HttpSolrClient.Builder builder = new HttpSolrClient.Builder(baseSolrUrl);
    /*HttpSolrClient连接Solr服务的客户端对象, 不能直接创建, 需要使用Builder创建*/
    HttpSolrClient client = builder.build();
    /*根据id进行删除*/
    // UpdateResponse resp = client.deleteById("abba722b-ed52-4595-a56b-e1f0bc28130d");
    UpdateResponse resp = client.deleteByQuery("id:ec55e023-74c6-4d3f-9944-e55e27eca1d3");// q
    if(resp.getStatus() == 0) {
        client.commit();
    } else {
        client.rollback();
    }
    client.close();
}

@Test
public void testAddUpdate() throws Exception {
    /*声明baseSolrUrl*/
    String baseSolrUrl = "http://192.168.15.30:8983/solr/solr_core";
    /*创建Builder对象, 是HttpSolrClient的内部类*/
    HttpSolrClient.Builder builder = new HttpSolrClient.Builder(baseSolrUrl);
    /*HttpSolrClient连接Solr服务的客户端对象, 不能直接创建, 需要使用Builder创建*/
    HttpSolrClient client = builder.build();
    /*准备要新增或修改的数据*/
    SolrInputDocument doc = new SolrInputDocument();
    doc.addField("id", "abba722b-ed52-4595-a56b-e1f0bc28130d");
    doc.addField("product_name", "华为荣耀手机");
    doc.addField("product_price", 2999);
    /*新增和更新操作需要调用add方法*/
    client.add(doc);
    /*提交事务*/
    client.commit();
    /*关闭资源*/
    client.close();
}

二.Solrj实现索引库数据的查询

@Test
public void testQuery() throws Exception {
    /*声明baseSolrUrl*/
    String baseSolrUrl = "http://192.168.15.30:8983/solr/solr_core";
    /*创建Builder对象, 是HttpSolrClient的内部类*/
    HttpSolrClient.Builder builder = new HttpSolrClient.Builder(baseSolrUrl);
    /*HttpSolrClient连接Solr服务的客户端对象, 不能直接创建, 需要使用Builder创建*/
    HttpSolrClient client = builder.build();
    /*准备查询条件, SolrParams是一个抽象类, 所以条件对象使用其子类SolrQuery对象*/
    // SolrQuery params = new SolrQuery("*:*"); // q查询
    SolrQuery params = new SolrQuery();
    /*q: 查询条件*/
    params.setQuery("幸福一家人");
    /*df: 设置默认查询字段*/
    params.set("df", "product_name");
    /*sort: 设置排序*/
    params.setSort("product_price", SolrQuery.ORDER.desc);
    /*fl: 字段列表*/
    // params.set("fl", "id,product_name");
    /*fq: 添加过滤查询条件*/
    // params.addFilterQuery("product_price:15");
    /*start, rows: 设置分页*/
    params.setStart(5);
    params.setRows(5);
    /*hl: 设置高亮显示*/
    params.setHighlight(true);
    params.addHighlightField("product_name");
    params.setHighlightSimplePre("<span style='color:red'>");
    params.setHighlightSimplePost("</span>");
    /*查询需要调用query方法*/
    QueryResponse resp = client.query(params);
    /*处理结果*/
    SolrDocumentList results = resp.getResults();
    /*总记录数*/
    System.out.println("numFound: " + results.getNumFound());
    /*获取高亮数据*/
    Map<String, Map<String, List<String>>> hl = resp.getHighlighting();
    List<Product> list = new ArrayList<>();
    for (SolrDocument result : results) {
        Product product = new Product();
        String id = result.get("id").toString();
        product.setId(id);
        /*处理高亮数据的替换*/
        String name = result.get("product_name").toString();
        Map<String, List<String>> map = hl.get(id);
        if(map != null) {
            List<String> temp = map.get("product_name");
            if(temp != null && temp.size() > 0) {
                name = temp.get(0);
            }
        }
        product.setName(name);
        product.setCatalog(Integer.parseInt(result.get("catalog").toString()));
        product.setCatalogName(result.get("catalog_name").toString());
        product.setPrice(Double.parseDouble(result.get("product_price").toString()));
        list.add(product);
        System.out.println(product);
        System.out.println("------------------------------------------------------------");
    }
    /*关闭资源*/
    client.close();
}

三.Solrj中常用的API

1.HttpSolrClient
 HttpSolrClient, 连接solr服务器的客户端对象, 所有的增删改查操作都是通过该对象完成的.
2.Builder
 Builder, 是HttpSolrClient中的内部类, 用来构建HttpSolrClient对象.
3.SolrInputDocument
 SolrInputDocument, 表示要新增/修改的数据对象. 可以作为add方法的参数.
4.UpdateResponse
 UpdateResponse, 表示更新操作的响应对象, 通过该对象查看响应状态码.
5.SolrParams
 SolrParams, 查询时封装的参数, 是一个抽象类.
6.SolrQuery
 SolrQuery, 是SolrParams的子类, 一般用于封装查询条件.
7.QueryResponse
 QueryResponse, 查询的响应结果对象, 所有的查询结果都被封装到该对象中, 包含响应头, 响应体和高亮数据.
8.SolrDocumentList
 SolrDocumentList, QueryResponse对象调用getResults方法得到的结果对象, 用于表示查询的响应体. 继承了ArrayList.
9.SolrDocument
 SolrDocument, 表示一条文档(document).
10.DocumentObjectBinder
 DocumentObjectBinder, 是Solrj中提供的一个工具类. 可以将Document和实体类进行双向绑定. 可以将java对象转换为SolrInputDocument对象, 同时, 也可以将SolrDocument转换为java对象. 需要在实体类中通过@Field注解进行映射.

@Test
public void testDocumentObjectBinder() throws Exception {
    SolrQuery params = new SolrQuery("product_name:幸福一家人");
    QueryResponse resp = httpSolrClient.query(params);
    // 获取响应实体
    SolrDocumentList results = resp.getResults();
    // 创建DocumentObjectBinder对象
    DocumentObjectBinder binder = new DocumentObjectBinder();
    // 类型转换SolrDocumentList --> 实体类集合对象
    List<Product> list = binder.getBeans(Product.class, results);
    for (Product product : list) {
        System.out.println(product);
    }
}
/**
 * 执行solr索引库的更新操作
 *
 * @param entity
 * @param <T>
 * @return
 */
public <T> UpdateResponse update(T entity) {
    try {
        DocumentObjectBinder binder = new DocumentObjectBinder();
// 类型转换实体类对象 --> SolrInputDocument对象
        SolrInputDocument doc = binder.toSolrInputDocument(entity);
        UpdateResponse resp = httpSolrClient.add(doc);
        httpSolrClient.commit();
        return resp;
    } catch (Exception e) {
        e.printStackTrace();
        try {
            httpSolrClient.rollback();
        } catch (SolrServerException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    return null;
}

四.Solr查询练习

在web项目中实现商品信息的关键字查询, 过滤查询, 结果分页显示, 排序, 数据的高亮显示. Spring+SpringMVC+SolrJ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值