当前位置: 首页 > 工具软件 > SolrJ > 使用案例 >

SolrJ初识

卜凯旋
2023-12-01

什么是solrJ

SolrJ是操作Solr的JAVA客户端,它提供了增加、修改、删除、查询Solr索引的JAVA接口。SolrJ针对Solr提供了Rest的HTTP接口进行了封装,SolrJ底层是通过使用HttpClient中的方法来完成Solr的操作。

通过SolrJ请求Solr服务,最终Solr完成索引和搜索

搭建工程

https://gitee.com/csps/csp-demo-pro.git

以下所有代码【ssm-solr】工程中找到完整版

使用solrj完成索引维护

Java对象绑定

Solr提供两个有用的接口,UpdateResponse和QueryRespronse,它们可以很方便的处理特定域的对象,可以使您的应用程序更容易被理解。SolrJ支持通过@Filed注解隐式转换文档和任何类。

每个实例变量在Java对象可以映射到一个相应的Solr字段中,使用Field注解

打开配置文件【D:\RunServer\solr_home\demo_core\conf】

<document> 
	<entity name="products"  query="select pid,pname,catalog_name,price,description,picture from products ">
			 <field column="pid" name="id"/>  
			 <field column="pname" name="prod_pname"/>  
			 <field column="catalog_name" name="prod_catalog_name"/>  
			 <field column="price" name="prod_price"/>  
			 <field column="description" name="prod_description"/>  
			 <field column="picture" name="prod_picture"/>  
	</entity> 
  </document> 

引入solrj。注:根据solr服务选择版本

<dependency>
    <groupId>org.apache.solr</groupId>
    <artifactId>solr-solrj</artifactId>
    <version>8.5.1</version>
</dependency>

对应Bean对象

@Data
public class Products {

    @Field("id")
    private Integer pid;

    @Field("prod_pname")
    private String pname;

    private Integer catalog;

    @Field("prod_catalog_name")
    private String catalogName;

    @Field("prod_price")
    private Double price;

    private Integer number;

    @Field("prod_picture")
    private String picture;

    private Date releaseTime;

    @Field("prod_description")
    private String description;
}

添加/修改索引

在solr中,索引库中都会存在一个唯一键,如果一个Doucument的id存在,则执行修改操作,如果不存在,则执行添加操作。

@Test
public void add() throws IOException, SolrServerException {
    // 1.请求连接
    String baseSolrUrl = "http://127.0.0.1:8081/solr/demo_core";
    HttpSolrClient client = new HttpSolrClient.Builder(baseSolrUrl).build();

    // 2.数据库操作
    Products p = new Products();
    p.setPid(9999);
    p.setPname("后台测试添加Solr标题");
    p.setCatalogName("测试类别");
    p.setPrice(12.5);
    p.setDescription("测试数据描述");
    p.setPicture("csp.jpg");

    // 3.执行添加操作
    UpdateResponse response = client.addBean(p);

    // 4.提交事务
    client.commit();
    client.close();

    System.out.println("--- 添加成功 ---");
}

删除索引

指定ID删除索引

@Test
public void del() throws IOException, SolrServerException {
    // 1.请求连接
    String baseSolrUrl = "http://127.0.0.1:8081/solr/demo_core";
    HttpSolrClient client = new HttpSolrClient.Builder(baseSolrUrl).build();

    // 2.数据库操作

    // 3.执行删除操作
    UpdateResponse response = client.deleteById("9999");

    // 4.提交事务
    client.commit();
    client.close();

    System.out.println("--- 删除成功 ---");
}

查询功能

简单查询

@Test
public void simpleQuery() throws IOException, SolrServerException {
    // 1.请求连接
    String baseSolrUrl = "http://127.0.0.1:8081/solr/demo_core";
    HttpSolrClient client = new HttpSolrClient.Builder(baseSolrUrl).build();

    // 2.构建查询对象
    String q = "*:*";
    SolrQuery queryParams = new SolrQuery(q);
    QueryResponse response = client.query(queryParams);

    // 3.接收结果集
    List<Products> products = response.getBeans(Products.class);
    products.stream().forEach(p -> System.out.println(p));

    // 4.提交事务
    client.commit();
    client.close();

    System.out.println("--- 查询成功 ---");
}

复杂查询

/***
 * @return: void
 * @description 模拟京东主页检索功能
 * @author SPCheng
 * @date 2020/5/24 17:03

 */
@Test
public void complexQuery() throws IOException, SolrServerException {
    // 1.请求连接
    String baseSolrUrl = "http://127.0.0.1:8081/solr/demo_core";
    HttpSolrClient client = new HttpSolrClient.Builder(baseSolrUrl).build();

    // 2.构建查询对象
    SolrQuery solrQuery = new SolrQuery();

    // 2.1设置 q
    String keyword = "";
    if (StringUtils.isEmpty(keyword)) {
        solrQuery.set("q", "*:*");
    } else {
        solrQuery.set("q", keyword);
    }

    // 2.2设置 fq
    String catalogName = "手机饰品";
    // 2.2.1 类别筛选
    if (!StringUtils.isEmpty(catalogName)) {
        solrQuery.addFilterQuery("prod_catalog_name:" + catalogName);
    }
    // 2.2.1 价格筛选
    String price_str = "1-10";
    if (!StringUtils.isEmpty(price_str)) {
        // 拆分
        String[] arrs = price_str.split("-");
        if (arrs.length == 1) {
            solrQuery.addFilterQuery("prod_price:[" + arrs[0] + " TO *]");
        } else {
            String prefix = arrs[0];
            if (StringUtils.isEmpty(prefix)) {
                prefix = "*";
            }
            solrQuery.addFilterQuery("prod_price:[" + prefix + " TO " + arrs[1] + "]");
        }
    }

    // 2.3 排序
    solrQuery.addSort("prod_price", SolrQuery.ORDER.asc);

    // 2.4 设置分页功能
    solrQuery.setStart(0);
    solrQuery.setRows(15);

    // 2.5 设置回显 作用:保护隐私域
    solrQuery.setFields("id","prod_pname","prod_catalog_name");

    // 2.6 设置默认域
    solrQuery.set("df","prod_pname");

    // 2.7 高亮设置
    solrQuery.setHighlight(true);
    solrQuery.addHighlightField("prod_pname");
    solrQuery.setHighlightSimplePre("<font color=\"red\">");
    solrQuery.setHighlightSimplePost("</font>");

    QueryResponse response = client.query(solrQuery);

    // 处理高亮数据
    Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();

    // 3.接收结果集
    List<Products> products = response.getBeans(Products.class);
    //products.stream().forEach(p -> System.out.println(p.getPname() + " :: " + p.getCatalogName() + " :: " + p.getPrice()));

    products.stream().forEach(p -> {
        Map<String, List<String>> map = highlighting.get(p.getPid());
        List<String> prod_pname = map.get("prod_pname");
        System.out.println(prod_pname == null ? p.getPname() : prod_pname.get(0) + " :: " + p.getCatalogName() + " :: " + p.getPrice());
    });

    // 4.提交事务
    client.commit();
    client.close();

    System.out.println("--- 查询成功 ---");
}
 类似资料: