项目中通过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 231 - Testing the CATCHER
题目大意:一种拦截导弹能拦截多枚导弹,但是它在每次拦截后高度不会再升高,给出导弹的序列,问最多能拦截多少枚导弹? 最长递减子序列问题. #include <cstdio> #include ...
- poj 3641 ——2016——3——15
传送门:http://poj.org/problem?id=3461 题目大意:给你两个字符串p和s,求出p在s中出现的次数. 题解:这一眼看过去就知道是KMP,作为模板来写是最好不过了.... 这道 ...
- NPM 简单实用说明
https://nodejs.org/en/download/ 下载并按照,直接下一步就可以,最后会在C:\Program Files 新建一个nodejs文件夹,里面有一个node.exe.双击就启 ...
- html 转义
function escapeHTML(n) { var t = document.createElement("div"), i = document.createTextNod ...
- js原生封装getClassName()方法-ie不支持getElementsByClassName,所以要自己实现获取类名为className的所有元素
<html> <head> <script type="text/javascript"> window.onload = function() ...
- --@angularjs--理解Angular中的$apply()以及$digest()
$apply() 和 $digest() 在 AngularJS 中是两个核心概念,但是有时候它们又让人困惑.而为了了解 AngularJS 的工作方式,首先需要了解 $apply() 和 $dige ...
- XML之XPath操作
在学习XPath之前你应该对XML的节点,元素,属性,原子值(文本),处理指令,注释,根节点(文档节点),命名空间以及对节点间的关系如:父(Parent),子(Children),兄弟(Sibling ...
- ASP.NET\MVC 解决C#上传图片质量下降,图片模糊,水印有杂点的问题
对图片处理这一块不是很懂,自己写不出来,这些年一直没有停止找一个上传图片质量不下降,加水印不会导致模糊和水印周边产生杂点的代码. 网上基本上99.9%的代码处理图片质量都是下面这两句: //设置质量 ...
- HttpClient 4.3连接池参数配置及源码解读
目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...
- region URL请求数据
#region URL请求数据 /// <summary> /// HTTP POST方式请求数据 /// </summary> /// <param name=&quo ...


