solr技术简介及应用场景

solr是Java开发的全文搜索引擎,独立的企业级应用搜索服务器。
它可以提高检索的速度,举个例子,我们搜索一些访问量巨大的网站,响应给我们的信息速度仍然很快(缓存技术暂且不说),如果你进入网页好几秒钟以后页面还没加载完成(自身网络原因另当别论),一定会降低你对该网站的体验度,对于消费者而言,时间成本很高。
那么这种情况下对检索的要求会很高,solr技术就是满足这种情况而存在的搜索引擎服务器,既然他是一个服务器,那一定是请求+处理+响应三步骤,首先客户通过http请求,提交数据,服务器接收到数据之后第一步是将客户端提交的数据信息进行拆分,假如你输入的是“怎样变成人见人爱的帅哥?”,那么服务器将会把 怎样、变成、人见人爱、帅哥等汉语词汇按照语法习惯进行拆分,然后根据这些词汇建立索引,在查询的时候服务器会根据这些索引来查询索引库中的信息,将它拼接成串进行查询,之后将结果响应给客户端,这就是为什么你输入“怎样变成人见人爱的帅哥” 可是你看到的响应数据都是和这些关键字相近的信息,例如:如何变成人见人爱的小帅哥、变成帅哥的条件 等等。这样一来,计算机好像更人性化了,不在是我们输入什么就单纯的返回对应信息,反而达到了举一反三的效果。很多时候,我们的查询操作并不能准确的描述清楚给计算机,这种关键字索引拼接查询的方式恰恰满足了我们的需要,让查询更加立体化,智能化。
下面我来简单说一下solr的api
我们想要访问服务器,调用其中的方法,那么我们必须引入它才可以使用,所以第一步添加依赖

<dependencies>
		<!-- 添加solrj的依赖 -->
		<dependency>
			<groupId>org.apache.solr</groupId>
			<artifactId>solr-solrj</artifactId>
			<version>4.10.4</version>
		</dependency>
		<!-- 添加junit依赖 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
		<!-- 添加日志的jar包 -->
		<dependency>
			<groupId>commons-logging</groupId>
			<artifactId>commons-logging</artifactId>
			<version>1.2</version>
		</dependency>
	</dependencies>

2.测试
我们访问该服务器,第一步肯定建立连接关系,solrj就是solr提供给我们的访问jar包,里面提供了连接对象HttpSolrServer,查询对象SolrQuery、文档对象转换对象DocumentObjectBinder、QueryResponse响应对象等等

    	1.连接HttpSolrServer server =new HttpSolrServer("solr服务器地址");
		2.SolrQuery params=new SolrQuery();封装查询条件的键值对
			2.1指定查询的关键字
				 params.set("q", "待查字段键值对");
			2.2字段的展示顺序
				params.setSort("字段名", ORDER.desc/asc);
			2.3过滤查询
				params.addFilterQuery("待查键值对");
				params.addFilterQuery("目标字段:[10  TO  20]"); 这个可以适用于商品价格的区间查询
			2.4自定查询的字段,支持多字段查询,相当于SQL语句中的select后面跟的字段名
				params.setFields("字段1,字段n");
			2.5分页查询
				params.setStart(0);
				params.setRows(3);
			2.6指定默认查询字段,这个字段指定之后,关键字查询就要写成s.setQuery("关键字"),不用加前面的q;其实这两个的效果相同
				params.set("df", "字段1","字段n");
				假如你觉得这样还不能满足你的需求,你可以把solr项目中 schema.xml文件新建一个字段,这个字段可以同时作为多个字段的集合字段,举个例子,你索引库中的字段1是商品名字,字段二是商品卖点,可是你想同时搜索这两个字段的内容,这个时候你就可以采用这种方式,很简单,只需要你在设置字段的时候新建一个字段,添加属性multiValued="true即可,表示当前字段可以同时拷贝多个字段  是多个字段的组合。
			2.7高亮效果,就是你在百度搜索Java 响应给你的数据只要是Java 都是标红色的,这就是高亮效果 当然样式可以自行设定
			  打开高亮效果+前缀后缀
  			   params.setHighlight(true);
  			   params.addHighlightField("");设置高亮显示字段,不写走默认查询字段df
  			   params.setHighlightSimplePre("</font color='red'>");
   			  params.setHighlightSimplePost("</font>");	
   		3.调用查询方法返回响应
			QueryResponse response = server.query( params);	
		4.获得查询到的文档对象集合
			SolrDocumentList r = response.getResults()
		5.文档对象的格式不是我们想要的,我们专门定义了实体类来接收,注意,接受文档对象的转换,实体类属性名上面必须+@Filed注解
			List<Product> beans = new DocumentObjectBinder().getBeans(实体类.class, r);
		6.这个集合里不包含高亮,获得高亮集合 返回的是map集合,他是通过字段id来对应查询到的信息
			Map<String, Map<String, List<String>>> htls = response.getHighlighting();
		7.遍历bean集合,这里面的数据没有高亮效果,显示高亮效果必须进行覆盖,高亮集合中的高亮数据覆盖非高亮集合中的关键字数据
			for(实体类t p:beans){
					获得id
					String id = p.getId();
					获得某个商品对应高亮数据
					Map<String, List<String>> map = htls.get(id);
					获得对应的字段高亮数据
					List<String> list = map.get("之前输入的关键字对应的字段,如果设置了默认查询字段,那么只输入这个字段的一部分作为关键字查询,因为客户在查询的时候,不知道索引库里的字段信息");
					if(list!=null&&list.size()>0){
					/如果高亮集合不为空说明有高亮数据,把高亮数据覆盖商品中的高亮字段的值
						p.set默认查询字段名(list.get(0));
					}
					
			}

这些是solr查询的基本操作,如果我们的访问量涉及到高并发,那么单机配置就不能满足客户查询的速度要求,解决并发负载压力的问题,搭建solrCloud,说白了就是一台主机搞不定,找几个帮手一块来搞,人多力量大嘛
solrCloud是基于solr+zookeeper的分布式搜索方案,它的主要思想就是通过zk作为集群的配置中心,就好像中介一样,一手托两家,对于zk,solr集群和客户请求都是它的客户端,solr里本身就集成了zk,注意,搭建solr集群的前提zk必须是集群。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值