Solr分页查询代码,包含查询,分页,高亮及获取高亮处摘要代码
来源:互联网 发布:阿里云 专线 编辑:程序博客网 时间:2024/05/18 23:53
solr工具类
import java.util.ArrayList;import java.util.Date;import java.util.Iterator;import java.util.List;import java.util.Map;import org.apache.log4j.Logger;import org.apache.solr.client.solrj.SolrQuery;import org.apache.solr.client.solrj.impl.HttpSolrServer;import org.apache.solr.client.solrj.response.QueryResponse;import org.apache.solr.common.SolrDocument;import org.apache.solr.common.SolrDocumentList;import base.Page;import base.util.ConfigUtil;import demo.bean.Article;public class SolrService { private static Logger log = Logger.getLogger(SolrService.class); private static HttpSolrServer solrServer; static { solrServer = new HttpSolrServer(ConfigUtil.getValue("solr.url")); solrServer.setConnectionTimeout(5000); } /** * 分页查询,包含查询,分页,高亮及获取高亮处摘要等内容;不同于数据库的查询分页, * solr的查询返回值中有文档总数,所以无需再次查询总条数。 * * @param page 自定义的翻页对象,包含查询信息及当前页数据列表。 */ public static void getByPage(Page page) { SolrQuery query = new SolrQuery(); // 为防止和其他变量重名,在变量的开始加上condition的首字母c String ckw = page.getConditions().get("kw").toString(); String cCatalogId = page.getConditions().get("catalogId").toString(); //查询指定分类中,指定的关键字 query.setQuery(ckw + " AND catalog_id:"+cCatalogId); //按照时间排序 query.addSort("create_time", SolrQuery.ORDER.desc); //开始页 query.setStart((int)page.getStart()); //一页显示多少条 query.setRows(page.getSize()); //设置高亮 query.setHighlight(true);// 开启高亮组件 query.addHighlightField("title");// 高亮字段 query.addHighlightField("content");// 高亮字段 //标记,高亮关键字前缀 query.setHighlightSimplePre("<font color='red'>"); query.setHighlightSimplePost("</font>");//后缀 /** //获取高亮分片数,一般搜索词可能分布在文章中的不同位置,其所在一定长度的 语句即为一个片段,默认为1,但根据业务需要有时候需要多取出几个分片。 - 此处设置决定下文中titleList, contentList中元素的个数 **/ query.setHighlight(true).setHighlightSnippets(1); /** 每个分片的最大长度,默认为100。 适当设置此值,如果太小,高亮的标题可能会显不全; 设置太大,摘要可能会太长。 **/ query.setHighlightFragsize(150); List<Object> articles = new ArrayList<Object>(); try { QueryResponse rsp = solrServer.query(query); SolrDocumentList docs = rsp.getResults(); //获取所有高亮的字段 Map<String,Map<String,List<String>>> highlightMap=rsp.getHighlighting(); Iterator<SolrDocument> iter = docs.iterator(); while (iter.hasNext()) { SolrDocument doc = iter.next(); String idStr = doc.getFieldValue("id").toString(); int id = Integer.parseInt(idStr); String title = doc.getFieldValue("title").toString(); String description = doc.getFieldValue("description").toString(); String writer = doc.getFieldValue("writer").toString(); int catalogId = Integer.parseInt(doc.getFieldValue("catalog_id").toString()); Date createTime = (Date)doc.getFieldValue("create_time"); Article article = new Article(); article.setId(id); article.setTitle(title); article.setDescription(description); article.setWriter(writer); article.setCatalogId(catalogId); article.setCreateTime(createTime); List<String> titleList=highlightMap.get(idStr).get("title"); List<String> contentList=highlightMap.get(idStr).get("content"); //获取并设置高亮的字段title if(titleList!=null && titleList.size()>0){ article.setTitle(titleList.get(0)); } //获取并设置高亮的字段content if(contentList!=null && contentList.size()>0){ article.setDescription(contentList.get(0)); } articles.add(article); } page.setDatas(articles); page.setCount(docs.getNumFound()); } catch (Exception e) { log.error("从solr根据Page查询分页文档时遇到错误", e); } }}
Page是自定义的翻页对象,包含查询条件和查询结果等变量
import java.util.List;import java.util.Map;/** * 基类page中包含公有翻页参数及保存查询到的结果以被页面遍历, * 被子类继承后将增加不同的查询条件 。 * * @author David * */public class Page { /** 每页显示条数默认为30条 */ public static final int DEFAULT_SIZE = 30; /** 当前页码, 从1开始计 */ private int current; /** 每页条数 */ private int size; /** 总条数 */ private long count; /** 查询参数 */ private Map<String, Object> conditions; /** 当前页数据 */ private List<Object> datas; public Page() { // 设置默认值 current = 1; size = DEFAULT_SIZE; } /** 获取当前页码 */ public int getCurrent() { return current; } /** 设置当前页码 */ public void setCurrent(int current) { this.current = current; } /** 获取每页显示条数 */ public int getSize() { return size; } /** 设置每页显示条数 */ public void setSize(int size) { this.size = size; } /** 获取查询参数 */ public Map<String, Object> getConditions() { return conditions; } /** 设置查询参数 */ public void setConditions(Map<String, Object> conditions) { this.conditions = conditions; } /** 获取当前页数据 */ public List<Object> getDatas() { return datas; } /** 设置当前页数据 */ public void setDatas(List<Object> datas) { this.datas = datas; } /** 获取总条数 */ public long getCount() { return count; } /** 设置总条数 */ public void setCount(long count) { this.count = count; } /** 获取总页数 */ public long getTotalPages() { if (datas == null || datas.isEmpty()) return 0; long totalPages = count / size; if (count%size != 0) { totalPages ++; } return totalPages; } /** 获取从第几条数据开始查询 */ public long getStart() { return (current-1) * size; } /** 判断是否还有前一页 */ public boolean getHasPrevious() { return current == 1 ? false : true; } /** 判断是否还有后一页 */ public boolean getHasNext() { return (getTotalPages()!=0 && getTotalPages()!=current) ? true : false; }}
@Test public void getByPage() { Page page = new Page(); Map<String, Object> conditions = new HashMap<String, Object>(); conditions.put("kw", "solr");// 指定搜索词keyword conditions.put("catalogId", "5");// 指定所在栏目id page.setConditions(conditions); SolrService.getByPage(page); for (Object o : page.getDatas()) { Article a = (Article) o; System.out.println(a.getTitle()); } }/**相关说明:1,因为我想在标题和正文中进行搜索,而且我使用了copyField将title和content都拷贝到了拷贝字段text中,所以我这里在搜索的时候不需要写成 "title:"+ckw+" OR " + "content:"+ckw,而直接使用ckw即可;因为catalogId没有在拷贝字段中,搜索时需要指定所在字段,即"catalog_id:"+cCatalogId。**/
0 0
- Solr分页查询代码,包含查询,分页,高亮及获取高亮处摘要代码
- solr复杂查询;及代码示例;包括查询、过滤、分页、排序、高亮显示等处理 的代码示例;
- solr分页查询和高亮
- 复杂查询分页代码
- 复杂查询分页代码
- SQL分页查询代码
- 分页查询代码
- 数据查询分页代码
- solr查询索引,各种查询,查询字符串,过滤查询,条件查询,排序查询、分页查询、高亮查询
- solr分页查询
- JSP高效分页查询代码
- JSP高效分页查询代码
- oralce分页查询工具代码
- 查询分页技术实现代码
- Hbase分页查询代码实现
- JSP 分页查询关键代码!
- Hibernate分页查询核心代码
- 分页查询简约代码显示
- TCP的状态 (SYN, FIN, ACK, PSH, RST, URG)
- 【Linux 基础篇】之 single模式修改密码
- 程序员的故事 004 老石其人
- 1029. 旧键盘(20)
- c#-sql之having
- Solr分页查询代码,包含查询,分页,高亮及获取高亮处摘要代码
- 动态规划:从新手到专家(在网上看到的一篇将动态规划很详细的文章)
- android 加密 SO 破解
- Metasploit 整理笔记
- C函数指针应用之转移表(jump tables)
- 脚本语言中“脚本”是什么含义
- IPC机制 基础知识
- 弯道超车:容器技术究竟为云计算带来了什么?
- Ubuntu下相关软件的安装