以下是我项目中获取新闻数据列表的写法,包括数据总量、数据列表,接下来会贴出分片查询(facet)等高级查询

基本的注释都有了:

private ListPage<News> queryFromSolr(NewsQueryParameters queryParameters, Keyword keyword) {
if (queryParameters == null) {
throw new IllegalArgumentException("查询参数为空");
}
ListPage<News> result = new ListPage<News>();
HttpSolrServer solrServer = SolrServer.getInstance().getServer();
SolrQuery sQuery = new SolrQuery(); try {
String para = this.initKeywordQueryPara(keyword);//初始化para参数方法
int pageNo=queryParameters.getPageNo();
int pageSize=queryParameters.getPageSize(); sQuery.setStart((pageNo - 1) * pageSize);//设置起始页,类似于sql的分页查询
sQuery.setRows(pageSize);//设置每页大小,类似于sql的分页查询
//排序条件
sQuery.setSort("publishTime", SolrQuery.ORDER.desc); sQuery.setQuery(para);//这边的值大概是酱紫的 "* AND publishTime:[1360000 TO 13700000] AND contentStr:\"关键字\"";
QueryResponse response = solrServer.query(sQuery,SolrRequest.METHOD.POST);
SolrDocumentList list = response.getResults();//response.getResults()返回的类型是SolrDocumentList,solr文档集,所以用它来接收
Integer counts = (int) list.getNumFound();//获取总数,这个可以从solr Admin 管理页面里看出来,当我们去Query时,结果中也有一个numFound的属性
List<News> newsList = new ArrayList<News>();
for (SolrDocument solrDocument : list) {
News news = null;
String id = (String) solrDocument.getFieldValue("id");//这边是获取solr上有存储的字段,也就是我们在schema.xml文件里配置的field标签的stored属性,=true就会存储在solr服务器上,因为我的schema.xml只配置id的stored=true,所以这边我先通过获取id,在通过id去数据库获取具体的新闻信息
news = newsDAO.findById(id);
if(news != null){
newsList.add(news);
} } result.setCurrentPageSize(pageSize);
result.setCurrentPageNo(pageNo);
result.setTotalCount(counts);
result.setDataList(newsList);
return result;
} catch (SolrServerException e) {
log.error("查询solr失败", e);
e.printStackTrace();
} finally{
solrServer.shutdown();
solrServer = null;
} return result; }
public String initKeywordQueryPara(Keyword keyword){

        String para = "*";

        long dataTimeStart = 0;
long dataTimeEnd = 0; if(keyword.getMonitoringBeginTime() != null){
dataTimeStart = keyword.getMonitoringBeginTime().getTime();
}
if(keyword.getMonitoringEndTime() != null){
Date endTime = DateUtil.getNextDayCurrDay(keyword.getMonitoringEndTime(), 1);
dataTimeEnd = endTime.getTime();
}
para = para + " AND publishTime:["
+ (dataTimeStart == 0 ? "*" : dataTimeStart) + " TO "
+ (dataTimeEnd == 0 ? "*" : dataTimeEnd) + "]"; String keywords = keyword.getKeywordName();
if(keywords !=null && keywords.length() > 0){
String[] targetArr = keywords.split(",");
para = para + " AND (";
for (int i = 0; i < targetArr.length; i++) {
if (i != 0) {
para = para + " OR ";
}
para = para + "contentStr:\"" + targetArr[i] + "\"";
}
para = para + ")"; }return para;
}

