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" class="org.springframework.data.solr.server.support.HttpSolrClientFactoryBean">
        <property name="url" value="http://192.168.133.131:8983/solr"/>
        <property name="timeout" value="15000"/>
        <property name="maxConnections" value="100"/>
    </bean>
   <!-- 操作solr的简化的模版对象 -->
    <bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
        <constructor-arg index="0" ref="solrClientFactory"/> 
    </bean>

高亮显示:
这里有一个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);
	}
}

 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