zoukankan      html  css  js  c++  java
  • solrJ的查询->统计【转】

      1 package com.fjsh.SearchJobsFirst;  
      2   
      3 import java.text.SimpleDateFormat;  
      4 import java.util.Calendar;  
      5 import java.util.Date;  
      6 import java.util.GregorianCalendar;  
      7 import java.util.HashMap;  
      8 import java.util.Iterator;  
      9 import java.util.LinkedHashMap;  
     10 import java.util.List;  
     11 import java.util.Map;  
     12 import java.util.Map.Entry;  
     13   
     14 import javax.swing.RepaintManager;  
     15 import javax.swing.text.html.parser.Entity;  
     16   
     17 import org.apache.solr.client.solrj.SolrQuery;  
     18 import org.apache.solr.client.solrj.SolrServer;  
     19 import org.apache.solr.client.solrj.SolrServerException;  
     20 import org.apache.solr.client.solrj.impl.HttpSolrServer;  
     21 import org.apache.solr.client.solrj.response.FacetField;  
     22 import org.apache.solr.client.solrj.response.FacetField.Count;  
     23 import org.apache.solr.client.solrj.response.Group;  
     24 import org.apache.solr.client.solrj.response.GroupCommand;  
     25 import org.apache.solr.client.solrj.response.GroupResponse;  
     26 import org.apache.solr.client.solrj.response.QueryResponse;  
     27 import org.apache.solr.common.SolrDocument;  
     28 import org.apache.solr.common.SolrDocumentList;  
     29 import org.apache.solr.common.params.GroupParams;  
     30 import org.apache.solr.common.params.ModifiableSolrParams;  
     31 /** 
     32  * @Project JobsOtherWebSearch 
     33  * @Package com.fjsh.SearchJobsFirst 
     34  * @ClassName: SearchJobs  
     35  * @Author fjsh 
     36  * @Description: 对solr中的各个功能进行测试 
     37  * @Date 2014-3-5 下午3:38:09  
     38  */  
     39   
     40 public class SearchJobs {  
     41     private static String url = "jdbc:sqlserver://192.168.2.106:1433;DatabaseName=JobsOtherweb51jobDB";  
     42     private static String user = "sa";  
     43     private static String password = "sa";  
     44     private String Corenum;  
     45     public static int JobsId = 219443;// start jobsid  
     46     public SolrServer solrServer = null;// new  
     47                                         // HttpSolrServer("http://192.168.2.100:8080/solr/JobsOtherWeb1");  
     48   
     49     // 1、 创建solrserver对象:  
     50     public SolrServer createSolrServer() {  
     51         HttpSolrServer solr = null;  
     52         try {  
     53             solr = new HttpSolrServer(  
     54                     "http://192.168.2.106:8080/solr/JobsOtherWeb0");  
     55             solr.setConnectionTimeout(100);  
     56             solr.setDefaultMaxConnectionsPerHost(100);  
     57             solr.setMaxTotalConnections(100);  
     58         } catch (Exception e) {  
     59             System.out.println("请检查tomcat服务器或端口是否开启!");  
     60             e.printStackTrace();  
     61         }  
     62         return solr;  
     63     }  
     64   
     65     // 简单的查询,取出二十个  
     66     public void querytop20() {  
     67         solrServer = createSolrServer();  
     68         System.out.println("简单查询取出前二十个");  
     69         String dtStart = new SimpleDateFormat("yyyyMMddHHmmssSSS")  
     70                 .format(new Date());  
     71         System.out.println("开始时间:" + dtStart + "
    ");  
     72         try {  
     73             SolrQuery query = new SolrQuery();// 查询  
     74             query.setQuery("jobsName:计算机");  
     75             query.setRows(20);  
     76             SolrDocumentList docs = solrServer.query(query).getResults();  
     77             for (SolrDocument sd : docs) {  
     78                 System.out.println(sd.getFieldValue("jobsName"));  
     79                 System.out.println(sd.getFieldValue("publishDate"));  
     80             }  
     81             solrServer.shutdown();  
     82             String dtEnd = new SimpleDateFormat("yyyyMMddHHmmssSSS")  
     83                     .format(new Date());  
     84             System.out.println(query);  
     85         } catch (SolrServerException e) {  
     86             // TODO Auto-generated catch block  
     87             e.printStackTrace();  
     88         }  
     89     }  
     90   
     91     // 删除索引  
     92     // 据查询结果删除:  
     93     public void DeleteByQuery() {  
     94         solrServer = createSolrServer();  
     95         try {  
     96             // 删除所有的索引  
     97             solrServer.deleteByQuery("jobsName:高级技术支持");  
     98             solrServer.commit();  
     99         } catch (Exception e) {  
    100             e.printStackTrace();  
    101         }  
    102     }  
    103   
    104     // 根据索引号删除索引:  
    105     public void DeleteByQueryJobsId() {  
    106         solrServer = createSolrServer();  
    107         try {  
    108             solrServer.deleteById("515792");  
    109             solrServer.commit();  
    110         } catch (Exception e) {  
    111             e.printStackTrace();  
    112         }  
    113     }  
    114   
    115     // 查询  
    116     // SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。  
    117     // 补充一下范围查询的格式:[star t TO end],start与end是相应数据格式的值的字符串形式,“TO” 一定要保持大写!  
    118     /* 
    119      * field 查询的字段名称数组 key 查询的字段名称对应的值 start 查询的起始位置 count 一次查询出来的数量 sortfield 
    120      * 需要排序的字段数组 flag 需要排序的字段的排序方式如果为true 升序 如果为false 降序 hightlight 是否需要高亮显示 
    121      */  
    122     public QueryResponse Search(String[] field, String[] key, int start,  
    123             int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {  
    124         solrServer = createSolrServer();  
    125         // 检测输入是否合法  
    126         if (null == field || null == key || field.length != key.length) {  
    127             return null;  
    128         }  
    129         if (null == sortfield || null == flag  
    130                 || sortfield.length != flag.length) {  
    131             return null;  
    132         }  
    133   
    134         SolrQuery query = null;  
    135         try {  
    136             // 初始化查询对象  
    137             query = new SolrQuery(field[0] + ":" + key[0]);  
    138             for (int i = 0; i < field.length; i++) {  
    139                 query.addFilterQuery(field[i] + ":" + key[i]);  
    140             }  
    141             // 设置起始位置与返回结果数  
    142             query.setStart(start);  
    143             query.setRows(count);  
    144             // 设置排序  
    145             for (int i = 0; i < sortfield.length; i++) {  
    146                 if (flag[i]) {  
    147                     query.addSortField(sortfield[i], SolrQuery.ORDER.asc);  
    148                 } else {  
    149                     query.addSortField(sortfield[i], SolrQuery.ORDER.desc);  
    150                 }  
    151             }  
    152             // 设置高亮  
    153             if (null != hightlight) {  
    154                 query.setHighlight(true); // 开启高亮组件  
    155                 query.addHighlightField("jobsName");// 高亮字段  
    156                 query.setHighlightSimplePre("<font color="red">");// 标记  
    157                 query.setHighlightSimplePost("</font>");  
    158                 query.setHighlightSnippets(1);// 结果分片数,默认为1  
    159                 query.setHighlightFragsize(1000);// 每个分片的最大长度,默认为100  
    160   
    161             }  
    162         } catch (Exception e) {  
    163             e.printStackTrace();  
    164         }  
    165   
    166         QueryResponse rsp = null;  
    167         try {  
    168             rsp = solrServer.query(query);  
    169         } catch (Exception e) {  
    170             e.printStackTrace();  
    171             return null;  
    172         }  
    173         // 返回查询结果  
    174         return rsp;  
    175     }  
    176   
    177     // Facet的一个应用:自动补全  
    178     // prefix为前缀,min为最大返回结果数  
    179     // field需要查询并返回不全的字段,prefix需要查询并返回的字段不全值  
    180   
    181     public String[] autoComplete(String field, String prefix, int min) {  
    182         /*------------第一处标记------------------------*/  
    183         solrServer = createSolrServer();  
    184         String words[] = null;  
    185         StringBuffer sb = new StringBuffer("");  
    186         SolrQuery query = new SolrQuery(field + ":" + prefix);  
    187         QueryResponse rsp = new QueryResponse();  
    188         // Facet为solr中的层次分类查询  
    189         /*------------第二处标记:程序从第一处标记执行到这里需要300ms所以将上面的代码进行实例化最好------------------------*/  
    190         try {  
    191             query.setFacet(true);  
    192             // query.setQuery("*:*");  
    193             query = new SolrQuery(field + ":" + prefix);  
    194             query.setFacetPrefix(prefix);  
    195             query.addFacetField(field);  
    196             rsp = solrServer.query(query);  
    197             /*------------第三处标记:程序从第二处标记执行到这里需要200ms但此处很难再进行优化,由于查询的复杂性------------------------*/  
    198         } catch (Exception e) {  
    199             // TODO: handle exception  
    200             e.printStackTrace();  
    201             return null;  
    202         }  
    203         if (null != rsp) {  
    204             FacetField ff = rsp.getFacetField(field);  
    205             List<Count> countList = ff.getValues();  
    206             if (null == countList) {  
    207                 return null;  
    208             }  
    209             for (int i = 0; i < countList.size(); i++) {  
    210                 String tmp[] = countList.get(i).toString().split(" ");  
    211                 // 排除单个字  
    212                 if (tmp[0].length() < 2) {  
    213                     continue;  
    214                 }  
    215                 sb.append(tmp[0] + " ");  
    216                 min--;  
    217                 if (min == 0) {  
    218                     break;  
    219                 }  
    220             }  
    221             words = sb.toString().split(" ");  
    222         } else {  
    223             return null;  
    224         }  
    225         return words;  
    226     }  
    227     /** 
    228      * @Author fjsh 
    229      * @Title SearchGroup 
    230      * @Description 按group进行查找 
    231      * @param QUERY_CONTENT 查询内容 
    232      * @param QUERY_ROWS 查找的数量,默认是10 
    233      * @param GROUP true or false 是否按group查询 
    234      * @param GROUP_FIELD 查询field 
    235      * @param GROUP_LIMIT The number of results (documents) to return for each group. Defaults to 1 
    236      * @Return void 
    237      * @Throws  
    238      * @Date 2014-5-7 
    239      * 输出结果的时候,由于定义的数据索引没有做很好是调整,显示的结果并不理想,不过此方法可以作为参考 
    240      */  
    241     public void SearchGroup(String QUERY_CONTENT,int QUERY_ROWS, Boolean GROUP, String GROUP_FIELD,String GROUP_LIMIT) {  
    242          SolrServer server = createSolrServer();    
    243          SolrQuery param = new SolrQuery();    
    244          param.setQuery("jobsName:"+QUERY_CONTENT);    
    245          param.setRows(QUERY_ROWS);    
    246          param.setParam(GroupParams.GROUP, GROUP);    
    247          param.setParam(GroupParams.GROUP_FIELD, GROUP_FIELD);            
    248          param.setParam(GroupParams.GROUP_LIMIT, GROUP_LIMIT);    
    249          QueryResponse response = null;    
    250          try {    
    251              response = server.query(param);    
    252          } catch (SolrServerException e) {    
    253             // logger.error(e.getMessage(), e);    
    254          }    
    255          Map<String, Integer> info = new HashMap<String, Integer>();    
    256          GroupResponse groupResponse = response.getGroupResponse();    
    257          if(groupResponse != null) {    
    258              List<GroupCommand> groupList = groupResponse.getValues();    
    259              for(GroupCommand groupCommand : groupList) {    
    260                  List<Group> groups = groupCommand.getValues();    
    261                  for(Group group : groups) {    
    262                      info.put(group.getGroupValue(), (int)group.getResult().getNumFound());   
    263                      System.out.println(group.getGroupValue()+"---"+group.getResult().getNumFound());  
    264                  }    
    265              }    
    266          }    
    267     }  
    268   
    269     /* 
    270      * 介绍了一下facet之后,来说说怎么实现facet。facet的实现其实很简单,主要在搜索参数上带上就OK。 
    271      *  
    272      * facet=on/true #代表开启facet facet.field=cate #代表要统计的面(分组),比如上面的分类,品牌,可以多次出现 
    273      * facet.limit =20 #每个分组最多返回条数 facet.mincount = 1 #这个表示分组下某一条目的最小数据量 
    274      * facet.missing = on/true #统计null的值 facet.method = #默认为fc, fc表示Field Cache 
    275      * 比如 
    276      * :http://localhost/product/select/?q=铁观音&facet=on&facet.field=category&facet 
    277      * .field=brand&facet.mincount=1在搜索结果中返回xml的facet结果 
    278      *  
    279      *  
    280      * view sourceprint? 01 <lst name="facet_counts"> 02 <lst 
    281      * name="facet_queries"/> 03 <lst name="facet_fields"> 04 <lst 
    282      * name="category"> 05 <int name="2742">64</int> 06 <int name="793">48</int> 
    283      * 07 <int name="2741">12</int> 08 <int name="801">6</int> 09 <int 
    284      * name="1087">1</int> 10 </lst> 11 <lst name="brand"> 12 <int 
    285      * name="229">74</int> 13 <int name="227">16</int> 14 <int 
    286      * name="270">13</int> 15 <int name="317">10</int> 16 <int name="0">4</int> 
    287      * 17 <int name="165">4</int> 18 <int name="203">3</int> 19 <int 
    288      * name="147">2</int> 20 <int name="166">2</int> 21 <int name="217">1</int> 
    289      * 22 <int name="342">1</int> 23 <int name="343">1</int> 24 </lst> 25 </lst> 
    290      * <lst name="category"> 分组名 <int name="2742">64</int> 
    291      * 分组内条目,name表示条目,64是统计结果数。 
    292      *  
    293      *  
    294      *  
    295      *  
    296      * Date Facet 日期类型的字段在文档中很常见 , 如商品上市时间 , 货物出仓时间 , 书籍上架时间等等 . 某些情况下需要针对这些字段进行 
    297      * Facet. 不过时间字段的取值有无限性 , 用户往往关心的不是某个时间点而是某个时间段内的查询统计结果 . Solr 
    298      * 为日期字段提供了更为方便的查询统计方式 . 当然 , 字段的类型必须是 DateField( 或其子类型 ). 需要注意的是 , 使用 Date 
    299      * Facet 时 , 字段名 , 起始时间 , 结束时间 , 时间间隔这 4 个参数都必须提供 . 与 Field Facet 类似 ,Date 
    300      * Facet 也可以对多个字段进行 Facet. 并且针对每个字段都可以单独设置参数 . 2.1 facet.date 该参数表示需要进行 Date 
    301      * Facet 的字段名 , 与 facet.field 一样 , 该参数可以被设置多次 , 表示对多个字段进行 Date Facet. 2.2 
    302      * facet.date.start 起始时间 , 时间的一般格式为 ” 1995-12-31T23:59:59Z”, 另外可以使用 
    303      * ”NOW”,”YEAR”,”MONTH” 等等 , 具体格式可以参考 org.apache.solr.schema. DateField 的 
    304      * java doc. 2.3 facet.date.end 结束时间 . 2.4 facet.date.gap 时间间隔 . 如果 start 为 
    305      * 2009-1-1,end 为 2010-1-1.gap 设置为 ”+1MONTH” 表示间隔 1 个月 , 那么将会把这段时间划分为 12 
    306      * 个间隔段 . 注意 ”+” 因为是特殊字符所以应该用 ”%2B” 代替 . 2.5 facet.date.hardend 取值可以为 
    307      * true|false, 默认为 false. 它表示 gap 迭代到 end 处采用何种处理 . 举例说明 start 为 
    308      * 2009-1-1,end 为 2009-12-25,gap 为 ”+1MONTH”,hardend 为 false 的话最后一个时间段为 
    309      * 2009-12-1 至 2010-1-1;hardend 为 true 的话最后一个时间段为 2009-12-1 至 2009-12-25. 
    310      * 2.6 facet.date.other 取值范围为 before|after|between|none|all, 默认为 none. 
    311      * before 会对 start 之前的值做统计 . after 会对 end 之后的值做统计 . between 会对 start 至 end 
    312      * 之间所有值做统计 . 如果 hardend 为 true 的话 , 那么该值就是各个时间段统计值的和 . none 表示该项禁用 . all 表示 
    313      * before,after,all 都会统计 . 举例 : &facet=on &facet.date=date 
    314      * &facet.date.start=2009-1-1T0:0:0Z &facet.date.end=2010-1-1T0:0:0Z 
    315      * &facet.date.gap=%2B1MONTH &facet.date.other=all 
    316      */  
    317     public void FacetFieldQuery() throws Exception {  
    318         solrServer = createSolrServer();  
    319         SolrQuery query = new SolrQuery();// 建立一个新的查询  
    320         query.setQuery("jobsName:计算机维护");  
    321         query.setFacet(true);// 设置facet=on  
    322         // 分类信息分为:薪水,发布时间,教育背景,工作经验,公司类型,工作类型  
    323         query.addFacetField(new String[] { "salary", "publishDate",  
    324                 "educateBackground", "jobExperience", "companytype", "jobsType" });// 设置需要facet的字段  
    325         query.setFacetLimit(10);// 限制facet返回的数量  
    326         query.setFacetMissing(false);// 不统计null的值  
    327         query.setFacetMinCount(1);// 设置返回的数据中每个分组的数据最小值,比如设置为1,则统计数量最小为1,不然不显示  
    328   
    329         // query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO 2014-04-13T00:00:00Z]");  
    330         QueryResponse response = solrServer.query(query);  
    331         System.out.println("查询时间:" + response.getQTime());  
    332         List<FacetField> facets = response.getFacetFields();// 返回的facet列表  
    333         for (FacetField facet : facets) {  
    334             System.out.println(facet.getName());  
    335             System.out.println("----------------");  
    336             List<Count> counts = facet.getValues();  
    337             for (Count count : counts) {  
    338                 System.out.println(count.getName() + ":" + count.getCount());  
    339             }  
    340             System.out.println();  
    341         }  
    342   
    343     }  
    344   
    345     // 时间片使用方法  
    346     public void FacetFieldQueryDate() throws Exception {  
    347         solrServer = createSolrServer();  
    348         SolrQuery query = new SolrQuery();// 建立一个新的查询  
    349         query.setQuery("jobsName:计算");  
    350         query.setFacet(true);// 设置facet=on  
    351         query.setFacetLimit(10);// 限制facet返回的数量  
    352         query.setFacetMissing(false);// 不统计null的值  
    353         query.setFacetMinCount(1);// 设置返回的数据中每个分组的数据最小值,比如设置为1,则统计数量最小为1,不然不显示  
    354         query.addFacetField(new String[] { "salary", "educateBackground",  
    355                 "jobExperience", "companytype", "jobsType" });// 设置需要facet的字段  
    356         // query.addFacetQuery("publishDate:[2014-04-21T00:00:00Z TO 2014-04-23T00:00:00Z]");  
    357         // query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO 2014-04-13T00:00:00Z]");  
    358         SimpleDateFormat time0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    359         SimpleDateFormat time1 = new SimpleDateFormat("yyyy-MM-dd");  
    360         SimpleDateFormat time2 = new SimpleDateFormat("HH:mm:ss");  
    361         // return  
    362         // date.getYear()+"-"+date.getMonth()+"-"+date.getDay()+"T"+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();  
    363   
    364         Calendar c = Calendar.getInstance();  
    365         c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));  
    366         Date date = c.getTime();  
    367         String dateNow = time1.format(date) + "T" + time2.format(date) + "Z";  
    368         c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));  
    369         c.add(Calendar.DATE, -1);  
    370         date = c.getTime();  
    371         // 当天  
    372         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    373                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    374         c.add(Calendar.DATE, -2);  
    375         date = c.getTime();  
    376         // 前三天  
    377         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    378                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    379         c.add(Calendar.DATE, -4);  
    380         date = c.getTime();  
    381         // 前一周  
    382         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    383                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    384         c.add(Calendar.DATE, -7);  
    385         date = c.getTime();  
    386         // 前两周  
    387         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    388                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    389         c.add(Calendar.DATE, -16);  
    390         date = c.getTime();  
    391         // 前一个月  
    392         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    393                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    394         c.add(Calendar.DATE, -30);  
    395         date = c.getTime();  
    396         // 前两个月  
    397         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    398                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    399   
    400         QueryResponse response = solrServer.query(query);  
    401         System.out.println("查询时间:" + response.getQTime());  
    402         List<FacetField> facets = response.getFacetFields();// 返回的facet列表  
    403         for (FacetField facet : facets) {  
    404             System.out.println(facet.getName());  
    405             System.out.println("----------------");  
    406             List<Count> counts = facet.getValues();  
    407             for (Count count : counts) {  
    408                 System.out.println(count.getName() + ":" + count.getCount());  
    409             }  
    410             System.out.println();  
    411         }  
    412         // 根据时间段来获取数据  
    413         Map<String, Integer> maps = response.getFacetQuery();  
    414         for (Entry<String, Integer> entry : maps.entrySet()) {  
    415             System.out.println(entry.getKey() + ":" + entry.getValue());  
    416         }  
    417   
    418     }  
    419   
    420     // 最终使用的查询方式  
    421     // SolrJ提供的查询功能比较强大,可以进行结果中查询、范围查询、排序等。  
    422     // 补充一下范围查询的格式:[star t TO end],start与end是相应数据格式的值的字符串形式,“TO” 一定要保持大写!  
    423     /* 
    424      * field 查询的字段名称数组 key 查询的字段名称对应的值 start 查询的起始位置 count 一次查询出来的数量 sortfield 
    425      * 需要排序的字段数组 flag 需要排序的字段的排序方式如果为true 升序 如果为false 降序 hightlight 是否需要高亮显示 
    426      */  
    427     public QueryResponse searchResult(String[] field, String[] key, int start,  
    428             int count, String[] sortfield, Boolean[] flag, Boolean hightlight)  
    429             throws Exception {  
    430         solrServer = createSolrServer();  
    431         // 检测输入是否合法  
    432         if (null == field || null == key || field.length != key.length) {  
    433             return null;  
    434         }  
    435           
    436   
    437         SolrQuery query = null;  
    438         try {  
    439             // 初始化查询对象  
    440             query = new SolrQuery(field[0] + ":" + key[0]);  
    441             for (int i = 0; i < field.length; i++) {  
    442                 query.addFilterQuery(field[i] + ":" + key[i]);  
    443             }  
    444             // 设置起始位置与返回结果数  
    445             query.setStart(start);  
    446             query.setRows(count);  
    447             // 设置排序  
    448             if (!(null == sortfield || null == flag  
    449                     || sortfield.length != flag.length)) {  
    450                 for (int i = 0; i < sortfield.length; i++) {  
    451                     if (flag[i]) {  
    452                         query.addSortField(sortfield[i], SolrQuery.ORDER.asc);  
    453                     } else {  
    454                         query.addSortField(sortfield[i], SolrQuery.ORDER.desc);  
    455                     }  
    456                 }  
    457             }  
    458               
    459             // 设置高亮  
    460             if (null != hightlight) {  
    461                 query.setHighlight(true); // 开启高亮组件  
    462                 query.addHighlightField("jobsName");// 高亮字段  
    463                 query.setHighlightSimplePre("<font color="red">");// 标记  
    464                 query.setHighlightSimplePost("</font>");  
    465                 query.setHighlightSnippets(1);// 结果分片数,默认为1  
    466                 query.setHighlightFragsize(1000);// 每个分片的最大长度,默认为100  
    467   
    468             }  
    469         } catch (Exception e) {  
    470             e.printStackTrace();  
    471         }  
    472         query.setFacet(true);// 设置facet=on  
    473         query.setFacetLimit(10);// 限制facet返回的数量  
    474         query.setFacetMissing(false);// 不统计null的值  
    475         query.setFacetMinCount(1);// 设置返回的数据中每个分组的数据最小值,比如设置为1,则统计数量最小为1,不然不显示  
    476         query.addFacetField(new String[] { "salary", "educateBackground",  
    477                 "jobExperience", "companytype", "jobsType" });// 设置需要facet的字段  
    478         // query.addFacetQuery("publishDate:[2014-04-21T00:00:00Z TO 2014-04-23T00:00:00Z]");  
    479         // query.addFacetQuery("publishDate:[2014-04-11T00:00:00Z TO 2014-04-13T00:00:00Z]");  
    480         SimpleDateFormat time0 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    481         SimpleDateFormat time1 = new SimpleDateFormat("yyyy-MM-dd");  
    482         SimpleDateFormat time2 = new SimpleDateFormat("HH:mm:ss");  
    483         // return  
    484         // date.getYear()+"-"+date.getMonth()+"-"+date.getDay()+"T"+date.getHours()+":"+date.getMinutes()+":"+date.getSeconds();  
    485   
    486         Calendar c = Calendar.getInstance();  
    487         c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));  
    488         Date date = c.getTime();  
    489         String dateNow = time1.format(date) + "T" + time2.format(date) + "Z";  
    490         c.setTime(time0.parse(time1.format(c.getTime()) + " 23:59:59"));  
    491         c.add(Calendar.DATE, -1);  
    492         date = c.getTime();  
    493         // 当天  
    494         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    495                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    496         c.add(Calendar.DATE, -2);  
    497         date = c.getTime();  
    498         // 前三天  
    499         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    500                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    501         c.add(Calendar.DATE, -4);  
    502         date = c.getTime();  
    503         // 前一周  
    504         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    505                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    506         c.add(Calendar.DATE, -7);  
    507         date = c.getTime();  
    508         // 前两周  
    509         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    510                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    511         c.add(Calendar.DATE, -16);  
    512         date = c.getTime();  
    513         // 前一个月  
    514         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    515                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    516         c.add(Calendar.DATE, -30);  
    517         date = c.getTime();  
    518         // 前两个月  
    519         query.addFacetQuery("publishDate:[" + time1.format(date) + "T"  
    520                 + time2.format(date) + "Z" + " TO " + dateNow + "]");  
    521   
    522         QueryResponse rsp = null;  
    523         try {  
    524             rsp = solrServer.query(query);  
    525             System.out.println("此次查询时间qtime :" + rsp.getQTime());  
    526             List<FacetField> facets = rsp.getFacetFields();// 返回的facet列表  
    527             for (FacetField facet : facets) {  
    528                 System.out.println(facet.getName());  
    529                 System.out.println("----------------");  
    530                 List<Count> counts = facet.getValues();  
    531                 for (Count countitem : counts) {  
    532                     System.out.println(countitem.getName() + ":"  
    533                             + countitem.getCount());  
    534                 }  
    535                 System.out.println();  
    536             }  
    537             // 根据时间段来获取数据  
    538             Map<String, Integer> maps = rsp.getFacetQuery();  
    539             for (Entry<String, Integer> entry : maps.entrySet()) {  
    540                 System.out.println(entry.getKey() + ":" + entry.getValue());  
    541             }  
    542             // 获取返回的结果  
    543             SolrDocumentList docs = rsp.getResults();             
    544             for (SolrDocument doc : docs) {  
    545                 System.out.println("-----");  
    546                 System.out.println(doc.getFieldValue("jobsName"));  
    547                 System.out.println(doc.getFieldValue("publishDate"));  
    548   
    549             }  
    550         } catch (Exception e) {  
    551             e.printStackTrace();  
    552             return null;  
    553         }  
    554         // 返回查询结果  
    555         return rsp;  
    556     }  
    557 }  
  • 相关阅读:
    测试PHP-FPM的工作流中的疑惑点
    摘要
    Centrifugo简单试用
    react-redux的基本用法
    PHP中使用ElasticSearch(二)
    PHP中使用ElasticSearch(一)
    Vue中的状态管理器
    Laravel数据库迁移
    快速搭建一个vue开发环境
    使用cURL尝试ElasticSearch
  • 原文地址:https://www.cnblogs.com/Lxiaojiang/p/6513047.html
Copyright © 2011-2022 走看看