在开发项目中通过使用Solr所提供的Solrj(java客户端)获取索引库中的数据,这才是真正对项目起实质性作用的功能,提升平台的检索性能及检索结果的精确性

第一步,引入相关依赖的jar包

第二步,根据solrj所提供的各种查询场景实现对应的功能,直接上代码,该代码是项目中实际使用场景而编写的,主要都是根据solr查询规范实现

  1. private ReturnDTO handleData(SearchArgumentsDTO searchArgumentsDTO) {
  2. ReturnDTO returnDTO = new ReturnDTO();
  3.  
  4. String keywords = searchArgumentsDTO.getKeywords();
  5. String[] fields = searchArgumentsDTO.getFields();
  6. String[] fieldVals = searchArgumentsDTO.getFieldVals();
  7. int currentPage = searchArgumentsDTO.getCurrentPage();
  8. int pageSize = searchArgumentsDTO.getPageSize();
  9. String[] sortfields = searchArgumentsDTO.getSortfields();
  10. String[] sortTypes = searchArgumentsDTO.getSortTypes();
  11. boolean hightlight = searchArgumentsDTO.getHightlight();
  12.  
  13. String[] orField = searchArgumentsDTO.getOrField();
  14. List<String[]> orFieldVals = searchArgumentsDTO.getOrFieldVals();
  15. String[] offField = searchArgumentsDTO.getOffField();
  16. List<String[]> offFieldVals = searchArgumentsDTO.getOffFieldVals();
  17. String[] rangeField = searchArgumentsDTO.getRangeField();
  18. List<String[]> rangeFieldVals = searchArgumentsDTO.getRangeFieldVals();
  19.  
  20. boolean facetFlag = searchArgumentsDTO.getFacetFlag();
  21. String[] facetFields = searchArgumentsDTO.getFacetFields();
  22.  
  23. String collection = searchArgumentsDTO.getCollection();
  24.  
  25. if(StringUtils.isNull(collection)) collection = "CIPBook";
  26.  
  27. SolrServerClient solrServerClient = SolrServerClient.getInstance();
  28. HttpSolrServer solrServer = solrServerClient.getServer(collection);
  29.  
  30. Page page = new Page();
  31. if(solrServer==null){
  32. returnDTO.setResult(page);
  33. returnDTO.setStatus(StatusConsts.STATUS_PARAMETER_ERROR);
  34. returnDTO.setReturnMsg(StatusConsts.STATUS_PARAMETER_ERROR_MESSAGE);
  35. return returnDTO;
  36. }
  37.  
  38. // 检测输入是否合法
  39. int fieldsLength = fields.length;
  40. int fieldValsLength = fieldVals.length;
  41. int sortfieldsLength = sortfields.length;
  42. int sortTypesLength = sortTypes.length;
  43. if ((fieldsLength != fieldValsLength)||(sortfieldsLength != sortTypesLength)) {
  44. returnDTO.setResult(page);
  45. returnDTO.setStatus(StatusConsts.STATUS_PARAMETER_ERROR);
  46. returnDTO.setReturnMsg(StatusConsts.STATUS_PARAMETER_ERROR_MESSAGE);
  47. return returnDTO;
  48. }
  49.  
  50. SolrQuery query = null;
  51. String highlightFieldStr = "";
  52. List<SolrSearchBookDTO> beans = null;
  53. StringBuffer baseQuery = new StringBuffer();
  54. baseQuery.append("*:*");
  55.  
  56. String[] mainKey = new String[]{"bibName","author","subjectTerm","pubName","isbn"};
  57. if (StringUtils.isNotNull(keywords)) {
  58. baseQuery.delete(0,baseQuery.length());
  59. baseQuery.append("(");
  60. for (String string : mainKey) {
  61. baseQuery.append(string + ":" + keywords);
  62. baseQuery.append(" OR ");
  63. }
  64. baseQuery.delete(baseQuery.length()-4, baseQuery.length());
  65. baseQuery.append(")");
  66. // baseQuery.append("keywords:" + keywords);
  67. }
  68.  
  69. // bibGid:(5265074 OR 4886655)
  70. if (StringUtils.isNotNull(orField[0]) && StringUtils.isNotNull(orFieldVals.get(0)[0])) {
  71. // baseQuery.delete(0,baseQuery.length());
  72. for (int i=0;i<orField.length;i++) {
  73.  
  74. baseQuery.append(" AND ");
  75. baseQuery.append(orField[i] +":(");
  76. for (String orFieldVal : orFieldVals.get(i)) {
  77. baseQuery.append(orFieldVal).append(" OR ");
  78. }
  79. baseQuery.delete(baseQuery.length()-4, baseQuery.length());
  80. baseQuery.append(")");
  81. }
  82. }
  83.  
  84. // keywords:(* NOT 少儿 NOT 教材),注意*不要忘记写
  85. if (StringUtils.isNotNull(offField[0]) && StringUtils.isNotNull(offFieldVals.get(0)[0]) && offField.length==offFieldVals.size()) {
  86. for (int i=0;i<offField.length;i++) {
  87.  
  88. baseQuery.append(" AND ");
  89. baseQuery.append(offField[i]+":(* NOT ");
  90. for (String offFieldVal : offFieldVals.get(i)) {
  91. baseQuery.append(offFieldVal).append(" NOT ");
  92. }
  93. baseQuery.delete(baseQuery.length()-5, baseQuery.length());
  94. baseQuery.append(")");
  95. }
  96. }
  97. // pubTime:[2012-04 TO 2016-01] 中括号包含查询范围,大括号则不包含
  98. if (StringUtils.isNotNull(rangeField[0]) && StringUtils.isNotNull(rangeFieldVals.get(0)[0]) && rangeField.length==rangeFieldVals.size()) {
  99. for (int i=0;i<rangeField.length;i++) {
  100.  
  101. baseQuery.append(" AND ");
  102. baseQuery.append(rangeField[i]+":[ "+rangeFieldVals.get(i)[0]+" TO "+rangeFieldVals.get(i)[1]+"]");
  103.  
  104. // baseQuery.delete(baseQuery.length()-5, baseQuery.length());
  105. // baseQuery.append(")");
  106. }
  107. }
  108.  
  109. if (fieldsLength > 0&&StringUtils.isNotNull(fields[0])){
  110. baseQuery.append(" AND ");
  111. for (int i = 0; i < fieldsLength; i++) {
  112. // query.addFilterQuery(fields[i] + ":" + fieldVals[i]);
  113. baseQuery.append(fields[i]+":").append(fieldVals[i]);
  114. baseQuery.append(" AND ");
  115. }
  116. baseQuery.delete(baseQuery.length()-5, baseQuery.length());
  117. }
  118. try {
  119. // 初始化查询对象
  120. query = new SolrQuery(baseQuery.toString());
  121. // 设置起始位置与返回结果数
  122. currentPage = currentPage == 0 ? 1 : currentPage;
  123. pageSize = pageSize == 0 ? 10 : pageSize;
  124. query.setStart((currentPage - 1) * pageSize);
  125. query.setRows(pageSize);
  126. // 设置排序
  127. if (sortfieldsLength > 0&&StringUtils.isNotNull(sortfields[0]))
  128. for (int i = 0; i < sortfieldsLength; i++) {
  129. if ("asc".equalsIgnoreCase(sortTypes[i])) {
  130. query.addSort(sortfields[i], SolrQuery.ORDER.asc);
  131. } else {
  132. query.addSort(sortfields[i], SolrQuery.ORDER.desc);
  133. }
  134. }
  135.  
  136. // 设置高亮
  137. if (hightlight) {
  138. highlightFieldStr = "bibName,author,isbn,pubName";// 多个用逗号隔开
  139. query.setHighlight(true); // 开启高亮组件
  140. query.addHighlightField(highlightFieldStr);// 高亮字段
  141. query.setHighlightSimplePre("<font color=\"red\">");// 标记
  142. query.setHighlightSimplePost("</font>");
  143. query.setHighlightSnippets(1);// 结果分片数,默认为1
  144. query.setHighlightFragsize(1000);// 每个分片的最大长度,默认为100
  145. }
  146. //分组查询条件
  147. if(facetFlag && StringUtils.isNotNull(facetFields[0])){
  148. query.setFacet(true);
  149. query.addFacetField(facetFields);//设置需要facet的字段
  150. query.setFacetLimit(10);//限制facet返回的数量
  151. }
  152.  
  153. } catch (Exception e) {
  154. e.printStackTrace();
  155. }
  156.  
  157. QueryResponse response = null;
  158. try {
  159. response = solrServer.query(query);
  160. beans = response.getBeans(SolrSearchBookDTO.class);
  161. long numFound = response.getResults().getNumFound();
  162. page.setTotalRecord((int)numFound);
  163. page.setCurrentPage(currentPage);
  164. if (hightlight)
  165. updateHighlightFields(highlightFieldStr, beans, response);
  166.  
  167. if(facetFlag && StringUtils.isNotNull(facetFields[0])){
  168.  
  169. List<SolrSearchFacetDTO> facetList = new ArrayList<SolrSearchFacetDTO>();
  170.  
  171. List<FacetField> facets = response.getFacetFields();//返回的facet列表
  172. for (FacetField facet : facets) {
  173. SolrSearchFacetDTO solrSearchFacetDTO = new SolrSearchFacetDTO();
  174. String facetField = facet.getName();
  175. solrSearchFacetDTO.setFacetField(facetField);
  176.  
  177. List<Count> counts = facet.getValues();
  178.  
  179. List<FacetCountDTO> facetCount = new ArrayList<FacetCountDTO>();
  180.  
  181. for (Count count : counts) {
  182. FacetCountDTO facetCountDTO = new FacetCountDTO();
  183. facetCountDTO.setFacetFieldVal(count.getName());
  184. facetCountDTO.setFacetCount(count.getCount()+"");
  185. facetCount.add(facetCountDTO);
  186. }
  187.  
  188. if("pubYear".equals(facetField)){
  189. Collections.sort(facetCount, new Comparator<FacetCountDTO>() {
  190. public int compare(FacetCountDTO obj1, FacetCountDTO obj2) {
  191. return obj2.getFacetFieldVal().compareTo(obj1.getFacetFieldVal());
  192. }
  193. });
  194. }
  195. solrSearchFacetDTO.setFacetCount(facetCount);
  196. facetList.add(solrSearchFacetDTO);
  197. }
  198.  
  199. Map<String,Object> resvalMap = new HashMap<String,Object>();
  200. List<Object> resvalList = new ArrayList<Object>();
  201. resvalMap.put("beans", beans);
  202. resvalMap.put("facet", facetList);
  203. resvalList.add(resvalMap);
  204. page.setData(resvalList);
  205. }else{
  206. page.setData(beans);
  207. }
  208.  
  209. page.setPageSize(pageSize);
  210. int totalPage = (int) ((numFound + pageSize - 1) / pageSize);
  211. page.setTotalPage(totalPage);
  212.  
  213. returnDTO.setResult(page);
  214. returnDTO.setStatus(StatusConsts.STATUS_SUCCESS);
  215. returnDTO.setReturnMsg(StatusConsts.STATUS_SUCCESS_MESSAGE);
  216.  
  217. } catch (Exception e) {
  218. e.printStackTrace();
  219. returnDTO.setResult(page);
  220. returnDTO.setStatus(StatusConsts.STATUS_FAILURE);
  221. returnDTO.setReturnMsg(StatusConsts.STATUS_FAILURE_MESSAGE);
  222. return returnDTO;
  223. }
  224.  
  225. return returnDTO;
  226. }
  227.  
  228. private void updateHighlightFields(String highlightFieldStr,
  229. List<SolrSearchBookDTO> beans, QueryResponse response)
  230. throws IntrospectionException, IllegalAccessException,
  231. InvocationTargetException {
  232. Map<String, Map<String, List<String>>> highlighting = response
  233. .getHighlighting();
  234. String[] highlightFieldArr = highlightFieldStr.split(",");
  235. for (SolrSearchBookDTO searchBook : beans) {
  236. String key = searchBook.getBibGid();
  237. Map<String, List<String>> map = highlighting.get(key);
  238. if (map == null)
  239. continue;
  240. for (String highlightField : highlightFieldArr) {
  241. if (map.get(highlightField) == null)
  242. continue;
  243. String highlightFieldVal = map.get(highlightField).get(0);
  244.  
  245. PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
  246. highlightField, SolrSearchBookDTO.class);
  247. Method writeMethod = propertyDescriptor.getWriteMethod();
  248. writeMethod.invoke(searchBook, highlightFieldVal);
  249. }
  250. }
  251. }

  其中最核心的代码就是以下代码,根据所拼接好的查询条件字符串实现查询并封装成项目中自定义好的类对象

