关于springboot 和solr 的集成可以看我另一篇文章
我的solr里主要存的是法条,有如下几个域
id,law_title,law_content
其中title和content组成一个复制域,law_keywords
下面是我的service层的代码
public SearchResult search(String keyword, int page, int rows) throws IOException, SolrServerException {
SolrQuery query = new SolrQuery();
query.setQuery(keyword);
if (page<=0) {
page=1;
}
query.setStart((page - 1) * rows);
query.setRows(rows);
query.set("df", "law_keywords");
query.setHighlight(true);
query.addHighlightField("law_title");
query.addHighlightField("law_content");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
query.setHighlightFragsize(2147483647);
SearchResult searchResult = null;
searchResult = searchDao.search(query);
long recordCount = searchResult.getRecordCount();
int totalPage = (int)(recordCount/rows);
if (recordCount % rows >0) {
totalPage++;
}
searchResult.setTotalPages(totalPage);
return searchResult;
}
其中df表示的是default field ,默认查哪个域
我默认搜索的是law_title和law_content组成的复制域law_keywords
setHighightFragsize 是设置solr的最大查询字符串,这个默认是100,也就是100字符之后将不再显示
setHighlightSimplePre 和post是设置高亮域的前后缀,如果想在网页上显示成红色效果就套上一个em标签
下面是dao代码
public SearchResult search(SolrQuery query) throws IOException, SolrServerException {
QueryResponse queryResponse = solrClient.query(query);
SolrDocumentList solrDocumentList = queryResponse.getResults();
long numFound = solrDocumentList.getNumFound();
SearchResult result = new SearchResult();
result.setRecordCount(numFound);
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
List<Law> lawList = new ArrayList<>();
for (org.apache.solr.common.SolrDocument solrDocument : solrDocumentList) {
Law law = new Law();
System.out.println();
int id = Integer.valueOf((String) solrDocument.get("id"));
law.setId(id);
law.setContent((String) solrDocument.get("law_content"));
List<String> titleList= highlighting.get(solrDocument.get("id")).get("law_title");
List<String> contentList= highlighting.get(solrDocument.get("id")).get("law_content");
String title="";
String content = "";
if (titleList !=null && titleList.size()>0) {
title = titleList.get(0);
}else {
title = (String) solrDocument.get("law_title");
}
if (contentList !=null && contentList.size()>0) {
content = contentList.get(0);
}else {
content = (String) solrDocument.get("law_content");
}
law.setTitle(title);
law.setContent(content);
lawList.add(law);
}
result.setItemList(lawList);
return result;
}
这里我把law_title以及law_content都设置为高亮域
@Test
public void testSearch() throws IOException, SolrServerException {
SearchResult searchResult = searchService.search("文物盗窃", 1, 10);
List<Law> list = searchResult.getItemList();
for (Law law : list) {
System.out.println(law.getTitle());
System.out.println(law.getContent());
}
}
最后写一个测试类进行测试
可以看到title 和content的关键字都被打上了em标签