• Solrj


    1、 创建solrserver对象:

    try {
    
                  solr = newCommonsHttpSolrServer("http://localhost:8983/solr");
    
                  solr.setConnectionTimeout(100);
    
                  solr.setDefaultMaxConnectionsPerHost(100);
    
                  solr.setMaxTotalConnections(100);
    
           } catch (Exception e) {
    
                  System.out.println("请检查tomcat服务器或端口是否开启!");
    
                  e.printStackTrace();
    
           }

    2、 添加索引

    Collection<SolrInputDocument>docs = newArrayList<SolrInputDocument>();
    
           for (int i = 0; i < list.size(); i++) {
    
                  Item item = list.get(i);
    
                  //设置每个字段不得为空,可以在提交索引前进行检查
    
                  if (CheckItem(item)) {
    
                         SolrInputDocument doc = new SolrInputDocument();
    
                         //在这里请注意date的格式,要进行适当的转化,上文已提到
    
                         doc.addField("id", item.getId());
    
                         …………
    
                         docs.add(doc);
    
                  }
    
           }
    
     
    
           try {
    
                  solr.add(docs);
    
                  //对索引进行优化
    
                  solr.optimize();
    
                  solr.commit();
    
           } catch (Exception e) {
    
                  e.printStackTrace();
    
           }

    3、 使用bean对象添加索引

          创建一个对应于solr索引的类别:

         

     public class Item {
    
                @Field
    
                private String id;
    
                …………
    
                public void setId(String id) {
    
                      this.id = id;
    
                }
    
                public String getId() {
    
                      return id;
    
                }
    
                …………
    
                public Item(){
    
                }
    
          }
    
     
    
          使用数据创建bean对象列表,
    
           try{
    
                 solr.addBeans(beansList);
    
                 } catch (Exception e) {
    
                        e.printStackTrace();
    
                 } finally {
    
                        try {
    
                               solr.optimize();
    
                               solr.commit();
    
                        } catch (Exception e) {
    
                               e.printStackTrace();
    
                        }
    
                 }
    
          索引提交完毕。

    4、 删除索引

          据查询结果删除:      

          

     try{
    
                        //删除所有的索引
    
                        solr.deleteByQuery("*:*");
    
                        solr.commit();
    
                 } catch (Exception e) {
    
                        e.printStackTrace();
    
                 }
    
     
    
          根据索引号删除索引:
    
          try {
    
                        solr.deleteById(ids);
    
                        solr.commit();
    
                 } catch (Exception e) {
    
                        e.printStackTrace();
    
                 }

    5、 查询

          SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。

          下面是笔者封装的一个查询函数:

          

        

      public static QueryResponse Search(String[] field, String[] key,int start,
    
                        int count, String[] sortfield, Boolean[] flag, Boolean hightlight){
    
                 //检测输入是否合法
    
                 if (null == field || null == key || field.length != key.length){
    
                        return null;
    
                 }
    
                 if (null == sortfield || null == flag || sortfield.length !=flag.length) {
    
                        return null;
    
                 }
    
                 
    
                 SolrQuery query = null;
    
                 try {
    
                        //初始化查询对象
    
                        query = new SolrQuery(field[0] + ":" + key[0]);
    
                        for (int i = 0; i < field.length; i++) {
    
                               query.addFilterQuery(field[i] + ":" + key[i]);
    
                        }
    
                        //设置起始位置与返回结果数
    
                        query.setStart(start);
    
                        query.setRows(count);
    
                        //设置排序
    
                        for(int i=0; i<sortfield.length; i++){
    
                               if (flag[i]) {
    
                                      query.addSortField(sortfield[i], SolrQuery.ORDER.asc);
    
                               } else {
    
                                      query.addSortField(sortfield[i], SolrQuery.ORDER.desc);
    
                               }
    
                        }
    
                        //设置高亮
    
                        if (null != hightlight) {
    
                               query.setHighlight(true); // 开启高亮组件
    
                               query.addHighlightField("title");// 高亮字段
    
                               query.setHighlightSimplePre("<fontcolor="red">");// 标记
    
                               query.setHighlightSimplePost("</font>");
    
                               query.setHighlightSnippets(1);//结果分片数,默认为1
    
                               query.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
    
                        }
    
                 } catch (Exception e) {
    
                        e.printStackTrace();
    
                 }
    
     
    
                 QueryResponse rsp = null;
    
                 try {
    
                        rsp = solr.query(query);
    
                 } catch (Exception e) {
    
                        e.printStackTrace();
    
                        return null;
    
                 }
    
                 //返回查询结果
    
                 return rsp;
    
          }

          补充一下范围查询的格式:[star t TOend],start与end是相应数据格式的值的字符串形式,“TO”    一定要保持大写!

    
    


     

    6、 读取查询结果

         

     DocList读取返回结果:
    
          SolrDocumentList solrList = rsp.getResults();
    
     
    
          Beans读取返回结果:
    
          List<Item> tmpLists =rsp.getBeans(Item.class);
    
     
    
          读取高亮显示结果:
    
                        rsp = Search(field, key, 0, 10, sortfield, flag, true);
    
                        if(null == rsp){
    
                               return;
    
                        }
    
                        Map<String, Map<String,List<String>>>hightlight = rsp.getHighlighting();
    
                        //Item即为上面定义的bean类
    
                        List<Item> tmpLists =rsp.getBeans(Item.class);
    
                        for (int i = 0; i < tmpLists.size(); i++){
    
                               //hightlight的键为Item的id,值唯一,我们设置的高亮字段为title
    
                               String hlString =hightlight.get(tmpLists.get(i).getId()).get("title").toString();
    
                               if (null != hlString) {
    
                                      System.out.println(hlString);
    
                               }
    
                        }


    备用,几天不用就忘了怎么用了。

  • 相关阅读:
    docker容器跑tomcat遇到的坑
    PCL 编程多个点云合成
    PCL 常用小知识
    PCL点云库中的坐标系(CoordinateSystem)
    Ubuntu14.04(64位)下gcc-linaro-arm-linux-gnueabihf交叉编译环境搭建
    Windows cmd 快捷操作
    #Pragma Pack与内存分配
    线段上的整数点个数
    基于PCL绘制模型并渲染
    rosbag数据记录及转换图片、视频
  • 原文地址:https://www.cnblogs.com/rxingyue/p/4146883.html
Copyright © 2020-2023  润新知