springboot项目练习七 solr高亮查询条件查询

版权声明: 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查询条件。

猜你喜欢

转载自blog.csdn.net/Master_chaoAndQi/article/details/86189439