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】工程中找到完整版
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("--- 查询成功 ---");
}