solr的要学会的点:1. 使用springData Solr 实现增删改查 2、完成批量数据导入功能 3、完成搜索高亮显示 4. 说出搜索的业务规则和实现思路 5. 过滤查询
-
为什么会出现solr?
大多数的搜索引擎都具有搜索功能,但是搜索功能往往是巨大资源的消耗,会由于沉重的数据库加载而拖垮你应用的性能。
这也就出了转移负载到外部的服务器的注意, 然而 solr 就是一个流行的开源的搜索服务器。solr可以和hadoop一起使用,hadoop 处理大量的数据,solr 从这么多数据中找到所需的数据,
,不仅是搜索,solr 也可以达到存储的目的,是一个非关系型数据存储和处理技术。 -
solr 系统的环境搭建:
1. 导坐标。 2. 引入相关依赖。 3. 添加web.xml 4. -
在项目中怎么是使用的solr?
因为搜索并发压力非常大,我们根据面向服务分布式拆分规格,我们把搜索系统拆分出来一个独立的项目,有利于项目并发能力的提升。 -
solr 中的域 就相当于 数据库中的表数据,用于存储用户数据。、
域分类: 1. 一般域:对应数据库中的一般字段。、
2. 复制域:把一个或者几个域中的数据复制到另一个域中。 就比如说搜索“手机”。搜到了好多页的关于手机的商品,但是有的商品标题titile 中并没有手机这两个字,
是因为,手机两个字存在于广告、详情域中,也就是这些域都复制到了 一个域中,而搜索的就是这个被复制到好多个域的 域中的内容。
3. 动态域:就是可以动态的扩充字段。 比如手机有内存、尺寸两个属性, 然而衣服只有一个尺寸的属性, 所以会用到动态域。我们在项目中的规格中用到了动态域。
域怎么配去哪里配呢?索引库/conf/schema.xml 中配置。
域的常用属性:name、type、indexed、stored、required -
springDataSolr
1. 为什么会出现SpringDataSOlr? 为了将 solr 应用集成到 Spring 中。
2. 怎么使用SpringDataSolr? 1. 导入依赖spring-data-solr 2. 创建application-solr.xml(1. 里面配置solr 服务器地址。2. solr 模板,通过模板对索引库进行增删改查。)
2. @Field 注解的使用: 如果代码中的属性名称和 solr配置文件中域的名称不一样,需要使用@Field 指定域名称。
3. 增加solrTemplate .saveBean(item)
4. 提交solrTemplate .commit();
5. 按主键查询solrTemplate.getById(1,Tbitem.class)。
6. 按主键删除solrTemplate.deleteById(“1”);
7. 分页查询 Query query = new SimpleQuery();
query.setoffset(20)//开始索引(默认0)
query.setRows(20)//每页记录数(默认10)
ScoredPage page = solrTemplate.queryForPage(query,Tbitem.class)
8. 条件查询: Query query = new SimpleQuery();
Criteria criteria = new cirteria(“item_title”).contains(“2”);
criteria = criteria.and(“item_title”).ccontains(“5”)
query.addCriteria(criteria)
9. 删除全部数据 Query query = new SimpleQuery();
solrTemplate.delete(query);
3. 怎么完成对数据的批量导入功能。 1. 查询商品的数据列表: 创建类solrUtil,实现对商品数据的查询。
2. 数据导入solr索引库 1. 添加solr 配置文件即 配置solr 服务器地址和solr模板。
2. 调用模板类导入solr。
3. 规格导入动态域 1. @Dynamic 注解
2. 修改SOrlUtil 类,即 引入fastJSON依赖。使用JSON.parseObject(item.getSpec())//将spec字段中的json字符串转为map。
导入商品数据代码 TbItemExample example=new TbItemExample();
Criteria criteria = example.createCriteria();
criteria.andStatusEqualTo(“1”);//已审核
List itemList = itemMapper.selectByExample(example);
System.out.println("=商品列表=");
for(TbItem item:itemList){
Map specMap= JSON.parseObject(item.getSpec());//将 spec 字段中的 json 字符
串转换为 map
item.setSpecMap(specMap);//给带注解的字段赋值
System.out.println(item.getTitle());
}
solrTemplate.saveBeans(itemList);
solrTemplate.commit()
4. 搜索 高亮显示:。 1. HighlightQuery query=new SimpleHighlightQuery();//设置高亮的域 query.setHighlightOptions(highlightOptions);//设置高亮选项
2. 测试发现html代码原样输出,是因为AngularJS为了防止攻击采取了安全机制。所以用到了 trustAsHtml 方法。$sce.trustAsHtml(data);
5. 实现思路: 1. 搜索面板的商品分类是使用 springDataSOlr 的分组查询来实现的。
2. 为了提高查询速度,我们提前把查询面板的品牌、规格数据 存放到redis中。
3. 后端的分类、品牌、规则、价格查询 要使用 过滤查询 来实现。
过滤查询代码实现思路: 1. 从参数对象中获取品牌参数 2. 判断品牌过滤参数是否为空 3. 新建criteria对象 4. querySimpleFilterQuery()
6. 排序 1. 按价格排序 a. 查出来是哪种排序 searchMap.get("sort");//ASC DESC
b. if 判断 是ASC 还是 DESC ,根据。equals(“”) 来判断。
c. if循环语句中,判断出来了是ASC 之后, 使用 sort.Direction.ASC,"item_"+sortFiled 会得到 sort。
d. 最后query.addsort(sort) 即可。