版权声明: https://blog.csdn.net/Master_chaoAndQi/article/details/86189439
1 页面增加输入框和搜索按钮
- 修改页面交互代码完成搜索框的检索功能
- 增加solr的高亮查询
<table>
<tr>
<td>输入查询关键字:</td>
<td><input type="text" class=".l-text" id="key" ></td>
<td><input type="button" style="width:60px" class="l-form-buttons" id="search" name="搜索" value="搜索"></td>
</tr>
</table>
2 增加交互事件为搜索按钮绑定点击事件,并获取输入的查询key值
function searchData(){
var key =$("#key").val();
if(key){
$list_dataGrid.setParm("key",key); // 通过ligerui提供的方法设置参数
}
$list_dataGrid.loadData(); //重新加载列表数据
}
$("#search").click(function(){ //为搜索按钮绑定点击事件
searchData();
})
3 修改ligerUi的参数
delayLoad :true,
4修改newController的查询方法增加参数key值
/**
* list 返回所有的新闻数据
* @return
*/
@RequestMapping(value ="list" )
@ResponseBody
public PageBean<?> listNewData(String pagesize,String currentPage,String key){
Map<String,Object> param = new HashMap<String,Object>();
PageBean<NewDoc> page = new PageBean<NewDoc>(Integer.valueOf(currentPage),Integer.valueOf(pagesize));
try {
param.put("query", "source_news:*");
param.put("pagesize", pagesize);
param.put("currentPage", currentPage);
if(!StringUtils.isEmpty(key)){
param.put("key", key);
}
page = newDocSolr.getByPage(param);
// list = newDocSolr.getList("source_news:*",true);
} catch (Exception e) {
e.printStackTrace();
}
return page;
}
5 由于涉及到单独的业务字段,对newDocSolr接口进行扩展增加分页查询的方法,并在相应的实现类中完成参数的封装
package com.gc.solr;
import java.util.Map;
import com.gc.doc.NewDoc;
import com.gc.utils.PageBean;
public interface NewDocSolr extends CommonRepository<NewDoc> {
/**
* 分页查询方法
* @param param
* @return
* @throws Exception
*/
PageBean<NewDoc> getByPage(Map<String, Object> param) throws Exception;
}
6 实现newDocSolr方法对接收的参数进行封装 并修改公共的CommonRepository接口的分页方法增加参数SolrQuery对象,完成业务逻辑的封装后,传递给公共的的数据处理类完成交互
package com.gc.solr;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.stereotype.Service;
import com.gc.doc.NewDoc;
import com.gc.utils.PageBean;
@Service("newDocSolr")
public class NewDocSolrImpl extends CommonRepositoryImpl<NewDoc> implements NewDocSolr {
public PageBean<NewDoc> getByPage(Map<String, Object> param) throws Exception {
SolrQuery solrQuery = null;
// 加上业务字段的拼接 提供中文查询的 source_news title_news digest 来源
if(param!=null && param.containsKey("key")){
solrQuery = new SolrQuery();
solrQuery.setQuery(param.get("query").toString()); //设置查询条件q
solrQuery.setHighlight(true); //开启高亮查询
solrQuery.addHighlightField("source_news"); //设置高亮查询的字段
solrQuery.addHighlightField("title_news"); //设置高亮查询的字段
solrQuery.addHighlightField("digest"); //设置高亮查询的字段
solrQuery.setHighlightSimplePre("<span style='color:red'>"); // 设置高亮查询返回结果的前后包裹 在这使用<span></span>标签对结果进行包裹
solrQuery.setHighlightSimplePost("</span>");
StringBuffer buffer = new StringBuffer(); // 拼装查询参数 由于使用的是万能查询搜索框,故查询参数使用OR进行连接 并添加到query对象中 对应fl字段
buffer.append("source_news:"+param.get("key").toString() +" OR " +"title_news:"+param.get("key").toString());
buffer.append(" OR " + "digest :"+param.get("key").toString());
solrQuery.addFilterQuery(buffer.toString());
param.remove("query");
}
return super.getByPage(param,solrQuery); // 扩展公共的查询方法增加query对象
}
}
7 修改公共的查询方法接口CommonRepository的getByPage方法增加入参SolrQuery对象,在公共查询方法中对传递的SolrQuery对象进行判空,并判断是否开启高亮查询,对返回结果进行封装和替换。
/**
* 分页查询处理 查询结果
* @param param
* @param solrQuery
* @return
* @throws Exception
*/
PageBean<T> getByPage(Map<String,Object> param,SolrQuery solrQuery) throws Exception;
8 实现CommonRepository接口完善getByPage方法,处理高亮查询的结果替换
/**
* 分页查询
* param封装请求参数
* @param param solrQuery
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
@Override
public PageBean<T> getByPage(Map<String, Object> param,SolrQuery solrQuery) throws Exception {
SolrQuery query = null; //对象进行判空 存在则使用,不存在则new 一个
if(solrQuery!=null){
query = solrQuery;
}else{
query= new SolrQuery();
if(param.containsKey("query")){
query.setQuery(param.get("query").toString());
}
}
PageBean<T> page = new PageBean<T>();
List<T> list = new ArrayList<T>();
for (String key:param.keySet()) {
if(StringUtils.equals("currentPage", key)){
query.setStart(Integer.valueOf(param.get(key).toString()));
page.setCurrentPage(Integer.valueOf(param.get(key).toString()));
}else if(StringUtils.equals("pagesize", key)){
query.setRows(Integer.valueOf(param.get(key).toString()));
page.setPageSize(Integer.valueOf(param.get(key).toString()));
}
}
QueryResponse response = solrTemp.getSolrClient().query(collection, query, METHOD.GET);
int status = response.getStatus();
if (status == 0) {
SolrDocumentList results = response.getResults();
Map<String, Map<String, List<String>>> highlighting =null;
if(query.getHighlight()){ // 如果开启了高亮查询
highlighting = response.getHighlighting();
}
for (SolrDocument solrDocument : results) {
if(highlighting!=null){ // 解析高亮查询结果
Map<String, List<String>> map = highlighting.get(solrDocument.get("id").toString()); //根据文本id解析Map
if(map!=null){
System.out.println(map);
for(String key:map.keySet()){ // 遍历map的key值获取设置的
if(solrDocument.containsKey(key)){ // 判断文本中是否包含该值
List<String> listHigth = map.get(key); // 包含则得到 高亮数据集合
if(null!=listHigth && listHigth.size()>0){
String str="";
for(String value:listHigth){ // 对集合数据进行拼接
str+=value;
}
solrDocument.setField(key, str); // 替换到原不是高亮显示的部分
}
}
}
}
}
list.add((T) solrDocument);
}
long numFound = results.getNumFound();
page.setRows(list);
page.setTotal(Integer.parseUnsignedInt(new String(numFound+"")));
}
return page;
}
至此参数,的修改和高亮查询部分就完成了。开启了高亮查询后,在高亮查询的时候,返回的json数据是根据文档对象的key作为第一层map的key,高亮字段为内层map的key,对高亮数据的值进行解析和判空,最后将解析出的集合进行字符串拼接,并替换掉原来的值。
完成后的效果图如下:
在这推荐两个工作中常用的网站:
https://www.json.cn/ //json在线解析
http://tool.chinaz.com/Tools/urlencode.aspx // url在线解析
项目源码地址下载使用百度云的链接地址: 链接无效的话也可以直接留言,再上传一次
链接:https://pan.baidu.com/s/1Xl0Zw7e8a3n0Po9RyOx71Q
提取码:0msf
本次solr查询使用到的有 fl q hl查询条件。