solr<三> Java 操作 solr query + facet

1:查询
       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("<font color="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 TO end],start与end是相应数据格式的值的字符串形式,“TO”     一定要保持大写!
 
2:  读取查询结果
       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);
                            }
                     }
 
3:  Facet的一个应用:自动补全
       //prefix为前缀,min为最大返回结果数
       public static String[] autoComplete(String prefix, int min) {
              String words[] = null;
              StringBuffer sb = new StringBuffer("");
              SolrQuery query = new SolrQuery("*.*");
              QueryResponse rsp= new QueryResponse();
              //Facet为solr中的层次分类查询
              try {
                     query.setFacet(true);
                     query.setQuery("*:*");
                     query.setFacetPrefix(prefix);
                     query.addFacetField("title");
                     rsp = solr.query(query);
              } catch (Exception e) {
                     // TODO: handle exception
                     e.printStackTrace();
                     return null;
              }
             
              if(null != rsp){
                     FacetField ff = rsp.getFacetField("title");
                     List<Count> countList = ff.getValues();
                     if(null == countList){
                            return null;
                     }
                     for(int i=0; i<countList.size(); i++){
                            String tmp[] = countList.get(i).toString().split(" ");
                            //排除单个字
                            if(tmp[0].length()< 2){
                                   continue;
                            }
                            sb.append(tmp[0] + " ");
                            min--;
                            if(min == 0){
                                   break;
                            }
                     }
                     words = sb.toString().split(" ");
              }else{
                     return null;
              }
              return words;
       }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值