Solr第二讲——SolrJ客户端的使用与案例

时间:2023-03-09 03:30:50
Solr第二讲——SolrJ客户端的使用与案例

一、Solrj的使用

  1.什么是Solrj

  solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:

  Solr第二讲——SolrJ客户端的使用与案例

  2.如何使用

    需要的是solrj的包与拓展服务包

    Solr第二讲——SolrJ客户端的使用与案例

    使用solrj完成索引的维护:

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

      添加/修改索引:   

    1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。

    2、 创建SolrInputDocument对象,然后通过它来添加域。

    3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。

    4、 提交。

@Test
public void addDocument() throws Exception { // 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/");
// 2、 创建SolrInputDocument对象,然后通过它来添加域。
SolrInputDocument document = new SolrInputDocument();
// 第一个参数:域的名称,域的名称必须是在schema.xml中定义的
// 第二个参数:域的值
// 注意:id的域不能少
document.addField("id", "c0001");
document.addField("title_ik", "使用solrJ添加的文档");
document.addField("content_ik", "文档的内容");
document.addField("product_name", "商品名称");
// 3、 通过HttpSolrServer对象将SolrInputDocument添加到索引库。
server.add(document);
// 4、 提交。
server.commit();
}

      在界面查询索引查看效果:使用域名:名称,例如 id:c001的格式

    Solr第二讲——SolrJ客户端的使用与案例

      根据ID删除索引

@Test
public void deleteDocument() throws Exception {
// 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer(
"http://localhost:8080/solr/");
// 根据ID删除
server.deleteById("c0001");
// 提交
server.commit();
}

      根据条件删除

@Test
public void deleteDocumentByQuery() throws Exception {
// 1、 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer(
"http://localhost:8080/solr/");
// 根据ID删除
server.deleteByQuery("id:c0001");
// 全部删除
// server.deleteByQuery("*:*");
// 提交
server.commit();
}

      查询索引

@Test
public void queryIndex() throws Exception {
// 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer(
"http://localhost:8080/solr/"); // 创建SolrQuery对象
SolrQuery query = new SolrQuery();
// 设置查询条件,名称“q”是固定的且必须 的
query.set("q", "id:2"); // 调用server的查询方法,查询索引库
QueryResponse response = server.query(query); // 查询结果
SolrDocumentList results = response.getResults(); // 查询结果总数
long cnt = results.getNumFound();
System.out.println("查询结果总数:" + cnt); for (SolrDocument solrDocument : results) {
System.out.println(solrDocument.get("id"));
System.out.println(solrDocument.get("product_name"));
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog_name"));
System.out.println(solrDocument.get("product_picture")); }
}

      复杂查询

@Test
public void queryIndex2() throws Exception {
// 创建HttpSolrServer对象,通过它和Solr服务器建立连接。
// 参数:solr服务器的访问地址
HttpSolrServer server = new HttpSolrServer("http://localhost:8080/solr/"); // 创建SolrQuery对象
SolrQuery query = new SolrQuery(); // 设置查询条件
query.setQuery("钻石");
// 设置过滤条件
query.setFilterQueries("product_catalog_name:幽默杂货");
// 设置排序
query.setSort("product_price", ORDER.desc);
// 设置分页信息
query.setStart(0);
query.setRows(10); // 设置显得的域的列表
query.setFields("id", "product_name", "product_price",
"product_catalog_name", "product_picture"); // 设置默认搜索域
query.set("df", "product_name"); // 设置高亮
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<em>");
query.setHighlightSimplePost("</em>"); // 调用server的查询方法,查询索引库
QueryResponse response = server.query(query); // 查询结果
SolrDocumentList results = response.getResults(); // 查询结果总数
long cnt = results.getNumFound();
System.out.println("查询结果总数:" + cnt); for (SolrDocument solrDocument : results) {
System.out.println(solrDocument.get("id")); String productName = (String) solrDocument.get("product_name"); //获取高亮列表
Map<String, Map<String, List<String>>> highlighting = response
.getHighlighting();
//获得本文档的高亮信息
List<String> list = highlighting.get(solrDocument.get("id")).get(
"product_name");
//如果有高亮,则把商品名称赋值为有高亮的那个名称
if (list != null) {
productName = list.get(0);
} System.out.println(productName);
System.out.println(solrDocument.get("product_price"));
System.out.println(solrDocument.get("product_catalog_name"));
System.out.println(solrDocument.get("product_picture")); }
}