同时自定义类的属性上需添加solrj中所提供的注解,才能将从索引库中查询的数据进行映射

项目中通过Sorlj获取索引库中的数据的更多相关文章

  1. 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析

    新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar     (核心包) 2) lucene- ...

  2. soapUI使用-DataSource获取oracle库中的参数

    soapUI使用-DataSource获取oracle库中的参数 下载mysql和oracle驱动包:http://pan.baidu.com/s/1i3sy1MH 放在Program Files\S ...

  3. 将数据库的数据导入solr索引库中

    在solr与tomcat整合文章中,我用的索引库是mycore,现在就以这个为例. 首先要准备jar包:solr-dataimporthandler-4.8.1.jar.solr-dataimport ...

  4. AngularJS进阶(三十一)AngularJS项目开发技巧之获取模态对话框中的组件ID

    AngularJS项目开发技巧之获取模态对话框中的组件ID 需求 出于项目开发需求,需要实现的业务逻辑是:药店端点击查看"已发货""已收货"订单详情时,模块弹出 ...

  5. 获取一个表中的字段总数(mysql) Navicat如何导出Excel格式表结构 获取某个库中的一个表中的所有字段和数据类型

    如何获取一个表中的字段总数 1.function show columns from 表明: 结果 : 2.functiuon select count(*) from INFORMATION_SCH ...

  6. 使用Lucene的api将索引创建到索引库中

    import org.apache.commons.io.FileUtils; import org.apache.lucene.document.Document; import org.apach ...

  7. WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件

    在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...

  8. koa 基础(十一)koa 中 koa-bodyparser 中间件获取表单提交的数据

    1.app.js /** * koa 中 koa-bodyparser 中间件获取表单提交的数据 * 1.npm install --save koa-bodyparser * 2.引入 const ...

  9. 通过Solrj实现对索引库中数据的局部更新操作

    for (UpdateIndexDTO updateIndexDTO : data) { // 局部更新 SolrInputDocument doc = new SolrInputDocument() ...

随机推荐

  1. 背景图片等比缩放的写法background-size简写法

    1.背景图片或图标也可像img一样给其宽高就能指定其缩放大小了. 比如一个实际宽高36*28的图标,要缩小一半引用进来的写法就是: background:rgba(0, 0, 0, 0) url(&q ...

  2. jQuery对象插件封装步骤

    jQuery是js的一个非常优秀的库,它大大简化了js的很多操作,并且解决了js的大部分兼容性问题.甚至很多css兼容性问题,用jQuery写都能解决. 这里是对象插件的封装.当然,封装插件很多,这里 ...

  3. JavaScript定时机制、以及浏览器渲染机制 浅谈

    昨晚,朋友拿了一道题问我: a.onclick = function(){ setTimeout(function() { //do something ... },0); }; JavaScript ...

  4. 勘误《iOS网络高级编程:iPhone和iPad的企业应用开发》

    VII页 , 倒数第二行, “其他” 应为 “其它” X页, 源代码有错误,说是有19章,实际一共13章 XI页,勘误表的链接也是错误的  .是该书的<Beginning ASP.NET 4.5 ...

  5. Linux下的文件目录结构详解

    Linux下的文件目录结构详解 / Linux文件系统的上层根目录 /bin 存放用户可执行的程序 /boot 操作系统启动时所需要的文件 /dev 接口设备文件目录,例如:had表示硬盘 /etc ...

  6. Delphi ADO数据操作封装类

    [delphi] view plaincopyprint? { 将数据集操作方面的东西全部封装成一个单独的类 TcustomAdoDataSet是TadoQuery.TadoTable.TadoDat ...

  7. ubuntu vi编辑insert时上下左右建为ABCD

    ubuntu  在vi编辑insert时上下左右建不能移动光标而是输出ABCD,backspace也不能起删除作用, 开始我退出insert模式就能够移动和删除了,不过这样太麻烦很不适应, 只要一次执 ...

  8. iOS 英语

    allocation:分配 agrregate :聚合,聚集,总计.在iOS中是一种文件类型. atomically:原子级的 archiver:归档.例如,oc专门有归档类NSKeyedArchiv ...

  9. Delphi实例之一个较复杂的记事本的实现

    http://www.mamicode.com/info-detail-110813.html delphi中控件位置及自动排版的问题 http://blog.csdn.net/avan_lau/ar ...

  10. java UUID的创建

    java UUID的创建: 参考:http://blog.csdn.net/yaerfeng/article/details/7070369 可以研究一下最后的一段代码: http://spiritf ...