以下为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;
}
}