1.在虚拟机里安装solr,可以通过官网下载solr的linux的安装包解压之后,添加/etc/sysconfig/iptables中的端口号8983(solr默认)
2.Solr的安装:
第一步:解压压缩文件:
[root@localhost Desktop]# tar -zvxf solr-7.3.1.tgz -C /opt/
第二步:启动solr
[root@localhost Desktop]# /opt/solr-7.3.1/bin/solr start -force
第三步:测试 在浏览器中输入
http://localhost:8983/solr
如果出现AdminUI界面 正确,否则失败
第四步:创建Admin Core
出现bug了:
修复:
[root@localhost Desktop]# cp -rf
/opt/solr-7.3.1/server/solr/configsets/_default/conf/ /opt/solr-7.3.1/server/solr/new_core/
移动配置文件到新建的new_core中
修复完成之后,重新创建new_core 则成功
3.启动之后windows浏览器通过ip:8983访问solr页面
注意:在往solr中存数据的时候那个实体类必须有一个String类型的id字段,同时加上solr下的field注解,这样在存入solr中的id就是数据库里的id值
@Field
private String id;
@Field
private String sid;
@Field
private String sname;
@Field
private Double sprice;
@Field
@DateTimeFormat(pattern="yyyy-MM-dd")
private Date stime;
4.solr在spring中需要注入两个实体类,一个是往虚拟机连接的类,一个是solr的模板类
<!-- 配置solr工厂 获取Solr的客户端对象 -->
<bean id="solrClientFactory">
高亮显示:
这里有一个solr的工具类:封装了solr的ACDI操作
public class SolrUtil {
//单例模式的懒汉式
//1.私有化的静态类属性
private static SolrUtil solrUtil;
//2.私有化的构造函数
private SolrUtil() {
}
//3.对外提供公共的访问方法
public static SolrUtil getSolrUtil(){
if(solrUtil==null){
return new SolrUtil();
}
return solrUtil;
}
private static String coreName = "new_core";
/**
* 添加集合数据
*
* @param entities
*/
public void initData(SolrTemplate solrTemplate,List entities) {
solrTemplate.setSolrCore(coreName);
solrTemplate.saveBeans(entities);
solrTemplate.commit(coreName);
}
/**
* 往solr里添加数据
* @param solrTemplate solr的模板对象
* @param obj 添加的那条对象
*/
public void insertBean(SolrTemplate solrTemplate,Object obj) {
solrTemplate.setSolrCore(coreName);
solrTemplate.saveBean(obj);
solrTemplate.commit(coreName);
}
/**
* 根据Id从solr中删除一条数据
* @param solrTemplate
* @param id 要删除的那条Id
*/
public void deleteBean(SolrTemplate solrTemplate,String id) {
solrTemplate.setSolrCore(coreName);
solrTemplate.deleteById(coreName,id);
solrTemplate.commit(coreName);
}
/**
* 从solr中根据Id批量删除数据
* @param solrTemplate
* @param ids
*/
public void deleteBeans(SolrTemplate solrTemplate,Collection ids) {
solrTemplate.setSolrCore(coreName);
solrTemplate.deleteById(coreName,ids);
solrTemplate.commit(coreName);
}
/**
* 从solr中修改数据,首先根据Id删除这条数据,在添加修改后的这条数据
* @param solrTemplate
* @param id
* @param obj
*/
public void updateBeans(SolrTemplate solrTemplate,String id,Object obj) {
solrTemplate.setSolrCore(coreName);
solrTemplate.deleteById(coreName,id);
solrTemplate.saveBean(obj);
solrTemplate.commit(coreName);
}
/**
* 查询
* 从solr里查询全部数据
* @param model 用来装载数据发向前台
* @param solrTemplate solr模板对象,用来查询处理solr数据
* @param cpage 当前页
* @param pageSize 分页单位
* @param mohu 要高亮查询的字段
* @param clazz 往solr里用来查询的对象的class对象 ,反射用
* @param fieldName 查询高亮显示的字段
* @param listdName 向前台发送集合的名称
* @throws Exception
*/
public void selectObjects(Model model, SolrTemplate solrTemplate, Integer cpage,
Integer pageSize, String mohu, Class clazz, String fieldName,String listName) throws Exception {
// 声明返回值变量
List entities = new ArrayList<>();
// 计算开始记录数
Integer startIndex = (cpage - 1) * pageSize;
// 设置操作core
solrTemplate.setSolrCore(coreName);
// 高亮查询条件
HighlightQuery query = new SimpleHighlightQuery();
// 开始记录数
query.setOffset(startIndex);
// 显示条数
query.setRows(pageSize);
// 设置条件
Criteria criteria = new Criteria(fieldName);
// 判断查询条件是否为空
if(mohu!=" && mohu!=null){
if(mohu.contains(" ")){
String[] split = mohu.split(" ");
criteria.contains(split);
}else if(mohu.contains(",")){
String[] split = mohu.split(",");
criteria.contains(split);
}else{
criteria.contains(mohu);
}
}
// 条件条件处理
query.addCriteria(criteria);
// 设置高亮的参数处理对象
HighlightOptions highlightOptions = new HighlightOptions();
highlightOptions.addField(fieldName);
highlightOptions.setSimplePrefix("<font color='red'>");
highlightOptions.setSimplePostfix("</font>");
query.setHighlightOptions(highlightOptions);
// 执行高亮查询
HighlightPage highlightPage = solrTemplate.queryForHighlightPage(query, clazz);
// 获取总页数
Integer pageCount = highlightPage.getTotalPages();
// 获取当前页数据
List<HighlightEntry> highlighted = highlightPage.getHighlighted();
// 获取高亮对象
for (HighlightEntry cc : highlighted) {
Object entity = cc.getEntity();
// 获取高亮显示的结果
List<Highlight> highlights = cc.getHighlights();
// 设置高亮显示的值
if (highlights != null && highlights.size() > 0 && highlights.get(0) != null
&& highlights.get(0).getSnipplets() != null && highlights.get(0).getSnipplets().size() > 0) {
// 获取字段名称
Field field = clazz.getDeclaredField(fieldName);
// 设置高亮处理
field.setAccessible(true);
field.set(entity, highlights.get(0).getSnipplets().get(0));
}
// 添加到集合中
entities.add(entity);
}
// 存储到model域中
model.addAttribute("cpage", cpage);
model.addAttribute("pageCount", pageCount);
model.addAttribute("mohu", mohu);
model.addAttribute(listName, entities);
}
}