现在网上大部分的SolrJ使用教程都是低版本的,用的都是SolrServer这个对象,但是在SolrJ8.0.0版本里已经移除了这个类,网上资料很少,基本上找不到什么8.0版本的写法,但我的solr服务是用8.0启的,所以我还是想用solrJ8.0来操作。
打开jar包看到源码里虽然没有SolrServer类了,但有一个类叫SolrClient,所以应该是用这个类来操作了,其实按照逻辑来说,叫SolrServer比叫SolrServer更确切,因为solr是服务端,solrJ是客户端。
接下来就是new这个对象了,但是SolrClient是个抽象类,不能直接new,在Inellij idea里按ctrl+H可以看到有一个子类叫HttpSolrClient。所以应该用这个来实例化。构造函数的参数里有一个Builder。所以我们还得传一个builder进去。拿到solrClient对象后CRUD的操作跟低版本的SolrJ就完全一样了。
废话不多说,直接上完整代码。
package com.example.solrj; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrClient; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.apache.solr.common.SolrInputDocument; import org.junit.Test; import java.io.IOException; import java.util.List; import java.util.Map; /** * @Author zp * @create 2019/4/30 8:26 */ public class SolrJManager { // @Test /** * solrJ 4.10.3版本写法 */ // public void testSolrJ4Add() throws IOException, SolrServerException { // String baseUrl = "http://localhost:8983/solr/new_core"; // SolrServer solrServer = new HttpSolrServer(baseUrl); // SolrInputDocument doc = new SolrInputDocument(); // doc.setField("id", "haha"); // doc.setField("name","我多我"); // // solrServer.add(doc); // solrServer.commit(); // } @Test /** * solrJ 8.0.0版本写法 * add */ public void testSolrJ8Add() throws IOException, SolrServerException { String baseUrl = "http://localhost:8983/solr/new_core"; // 8.0版本里移除了SolrServer类,用SolrClient取代 // 其实按正常逻辑来说,用SolrClient更确切。 SolrClient solrClient = new HttpSolrClient.Builder(baseUrl).build(); SolrInputDocument doc = new SolrInputDocument(); doc.setField("id", "haha2"); doc.setField("name","solrJ8.0"); solrClient.add(doc); solrClient.commit(); } @Test /** * solrJ 8.0.0版本写法 * delete */ public void testSolrJ8Delete() throws IOException, SolrServerException { String baseUrl = "http://localhost:8983/solr/new_core"; // 8.0版本里移除了SolrServer类,用SolrClient取代 // 其实按正常逻辑来说,用SolrClient更确切。 SolrClient solrClient = new HttpSolrClient.Builder(baseUrl).build(); solrClient.deleteByQuery("id:haha2",1000); } @Test /** * solrJ 8.0.0版本写法 * update */ public void testSolrJ8Update() throws IOException, SolrServerException { String baseUrl = "http://localhost:8983/solr/new_core"; // 8.0版本里移除了SolrServer类,用SolrClient取代 // 其实按正常逻辑来说,用SolrClient更确切。 SolrClient solrClient = new HttpSolrClient.Builder(baseUrl).build(); // update 与add一致 id相同为更新 SolrInputDocument doc = new SolrInputDocument(); doc.setField("id", "haha2"); doc.setField("name","solrJ8.0222222222222"); solrClient.add(doc); solrClient.commit(); } @Test /** * solrJ 8.0.0版本写法 * query */ public void testSolrJ8Query() throws IOException, SolrServerException { String baseUrl = "http://localhost:8983/solr/new_core"; // 8.0版本里移除了SolrServer类,用SolrClient取代 // 其实按正常逻辑来说,用SolrClient更确切。 SolrClient solrClient = new HttpSolrClient.Builder(baseUrl).build(); SolrQuery solrParam = new SolrQuery(); // 关键词 第一个参数就是query solrParam.set("q","*:*"); // 上面的另一种写法 solrParam.setQuery("book_name:作文"); // 过滤条件 注意放的顺序会影响最后的结果 solrParam.set("fq","id:[* TO 559]"); // solrParam.set("fq","author_name:满分"); // 排序 solrParam.addSort("id", SolrQuery.ORDER.asc); // 分页 solrParam.setStart(0); solrParam.setRows(5); // 默认域 solrParam.set("df", "book_name"); // 只查询指定域 solrParam.set("fl", "id,book_name"); // 高亮 solrParam.setHighlight(true); solrParam.addHighlightField("book_name"); solrParam.setHighlightSimplePre("<span style='color:red'>"); solrParam.setHighlightSimplePost("</span>"); // 执行查询 QueryResponse queryResponse = solrClient.query(solrParam); SolrDocumentList results = queryResponse.getResults(); // 获取高亮结果 Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting(); for (SolrDocument doc: results) { System.out.println(doc.get("id")); System.out.println(doc.get("author_name")); System.out.println(doc.get("book_name")); System.out.println(doc.get("publish_date")); Map<String, List<String>> map = highlighting.get(doc.get("id")); List<String> book_name = map.get("book_name"); System.out.println(book_name.get(0)); System.out.println("--------------------"); } } }