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

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

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

private ReturnDTO handleData(SearchArgumentsDTO searchArgumentsDTO) {
ReturnDTO returnDTO = new ReturnDTO(); String keywords = searchArgumentsDTO.getKeywords();
String[] fields = searchArgumentsDTO.getFields();
String[] fieldVals = searchArgumentsDTO.getFieldVals();
int currentPage = searchArgumentsDTO.getCurrentPage();
int pageSize = searchArgumentsDTO.getPageSize();
String[] sortfields = searchArgumentsDTO.getSortfields();
String[] sortTypes = searchArgumentsDTO.getSortTypes();
boolean hightlight = searchArgumentsDTO.getHightlight(); String[] orField = searchArgumentsDTO.getOrField();
List<String[]> orFieldVals = searchArgumentsDTO.getOrFieldVals();
String[] offField = searchArgumentsDTO.getOffField();
List<String[]> offFieldVals = searchArgumentsDTO.getOffFieldVals();
String[] rangeField = searchArgumentsDTO.getRangeField();
List<String[]> rangeFieldVals = searchArgumentsDTO.getRangeFieldVals(); boolean facetFlag = searchArgumentsDTO.getFacetFlag();
String[] facetFields = searchArgumentsDTO.getFacetFields(); String collection = searchArgumentsDTO.getCollection(); if(StringUtils.isNull(collection)) collection = "CIPBook"; SolrServerClient solrServerClient = SolrServerClient.getInstance();
HttpSolrServer solrServer = solrServerClient.getServer(collection); Page page = new Page();
if(solrServer==null){
returnDTO.setResult(page);
returnDTO.setStatus(StatusConsts.STATUS_PARAMETER_ERROR);
returnDTO.setReturnMsg(StatusConsts.STATUS_PARAMETER_ERROR_MESSAGE);
return returnDTO;
} // 检测输入是否合法
int fieldsLength = fields.length;
int fieldValsLength = fieldVals.length;
int sortfieldsLength = sortfields.length;
int sortTypesLength = sortTypes.length;
if ((fieldsLength != fieldValsLength)||(sortfieldsLength != sortTypesLength)) {
returnDTO.setResult(page);
returnDTO.setStatus(StatusConsts.STATUS_PARAMETER_ERROR);
returnDTO.setReturnMsg(StatusConsts.STATUS_PARAMETER_ERROR_MESSAGE);
return returnDTO;
} SolrQuery query = null;
String highlightFieldStr = "";
List<SolrSearchBookDTO> beans = null;
StringBuffer baseQuery = new StringBuffer();
baseQuery.append("*:*"); String[] mainKey = new String[]{"bibName","author","subjectTerm","pubName","isbn"};
if (StringUtils.isNotNull(keywords)) {
baseQuery.delete(0,baseQuery.length());
baseQuery.append("(");
for (String string : mainKey) {
baseQuery.append(string + ":" + keywords);
baseQuery.append(" OR ");
}
baseQuery.delete(baseQuery.length()-4, baseQuery.length());
baseQuery.append(")");
// baseQuery.append("keywords:" + keywords);
} // bibGid:(5265074 OR 4886655)
if (StringUtils.isNotNull(orField[0]) && StringUtils.isNotNull(orFieldVals.get(0)[0])) {
// baseQuery.delete(0,baseQuery.length());
for (int i=0;i<orField.length;i++) { baseQuery.append(" AND ");
baseQuery.append(orField[i] +":(");
for (String orFieldVal : orFieldVals.get(i)) {
baseQuery.append(orFieldVal).append(" OR ");
}
baseQuery.delete(baseQuery.length()-4, baseQuery.length());
baseQuery.append(")");
}
} // keywords:(* NOT 少儿 NOT 教材),注意*不要忘记写
if (StringUtils.isNotNull(offField[0]) && StringUtils.isNotNull(offFieldVals.get(0)[0]) && offField.length==offFieldVals.size()) {
for (int i=0;i<offField.length;i++) { baseQuery.append(" AND ");
baseQuery.append(offField[i]+":(* NOT ");
for (String offFieldVal : offFieldVals.get(i)) {
baseQuery.append(offFieldVal).append(" NOT ");
}
baseQuery.delete(baseQuery.length()-5, baseQuery.length());
baseQuery.append(")");
}
}
// pubTime:[2012-04 TO 2016-01] 中括号包含查询范围,大括号则不包含
if (StringUtils.isNotNull(rangeField[0]) && StringUtils.isNotNull(rangeFieldVals.get(0)[0]) && rangeField.length==rangeFieldVals.size()) {
for (int i=0;i<rangeField.length;i++) { baseQuery.append(" AND ");
baseQuery.append(rangeField[i]+":[ "+rangeFieldVals.get(i)[0]+" TO "+rangeFieldVals.get(i)[1]+"]"); // baseQuery.delete(baseQuery.length()-5, baseQuery.length());
// baseQuery.append(")");
}
} if (fieldsLength > 0&&StringUtils.isNotNull(fields[0])){
baseQuery.append(" AND ");
for (int i = 0; i < fieldsLength; i++) {
// query.addFilterQuery(fields[i] + ":" + fieldVals[i]);
baseQuery.append(fields[i]+":").append(fieldVals[i]);
baseQuery.append(" AND ");
}
baseQuery.delete(baseQuery.length()-5, baseQuery.length());
}
try {
// 初始化查询对象
query = new SolrQuery(baseQuery.toString());
// 设置起始位置与返回结果数
currentPage = currentPage == 0 ? 1 : currentPage;
pageSize = pageSize == 0 ? 10 : pageSize;
query.setStart((currentPage - 1) * pageSize);
query.setRows(pageSize);
// 设置排序
if (sortfieldsLength > 0&&StringUtils.isNotNull(sortfields[0]))
for (int i = 0; i < sortfieldsLength; i++) {
if ("asc".equalsIgnoreCase(sortTypes[i])) {
query.addSort(sortfields[i], SolrQuery.ORDER.asc);
} else {
query.addSort(sortfields[i], SolrQuery.ORDER.desc);
}
} // 设置高亮
if (hightlight) {
highlightFieldStr = "bibName,author,isbn,pubName";// 多个用逗号隔开
query.setHighlight(true); // 开启高亮组件
query.addHighlightField(highlightFieldStr);// 高亮字段
query.setHighlightSimplePre("<font color=\"red\">");// 标记
query.setHighlightSimplePost("</font>");
query.setHighlightSnippets(1);// 结果分片数,默认为1
query.setHighlightFragsize(1000);// 每个分片的最大长度,默认为100
}
//分组查询条件
if(facetFlag && StringUtils.isNotNull(facetFields[0])){
query.setFacet(true);
query.addFacetField(facetFields);//设置需要facet的字段
query.setFacetLimit(10);//限制facet返回的数量
} } catch (Exception e) {
e.printStackTrace();
} QueryResponse response = null;
try {
response = solrServer.query(query);
beans = response.getBeans(SolrSearchBookDTO.class);
long numFound = response.getResults().getNumFound();
page.setTotalRecord((int)numFound);
page.setCurrentPage(currentPage);
if (hightlight)
updateHighlightFields(highlightFieldStr, beans, response); if(facetFlag && StringUtils.isNotNull(facetFields[0])){ List<SolrSearchFacetDTO> facetList = new ArrayList<SolrSearchFacetDTO>(); List<FacetField> facets = response.getFacetFields();//返回的facet列表
for (FacetField facet : facets) {
SolrSearchFacetDTO solrSearchFacetDTO = new SolrSearchFacetDTO();
String facetField = facet.getName();
solrSearchFacetDTO.setFacetField(facetField); List<Count> counts = facet.getValues(); List<FacetCountDTO> facetCount = new ArrayList<FacetCountDTO>(); for (Count count : counts) {
FacetCountDTO facetCountDTO = new FacetCountDTO();
facetCountDTO.setFacetFieldVal(count.getName());
facetCountDTO.setFacetCount(count.getCount()+"");
facetCount.add(facetCountDTO);
} if("pubYear".equals(facetField)){
Collections.sort(facetCount, new Comparator<FacetCountDTO>() {
public int compare(FacetCountDTO obj1, FacetCountDTO obj2) {
return obj2.getFacetFieldVal().compareTo(obj1.getFacetFieldVal());
}
});
}
solrSearchFacetDTO.setFacetCount(facetCount);
facetList.add(solrSearchFacetDTO);
} Map<String,Object> resvalMap = new HashMap<String,Object>();
List<Object> resvalList = new ArrayList<Object>();
resvalMap.put("beans", beans);
resvalMap.put("facet", facetList);
resvalList.add(resvalMap);
page.setData(resvalList);
}else{
page.setData(beans);
} page.setPageSize(pageSize);
int totalPage = (int) ((numFound + pageSize - 1) / pageSize);
page.setTotalPage(totalPage); returnDTO.setResult(page);
returnDTO.setStatus(StatusConsts.STATUS_SUCCESS);
returnDTO.setReturnMsg(StatusConsts.STATUS_SUCCESS_MESSAGE); } catch (Exception e) {
e.printStackTrace();
returnDTO.setResult(page);
returnDTO.setStatus(StatusConsts.STATUS_FAILURE);
returnDTO.setReturnMsg(StatusConsts.STATUS_FAILURE_MESSAGE);
return returnDTO;
} return returnDTO;
} private void updateHighlightFields(String highlightFieldStr,
List<SolrSearchBookDTO> beans, QueryResponse response)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
Map<String, Map<String, List<String>>> highlighting = response
.getHighlighting();
String[] highlightFieldArr = highlightFieldStr.split(",");
for (SolrSearchBookDTO searchBook : beans) {
String key = searchBook.getBibGid();
Map<String, List<String>> map = highlighting.get(key);
if (map == null)
continue;
for (String highlightField : highlightFieldArr) {
if (map.get(highlightField) == null)
continue;
String highlightFieldVal = map.get(highlightField).get(0); PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
highlightField, SolrSearchBookDTO.class);
Method writeMethod = propertyDescriptor.getWriteMethod();
writeMethod.invoke(searchBook, highlightFieldVal);
}
}
}

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

