项目中通过Sorlj获取索引库中的数据
在开发项目中通过使用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获取索引库中的数据的更多相关文章
- 第一个lucene程序,把一个信息写入到索引库中、根据关键词把对象从索引库中提取出来、lucene读写过程分析
新建一个Java Project :LuceneTest 准备lucene的jar包,要加入的jar包至少有: 1)lucene-core-3.1.0.jar (核心包) 2) lucene- ...
- soapUI使用-DataSource获取oracle库中的参数
soapUI使用-DataSource获取oracle库中的参数 下载mysql和oracle驱动包:http://pan.baidu.com/s/1i3sy1MH 放在Program Files\S ...
- 将数据库的数据导入solr索引库中
在solr与tomcat整合文章中,我用的索引库是mycore,现在就以这个为例. 首先要准备jar包:solr-dataimporthandler-4.8.1.jar.solr-dataimport ...
- AngularJS进阶(三十一)AngularJS项目开发技巧之获取模态对话框中的组件ID
AngularJS项目开发技巧之获取模态对话框中的组件ID 需求 出于项目开发需求,需要实现的业务逻辑是:药店端点击查看"已发货""已收货"订单详情时,模块弹出 ...
- 获取一个表中的字段总数(mysql) Navicat如何导出Excel格式表结构 获取某个库中的一个表中的所有字段和数据类型
如何获取一个表中的字段总数 1.function show columns from 表明: 结果 : 2.functiuon select count(*) from INFORMATION_SCH ...
- 使用Lucene的api将索引创建到索引库中
import org.apache.commons.io.FileUtils; import org.apache.lucene.document.Document; import org.apach ...
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- koa 基础(十一)koa 中 koa-bodyparser 中间件获取表单提交的数据
1.app.js /** * koa 中 koa-bodyparser 中间件获取表单提交的数据 * 1.npm install --save koa-bodyparser * 2.引入 const ...
- 通过Solrj实现对索引库中数据的局部更新操作
for (UpdateIndexDTO updateIndexDTO : data) { // 局部更新 SolrInputDocument doc = new SolrInputDocument() ...
随机推荐
- [repost]Xcode因为证书问题经常报的那些错
[reference]http://www.jianshu.com/p/b10680a32d3 1. 确认下证书是不是开发证书,如果是发布证书就会出现这样的提示. 2. 证书失效了,去开发者中 ...
- 如何检测 Android Cursor 泄漏
简介: 本文介绍如何在 Android 检测 Cursor 泄漏的原理以及使用方法,还指出几种常见的出错示例.有一些泄漏在代码中难以察觉,但程序长时间运行后必然会出现异常.同时该方法同样适合于其他需要 ...
- oracle系列--基础理论
一.数据库系统架构: 外层(External Level)外层是提供给用户直接操作使用的 概念层(Conceptual Level)用来描述数据库中存放数据的类型.表之间的关系.高级的数据模型.用户的 ...
- Grunt构建工具能做哪些事?
Grunt到底有什么作用?一般用来干嘛? 很多前端的工作,包括Less编译.javascript压缩.Css压缩等零零碎碎的工作, 都可以让Grunt来做. 实际上在项目开发中,一般是前端代码 与 后 ...
- pipe管道
回顾: 进程间通信方式: 信号,管道 消息队列,共享内存,信号量 sokcet 信号: 本质就是软中断 signal(信号,函数指针); void func(int); kill(pid,signo) ...
- 位运算,算术、逻辑运算详解-java篇
/** * 功能: * 位运算符,原码.反码.补码规则: * 1.二进制的最高位是符号位:0表示正数,1表示负数 * 2.正数的原码.反码.补码都一样 * 3.负数的反码=它的原码符号位不变,其他位取 ...
- mysql 自带的压力测试
注意mysqlslap 是mysql5.1之后新添加的功能,之前的版本是没有此功能的
- HDU1217:Arbitrage(SPFA)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1217 题目大意 在每种钱币间进行各种交换,最后换回自己如果能赚,那么就Yes,否则No 注意应为有负权 ...
- MyBatis中的条件判断单引号双引号的使用
对于字符串判断, <if test="aIn != 'A'" >会出现问题,系统会试图把'A'转成数字,改为 <if test='aIn != "A&q ...
- Java线程:线程交互
一.基础知识 java.lang.Object的类的三个方法: void notify():唤醒在此对象监视器上等待的单个线程. void notifyAll():唤醒在此对象监视器上等待的所有线程. ...