Solr的学习使用之(六)获取数据列表-SolrDocumentList的更多相关文章

  1. .NET MVC 学习笔记(六)— 数据导入

    .NET MVC 学习笔记(六)—— 数据导入 在程序使用过程中,有时候需要新增大量数据,这样一条条数据去Add明显不是很友好,这时候最好就是有一个导入功能,导入所需要的数据,下面我们就一起来看一下导 ...

  2. [ionic开源项目教程] - 第4讲 通Service层获取数据列表

    第4讲:通Service层获取数据列表 上一讲中页面的基本架构已完成,这一讲介绍如何通过service层从服务器请求数据,在通过controller层为载体,显示到视图层. 1.在services.j ...

  3. WCF学习心得------(六)数据协定

    --前言 最近各种事忙的把之前的WCF学习给耽误了一些,今天抽时间把之前的学习内容给总结了一下,因为知识点比较细碎没有做太多的练习示例,只是对其中关键的知识点做了总结,希望可以对大家有所帮助. 第六章 ...

  4. JavaScript学习总结(六)数据类型和JSON格式

    转自:http://segmentfault.com/a/1190000000668072 什么是JSON JSON:JavaScript 对象表示法(JavaScript Object Notati ...

  5. MyCat 学习笔记 第六篇.数据分片 之 按月数据分片

    1 应用场景 Mycat 有很多数据分库规则,接下来几篇就相关觉得常用的规则进行试用与总结. 一般来说,按自然月份来进行数据分片的规则比较适用于商城订单查询,类似最近1周.2周.3个月内的数据.或是报 ...

  6. R语言学习笔记(六): 列表及数据框的访问

    List R语言中各组件的名称叫做标签(tags),访问列表有3种方法: j$salary 通过标签名字访问,只要不引起歧义,可以只写出前几个字母. j[['sal']] 夹在两个中括号时引号里的标签 ...

  7. Python基础学习参考(六):列表和元组

    一.列表 列表是一个容器,里面可以放置一组数据,并且列表中的每个元素都具有位置索引.列表中的每个元素是可以改变的,对列表操作都会影响原来的列表.列表的定义通过"[ ]"来定义,元素 ...

  8. asp.net中,我们使用ashx获取数据列表,在前端使用$.ajax()解析

    一直在想在asp.net中怎么才能向在java中那样用struts那样做页面请求. 当然asp.net mvc就是类似struts的东西吧,不过还没来得及学习. 今天就用ashx来接收页面请求,并调用 ...

  9. 使用foreach获取数据列表的全部信息

    先把代码列出来:(在admin/listAdmin.php中) <?php foreach($rows as $row):?> //注意,这里的foreach($rows as $row) ...

随机推荐

  1. OC项目调用C++

    CPPHello.hpp #ifndef CPPHello_hpp #define CPPHello_hpp #include <stdio.h> class CPPHello { pub ...

  2. sqlite3 on python for newbies

    python 集成了 sqlite3 ,其接口很简单: import sqlite3 db_connection = sqlite3.connect(db_filename) db_cursor = ...

  3. c++复习——临考前的女娲补天 >=.<

    一些零零散散的知识点... 1.抽象类只能作为其他类的基类,不能建立对象,但抽象类的派生类如果给出纯虚函数的函数体,这个派生类仍然是一个抽象类.//这个好理解 懂了 2.抽象类不能作为参数类型,函数的 ...

  4. Behaviour Tree Service 中的几个函数

    Service中可以override的函数有8个,因为每个函数都有个AI版本的,所以实际上是4组函数,AI版本的和非AI版本基本一样, 他们分别是: Receive Search Start (AI) ...

  5. linux socket 缓存: core rmem_default rmem_max

    https://blog.csdn.net/penzchan/article/details/41682411

  6. CentOS yum 安装历史版本 java

    1.以1.6为例,找到对应版本 $ yum --showduplicate list java* |grep 1.6 java--openjdk.x86_64 :1.6.0.41-1.13.13.1. ...

  7. docker 命令汇总2

    docker version [root@cu-tmp-201 ~]# docker version Client: Version: 18.09.6 API version: 1.39 Go ver ...

  8. 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第3节 Calendar类_1_Calendar类介绍_获取对象的方式

    Calendar.getInstance()返回的就是Calendar的子类对象.GregorianCalendar 说明Calendar类重写了toSting的方法 时区亚洲的上海

  9. Leaflet

    https://leafletjs.com/ https://github.com/Leaflet/Leaflet

  10. PAT 1001 A+B Format (20 point(s))

    题目: 我一开始的思路是: 用math.h中的log10函数来计算位数(不建议这么做,因为会很慢,而且会出一点别的问题): 用pow函数根据要插入分号的位置来拆分a+b成一个个数字(例如res / p ...