SpringBoot集成Solr(二)搜索数据
1.1 构建查询条件
//创建 solr查询参数对象 SolrQuery query = new SolrQuery(); StringBuilder params = new StringBuilder(); params.append(" subject_s:*").append(text).append("*"); params.append(" OR keywords_s:*").append(text).append("*"); params.append(" OR summary_ik:*").append(text).append("*"); params.append(" OR content_ik:*").append(text).append("*"); params.append(" OR creationByName_s:*").append(text).append("*"); query.setQuery(params.toString());
- 上面代码中左边的字符串是映射到solr中的实体属性,相当于数据库中的表字段,
*
表示匹配多位。
1.2 构建排序条件
//多个条件 构造方式 List<SolrQuery.SortClause> orders = new ArrayList<>(); orders.add(new SolrQuery.SortClause("topFlag_s", SolrQuery.ORDER.asc)); orders.add(new SolrQuery.SortClause("creationDate_s", SolrQuery.ORDER.desc)); query.setSorts(orders); //单个条件构造方式一 SortClause sort = new SolrQuery.SortClause("topFlag_s", SolrQuery.ORDER.asc) query.setSort(sort); //单个条件构造方式二 query.setSort("topFlag_s",SolrQuery.ORDER.asc);
1.3 设置分页
//设置分页 query.setStart(Func.toInt(page.getCurrent() - 1)); //solr的分页是从0开始的 query.setRows(Func.toInt(page.getSize()));
- 注意:solr的分页第一页其实是从0开始的,部分框架中分页插件第一页是从1开始的。
1.4 设置高亮
//启动高亮显示 query.setHighlight(true); //指定需要高亮显示的属性 query.addHighlightField("subject_s"); query.addHighlightField("keywords_s"); query.addHighlightField("kmCategoryName_s"); //高亮显示的前缀 query.setHighlightSimplePre("<font color='red'>"); //高亮显示的后缀 query.setHighlightSimplePost("</font>");
注意:这种方式设置的高亮是整个属性值全部高亮。
例如:设置标题高亮
- 若想只高亮输入的关键字,则可以使用如下方式实现:
//在源字符串中匹配关键字,并指定关键字颜色、背景 public static String markSubstring(String original, String keyword) { Pattern pattern = Pattern.compile(keyword, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(original); return matcher.replaceAll("<font style='background-color:#ffff00;color:#f00'>$0</font>"); }
1.5 执行查询
//执行查询 QueryResponse response = solrClient.query(query); //检索到的数量 long numFound = response.getResults().getNumFound(); //处理文档 SolrDocumentList solrDocumentList = response.getResults(); // 初始化 DocumentObjectBinder对象 DocumentObjectBinder binder = new DocumentObjectBinder(); // 将查询结果 solrDocumentList对象转换为list对象 result = binder.getBeans(KnowledgeIk.class, solrDocumentList); return result;