solr<三> Java 操作 solr query + facet

来源:互联网 发布:java 通过ftp下载文件 编辑:程序博客网 时间:2024/06/16 05:10
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;       }

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华娱,我的老婆我自己捧 全民投资:开局我选悟空 求你们了,让朕当个昏君吧 凌队的千面保镖超A的 我不只是动作巨星 穿越三国:这个阿斗不用扶 绑定百亿物资系统后暴富古代了 遮天之凡体至尊 穿越诸天神话 重生79之我在美国开银行 首次穿越撞上氢弹是否搞错了什么 港综世界的警察 满朝奸臣,你让朕怎么当千古一帝 我的火种战舰 我在魔王城伪装怪物 女配在年代文里做万人迷 九品仙路 护林日常:开局拯救大熊猫 穿越兽世:种田驭夫乐悠悠 不灭战神 我在宝可梦世界开餐厅 爸爸,我是来当你同学的 这个主角明明很强却异常谨慎 四合院:我的穿越为啥这么陋 甩了线上男友后我被亲哭了 人在南天坐看万古 为了成为英灵我只好在历史里搞事 我成了游戏里的反派之王 离婚后,前夫每天都想上位 霍格沃茨的风与鹰翼 攻略暴君后,我抱错大腿了 我的精灵模拟器 金鸾喜嫁 人在美漫,开局枪斗术 大国科技从手机开始 人住超神,渣在诸天 斗罗之王者吕布降临 从白蛇开始诸天改命 诸天之天外降临者 屠龙之前就读过龙族的路明非 足球盛宴,从收购欧洲俱乐部开始