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;
    }

}

 

posted @ 2019-06-13 20:12  Transkai  阅读(773)  评论(0编辑  收藏  举报