项目中通过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() ...
随机推荐
- UVa 11059 最大乘积
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- [题解]bzoj 3223 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3884 Solved: 2235[Submit][Sta ...
- cordova环境搭建
首先,需要了解一下cordova 和 phonegap 的关系.phoneGap是原先的名字,Cordova是phoneGap被捐给apache之后 用的项目名,phoneGap的名字也被保留了. 1 ...
- Struts2验证
一.声明式验证 1.字段验证 fielderror的两种显示方式 fielderror的提示信息可以国际化 2.非字段验证:actionErrors / <s:actionerror> 例 ...
- 《C++ Primer》 chapter 15 TextQuery
<C++ Primer>中第15章为了讲解面向对象编程,举了一个例子:设计一个小程序,能够处理查询给定word在文件中所在行的任务,并且能够处理“非”查询,“或”查询,“与”查询.例如执行 ...
- UVa 10427 - Naughty Sleepy Boys
题目大意:从1开始往后写数字,构成一个如下的字符串 123456789101112... .求第n位的数字是多少. 找规律,按数字的位数可以构建一个类似杨辉三角的东西,求出第n位是哪个数的第几位即可. ...
- UVa 10405 & POJ 1458 Longest Common Subsequence
求最长公共子序列LCS,用动态规划求解. UVa的字符串可能含有空格,开始用scanf("%s", s);就WA了一次...那就用gets吧,怪不得要一行放一个字符串呢. (本来想 ...
- Core Data使用之一(Swift): 保存
Core Data 用于永久化数据,它是基于SQLite数据库的保存一门技术. 那么,在Swift中,它是如何实现的呢? 首先,需要新建一个模板,打开工程中的xcdatamodeld文件,点击“Add ...
- Core Data 应用程序实践指南(Core Data 应用程序实践指南)
译者序 前言 勘误 1. 初次尝试Core Data应用程序 本书的基础,基本概念,能做什么,不能做什么.实现CoreDataHelper类,演示如何将Core Data同既有的应用程序相集成. 2. ...
- php短数组写法
在php 5.4+的版本中,可以使用 [] 来表示 array() 例子: // On PHP 5.1 $data = array("foo", "bar" ...