Solr solrj4与solrj-7.7.2操作solrcloud
以下为solr4的java API操作
还有HttpSolrServer类,而solr7已经是没有的了,换成Solrclient
package com.hnu.scw.util; import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrServer; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.HttpSolrServer; 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 com.hnu.scw.model.ProductModel; /** * solrj的相关开发 * @author hadoop * */ public class SolrManager { @Test public void addContent() throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, IOException, SolrServerException { //设置solr服务器的路径,默认是使用第一个core String baseURL="http://hadoop-001:8080/solr/new_core"; //如果要使用第二个collection库,那么就使用下面的链接 //String baseURL2 = "http://hadoop-001:8080/solr/new_core2"; //创建服务器连接对象 HttpSolrServer httpSolrServer=new HttpSolrServer(baseURL); SolrInputDocument solrInputDocument=new SolrInputDocument(); ProductModel productModel=new ProductModel("3","电脑","家电",111,"这是一个电脑","2011122717522515_S.jpg"); Field[] fields=ProductModel.class.getDeclaredFields(); for (Field field : fields) { String name = field.getName().substring(0, 1).toUpperCase()+field.getName().substring(1); //获取属性的名字 String type = field.getGenericType().toString(); //获取属性的类型 Method m = productModel.getClass().getMethod("get"+name); if (type.equals("class java.lang.String")) { String value = (String) m.invoke(productModel); //调用getter方法获取属性值 solrInputDocument.setField(field.getName(), value); }else { float value = (float) m.invoke(productModel); //调用getter方法获取属性值 solrInputDocument.setField(field.getName(), value); } } //进行添加 httpSolrServer.add(solrInputDocument); //进行手动提交,否则无法进行添加 httpSolrServer.commit(); } /** * 进行删除文档操作 * @throws SolrServerException * @throws IOException */ @Test public void deleteContent() throws Exception{ String baseURL = "http://hadoop-001:8080/solr/new_core"; SolrServer httpSolrServer = new HttpSolrServer(baseURL); //删除全部,第一个参数是设置需要删除的数据的域和值,第二个是执行后多久进行删除操作 //httpSolrServer.deleteByQuery("*:*",1000); //删除某个特定域的特定值的数据 httpSolrServer.deleteByQuery("id:3",1000); } /** * 修改文档内容 * 修改其实和添加是一样的,因为只要添加的ID是一样的,那么就会把原来的删除了,然后再添加一个 * @throws IOException * @throws SolrServerException */ @Test public void updateContent() throws SolrServerException, IOException{ String baseURL = "http://hadoop-001:8080/solr/new_core"; SolrServer httpSolrServer = new HttpSolrServer(baseURL); //创建新的文档对象 SolrInputDocument solrInputDocument = new SolrInputDocument(); //设置文档的域 solrInputDocument.setField("id", "haha123"); solrInputDocument.setField("name", "哈哈123"); httpSolrServer.add(solrInputDocument); } /** * 查询数据(多功能的显示处理) * @throws Exception */ @Test public void queryContent() throws Exception{ String baseURL = "http://hadoop-001:8080/solr/new_core"; SolrServer httpSolrServer = new HttpSolrServer(baseURL); //创建查询数据对象(便于设置查询条件) SolrQuery solrQuery = new SolrQuery(); //设置查询的域和值,这个在之后的项目中可以用于动态 //方法一:参数q就代表query查询 //solrQuery.set("q","pname:开开123"); //方法二:(一般使用该方法) solrQuery.setQuery("pname:台灯"); //方法三:通过设置默认域 //solrQuery.set("df", "name");//default fields //solrQuery.setQuery("开开"); //设置查询过滤条件(可以设置多个,只要域和值有改变就可以了) //solrQuery.set("fq", "id:haha123"); //filter //添加排序方式(可选内容) //solrQuery.addSort("需要排序的域",ORDER.asc);//升序 //solrQuery.addSort("需要排序的域",ORDER.desc);//降序 //设置分页处理(比如这是设置每次显示5个) solrQuery.setStart(0); solrQuery.setRows(5); //设置只查询显示指定的域和值(第二个参数可以是多个,之间用“逗号”分割) //solrQuery.set("fl", "name"); //设置某域进行高亮显示 solrQuery.setHighlight(true); solrQuery.addHighlightField("pname"); //设置高亮显示格式的前后缀 solrQuery.setHighlightSimplePre("<span style='color:red'>"); solrQuery.setHighlightSimplePost("</span"); //执行查询,获得查询结果对象 QueryResponse query = httpSolrServer.query(solrQuery); //获取查询的结果集 SolrDocumentList results = query.getResults(); //获取高亮显示的查询结果 //注意点:因为高亮的结果和正常的查询结果是不一样的,所以要进行特别的处理 Map<String, Map<String, List<String>>> highlighting = query.getHighlighting(); //遍历结果集 for (SolrDocument solrDocument : results) { String idStr = (String) solrDocument.get("id"); System.out.println("id----------------" + idStr); String nameStr = (String) solrDocument.get("pname"); System.out.println("pname----------------" + nameStr); System.out.println("===========高亮显示====================="); Map<String, List<String>> map = highlighting.get(idStr); List<String> list = map.get("pname"); String resultString = list.get(0); System.out.println("高亮结果为:-----" + resultString); } } }
以下为solrj4与solrj7操作solrcloud的比较
package com.hnu.scw.dao.impl; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.SolrQuery.ORDER; import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.CloudSolrClient; import org.apache.solr.client.solrj.impl.CloudSolrClient.Builder; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.springframework.stereotype.Repository; import com.hnu.scw.dao.SearchProductDao; import com.hnu.scw.model.ProductModel; import com.hnu.scw.model.ProductSearch; @Repository public class SearchProductDaoImpl implements SearchProductDao { // ZooKeeper地址 //private static String zkHostString = "hadoop-001:2181,hadoop-003:2181,hadoop-002:2181";//不能有空格,否则找不到hadoop-2 // 客户端连接超时时间 //private static int zkClientTimeout = 3000; // ZooKeeper连接超时时间 // private static int zkConnectTimeout = 3000; // cloudSolrServer实际 //private CloudSolrClient cloudSolrServer; @Override public List<ProductModel> searchProduct(ProductSearch productSearch) throws Exception {
//以下为solr7操作solrcloud
String defaultCollection = "new_core2"; List<String> zkHosts = new ArrayList<String>(); zkHosts.add("192.168.137.188:2181"); zkHosts.add("192.168.137.189:2181"); zkHosts.add("192.168.137.190:2181"); Optional<String> zkChroot = Optional.of("/"); //builder的构造函数需要一个List和一个Optional Builder builder = new CloudSolrClient.Builder(zkHosts, zkChroot); CloudSolrClient cloudSolrServer = builder .withConnectionTimeout(3000) .withSocketTimeout(3000) .build(); cloudSolrServer.setDefaultCollection(defaultCollection);
//以下为solr4操作solrcloud
// zkHost:zookeeper的地址列表
//String zkHost = "hadoop-001:2181,hadoop-003:2181,hadoop-002:2181";//不能有空格,否则找不到hadoop-002
// 创建一个集群的连接,应该使用CloudSolrServer创建
// CloudSolrServer solrServer = new CloudSolrServer(zkHost);
// 设置一个defaultCollection属性
// collection默认名称, 比如Solr服务器上的collection是collection_shard1_replica1, 就是去掉"_shard1_replica1"的名称
//private static String defaultCollection = "new_core8";
// solrServer.setDefaultCollection("collection2");
//cloudSolrServer.setZkClientTimeout(zkClientTimeout); // cloudSolrServer.setZkConnectTimeout(zkConnectTimeout); // cloudSo lrServer.connect();
/ / 创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
SolrQuery solrQuery = new SolrQuery(); //设置关键字 solrQuery.setQuery(productSearch.getQueryString()); //设置默认检索域 solrQuery.set("df", "keywords"); //设置过滤条件 if(null != productSearch.getCatalog_name() && !"".equals(productSearch.getCatalog_name())){ solrQuery.set("fq", "catalog_name:" + productSearch.getCatalog_name()); } if(null != productSearch.getPrice() && !"".equals(productSearch.getPrice())){ //0-9 50-* 对价格进行过滤 String[] p = productSearch.getPrice().split("-"); solrQuery.set("fq", "price:[" + p[0] + " TO " + p[1] + "]"); } // 价格排序 if ("1".equals(productSearch.getSort())) { solrQuery.addSort("price", ORDER.desc); } else { solrQuery.addSort("price", ORDER.asc); } // 分页 solrQuery.setStart(0); solrQuery.setRows(16); // 只查询指定域 solrQuery.set("fl", "id,pname,price,picture"); // 高亮 // 打开开关 solrQuery.setHighlight(true); // 指定高亮域 solrQuery.addHighlightField("pname"); // 前缀 solrQuery.setHighlightSimplePre("<span style='color:red'>"); solrQuery.setHighlightSimplePost("</span>"); //添加查询操作 // SolrQuery query = new SolrQuery("*:*"); // 执行查询 QueryResponse response = cloudSolrServer.query(solrQuery); // 文档结果集 SolrDocumentList docs = response.getResults(); Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); List<ProductModel> productModels = new ArrayList<ProductModel>(); //Map<String, Map<String, List<String>>> highlighting2 = response.getHighlighting(); for (SolrDocument doc : docs) { System.out.println(doc.get("id")); System.out.println(doc.get("price")); System.out.println(doc.get("picture")); System.out.println(doc.get("pname")); ProductModel productModel = new ProductModel(); productModel.setPid((String) doc.get("id")); productModel.setPrice((Float) doc.get("price")); productModel.setPicture((String) doc.get("picture")); Map<String, List<String>> map = highlighting.get(doc.get("id")); if (map.isEmpty()) { map=highlighting.get("1"); } List<String> list = map.get("pname"); productModel.setPname(list.get(0)); productModels.add(productModel); } return productModels; } }