同时自定义类的属性上需添加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. Object类可以接受引用类型

    Object类是一切类的父类,所以Object类可以接受一切引用类型.连数组和接口对象也都可以接受. 1.接受数组 public class ObjectTest{ public static voi ...

  2. Linux之文件权限属性设置

    文件权限属性设置 1.chown命令 chrep命令 chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组. 用户可以是用户或 ...

  3. BZOJ1478 Sgu282 Isomorphism

    Problem A: Sgu282 Isomorphism Time Limit: 15 Sec  Memory Limit: 64 MBSubmit: 172  Solved: 88[Submit] ...

  4. BZOJ2318: Spoj4060 game with probability Problem

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...

  5. Struts2接受参数的几种类型和接受复杂类型参数(list<String>和list<Object>)

    Struts2接受参数的几种类型 大概有这几种类型: 1.使用Action的属性接受参数 在Action中加入成员变量,配置Getter和Setter方法,Getter而和Setter方法的名字和表单 ...

  6. Angular - - angular.forEach、angular.extend

    angular.forEach 调用迭代器函数取每一项目标的集合,它可以是一个对象或数组.迭代器函数与迭代器(value.key)一起调用,其中值是一个对象属性或数组元素的值,而数组元素是对象属性的关 ...

  7. Selenium IE6 Failed to load the library from temp directory: C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\IED1C1.tmp

    项目中用到了使用Selenium打开IE浏览器.前期都是基于IE8+.Firefox.Chrome.项目后期开始现场测试时发现大部分客户还都是使用的Windows XP + IE6.结果可想而知,直接 ...

  8. ejb ql 返回object

    String sqlStr="select t.car_kind,count(t) from table1 t where t.jb_date='"+jb_date+"' ...

  9. doubango(2)--底层协议栈结构分析

    tsip_stack_handle_t 实例 1.        tsip_stack_handle_t的创建 在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建 ...

  10. js_DOM操作

    嗯,大过年的上次更新应该还是在,大年30前一天,说好的一天更一篇,感觉食言了,虽然没有更,但是,每天还是坚持在学习的,所以今天的任务就是把这几天学的都发上来. 博客,我觉得不仅仅是交流知识的地方,我宁 ...