package com.lrd.util;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import com.lrd.pojo.StudentPojo;
/**
* @name solrUtil
* @author Example W
* @time 2018-07-18
*/
public class SolrUtil {
private static SolrClient client;
private static String url;
static {
url = "http://localhost:8983/solr/new_core";
client = new HttpSolrClient.Builder(url).build();
}
/**
* 保存或者更新solr数据
* @param res
*/
public static <T> boolean saveSolrResource(T solrEntity) {
DocumentObjectBinder binder = new DocumentObjectBinder();
SolrInputDocument doc = binder.toSolrInputDocument(solrEntity);
try {
client.add(doc);
client.commit();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return true;
}
/**
* 删除solr 数据
* @param id
*/
public static boolean removeSolrData(String id) {
try {
client.deleteById(id);
client.commit();
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
/**
* 查询
*
* @param keywords
*/
public static List<StudentPojo> queryHighlight(String keywords) throws SolrServerException, IOException {
SolrQuery solrQuery = new SolrQuery();
solrQuery.setQuery("sname:" + keywords ); // 设置查询关键字
solrQuery.setHighlight(true); // 开启高亮
solrQuery.setHighlightRequireFieldMatch(true);
solrQuery.addHighlightField("sname"); // 高亮字段
solrQuery.setHighlightSimplePre("<font color='red' style='font-weight: bold;'>"); // 高亮单词的前缀
solrQuery.setHighlightSimplePost("</font>"); // 高亮单词的后缀
/**
* hl.snippets
* hl.snippets参数是返回高亮摘要的段数,因为我们的文本一般都比较长,含有搜索关键字的地方有多处,如果hl.snippets的值大于1的话,
* 会返回多个摘要信息,即文本中含有关键字的几段话,默认值为1,返回含关键字最多的一段描述。solr会对多个段进行排序。
* hl.fragsize
* hl.fragsize参数是摘要信息的长度。默认值是100,这个长度是出现关键字的位置向前移6个字符,再往后100个字符,取这一段文本。
*/
solrQuery.setHighlightFragsize(100);
QueryResponse query = client.query(solrQuery);
SolrDocumentList lists = query.getResults();//查询结果集
//List<House> items = new ArrayList<House>();
List<StudentPojo> beans = query.getBeans(StudentPojo.class);
Map<String, Map<String, List<String>>> highLightMap = query.getHighlighting();
for(int t=0;beans!=null && t<beans.size();t++)
{
StudentPojo house =beans.get(t);
List<String> nameList = highLightMap.get(house.getId()).get("sname");
house.setSname(nameList.get(0));
}
return beans;
}
}
@RequestMapping("studentList")
@ResponseBody
public PageInfo<StudentPojo> studentList(Integer page,String mohu) {
mohu=mohu==null?"":mohu;
PageInfo<StudentPojo> list = studentService.studentList(page);
for (StudentPojo map : list.getList()) {
SolrUtil.saveSolrResource(map);
}
return list;
}
@RequestMapping("mohuList")
@ResponseBody
public List<StudentPojo> mohuList(String mohu) throws SolrServerException, IOException{
mohu=mohu==null?"":mohu;
List<StudentPojo> list = SolrUtil.queryHighlight(mohu);
return list;
}