zoukankan      html  css  js  c++  java
  • 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;
        }
    
    }
  • 相关阅读:
    推荐一款超好用的工具cmder
    golang初探与命令源码分析
    LAMP环境部署物联网项目
    linux上安装LAMP笔记
    scrapy实战--爬取最新美剧
    scrapy实战--爬取报刊名称及地址
    scrapy简单入门及选择器(xpathcss)
    phantomJs页面截图
    eclipse工具的安装配置
    BeautifulSoup爬虫基础知识
  • 原文地址:https://www.cnblogs.com/Transkai/p/11019241.html
Copyright © 2011-2022 走看看