Solr第二讲——SolrJ客户端的使用与案例
一、Solrj的使用
1.什么是Solrj
solrj是访问Solr服务的java客户端(就像通过jedis操作redis一样),提供索引和搜索的请求方法,SolrJ通常在嵌入在业务系统中,通过SolrJ的API接口操作Solr服务,如下图:
2.如何使用
需要的是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的格式
根据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")); } }