solr
lucecn 底层也是调用的它,但是它是一个java写的,只能用java调用
但是后期呢 solr是封装了它。抵用方式是REST,可以跨语言。
solr的安装,解压包,找到war 部署到tomcat 在web.xml
中需要改库的地址
启动有管理页面
solr对于数据库的优势
第一能分词
第二查询效率高。因为数据库要用like
第三 分了数据的压力
solrj官方的客户端 也就是http的访问方式
所以我们可以用httpClient 来自己实现参数封装和解析
我们用spring-data-solr 对上面的封装
入门
引入 spring-data-solr 这个会自动依赖solr-solrj
spring-test
junit
三个依赖
applicationContext-solr.xml
<solr:solr-server id = “solrServer” url=“http://127.0.0.1:8080/solr”/> 这个标签页是一个bean
@Field(“item_tittle”) 解决的是映射关系 这个注解是solrj 包中的
private String tittle;
java中的pojo对应solr的域
新增和更新
使用solrTemplate.saveBean(new POJO());
增加和修改都是这个方法,和数据库一样,根据id 修改
也支持事务。增删改 要commit();
根据id查询
solrTemplate.getById(id,Pojo.class):
根据id删除
solrTemplate.deleteById(“1”);怎么变成String了。框架自动转换
批量插入
首先利用for new POJO id+i tittle+i
创建100条数据
因为solrTemplate自动支持存集合,就是批量
我们可以储存成一个list来
saveBeans(List beans)
测试分页
查询的都是在管理页面查询的
ScoredPage page = solrTemplate.queryForPage(query,clazz);
page对象中封装了所有的数据,有点像mybatyis的分页插件
page.getContent();得到页的集合对象
可以用for打印每一个
page.getTotalElements(); 总记录树
page.getSize() ; 页的记录数
page.getTotalPages(); 总页数
query
是一个接口。我们看一下实现类
SimpleQuery
SimpleQuery query = new SimpleQuery(":"); 这个里面传入的是表达式
query.setOffset(20) 起始索引
query.setRows(20); 行数
条件查询
Criteria criteria = new Criteria(“item_category”).contains(“手机”)
criteria.and(“item_brand”).contains(“2”);
可以把contains 换成 is 就是=
query.addCriteria(criteria)
SimpleQuery query = new SimpleQuery(":"); 这个在你没有具体条件的时候必须要写上 星:星
solrTemplate.delete(query);
solrTemplate.commit();
如何
main{
new ClassPathXmlApplicationContext(“classpath*:spring/applicationContext*.xml”);
classpath后边的星是扫描jar的意思。因为要依赖一个jar 还要扫描jar的配置文件。所以都需要读取,没有环境,不能测试。
为什么要用sku
的呢,因为更详细的
动态域的问题
@Dynamic
@Field(“item_spec_*”)
private<String ,String> specMap;
引入fastJson 的jar
然后
{} 就是Object [] 就是Array
JSON.parseObject(item.getSpec(),Map.class); 为什么是map 因为key 不确定。没有别的办法。
会保存成一条数据的多个字段。动态结合。
查找关键字
我们新建一个Moudle 然后 也要相应的接口Moudle 这个工程只要solr相关的东西
有个依赖传递的问题。
接口定义
public List search(String keyword);因为会有很多条件
public Map search(Map map);
因为很多的查询条件也是根据关键字查出来的。
SimpleQuery query = new SimpleQuery(“星:星”);
new Criteria(“item_keywords”).is(map.getkey(“keywords”);
query.addCriteria(
ScoredPage page = solrTemplate.queryForPage(criteria,pojo.class);
map.put(“rows”,page.getContent());
@reference(timeout = 5000) 可以设置dobbo的超时时间。如果我们在服务端也配置了。以客户端为主。调用时候覆盖了。dobbo默认是1000.第一次可能由于虚拟机超时。