版权声明:转载请标明出处~~ https://blog.csdn.net/weixin_43231076/article/details/83147245
对solr服务器进行访问:本质上就是使用了http请求和响应,当我们访问solr进行搜索时,实质上就是发送了一个http请求,如http://localhost:9080/solr/collection1/select?q=%3A&wt=json&indent=true
solr接收到这个请求后,给我们返回了响应。
对Solr服务器进行访问的方式,一共有三种:
1、使用solr官方类库--solrJ,实现原理就是使用http请求和响应,只是进行了一层封装,不需要写请求的url等参数
2、使用SpringDataSolr,实现原理是,对solr官方类库--solrJ进行了封装
3、使用httpClient,手动请求solr,手动处理响应
SpringDataSolr的使用:
1、引入相关jar包
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
2、在src/main/resources下创建 applicationContext-solr.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:solr="http://www.springframework.org/schema/data/solr"
xsi:schemaLocation="http://www.springframework.org/schema/data/solr
http://www.springframework.org/schema/data/solr/spring-solr-1.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- solr服务器地址 -->
<solr:solr-serverid="solrServer"url="http://127.0.0.1:8080/solr"/>
<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<beanid="solrTemplate"class="org.springframework.data.solr.core.SolrTemplate">
<constructor-argref="solrServer"/>
</bean>
</beans>
3、@Field注解:当一个实体类的属性使用@Field注解标识时,就表示这个属性和solr里面的一个域的name相匹配,如:
public class TbItem implements Serializable{
@Field
private Long id; //就表示这个属性对应solr中域名为id的域
@Field("item_title")
private String title; //就表示这个属性对应solr中域名为item_title的域
@Field("item_goodsid")
private Long goodsId;
@Field("item_category")
private String category;
@Field("item_brand")
private String brand;
@Field("item_seller")
private String seller;
@Field("item_price")
private BigDecimal price;
@Field("item_image")
private String image;
}
4、向solr索引库中增加&修改数据:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class TestTemplate {
@Autowired
private SolrTemplate solrTemplate;
@Test
public void testAdd(){
TbItem item = new TbItem();
item.setId(1L); //id域是必须要添加的(PS:当id相同时,再次插入时,就变成了修改操作)
item.setTitle("魅族Pro7");
item.setCategory("手机");
item.setBrand("魅族");
item.setSeller("魅族旗舰店");
item.setGoodsId(10L);
item.setPrice(new BigDecimal(1500));
//将数据添加到solr中
solrTemplate.saveBean(item);
//提交
solrTemplate.commit();
}
}
5、对solr进行按id域查询和删除:
/**
* 根据solr索引库的id查询数据
*/
@Test
public void findById(){
TbItem item = solrTemplate.getById(1L, TbItem.class);
System.out.println(item.getTitle());
}
/**
* 根据solr索引库的id删除数据
*/
@Test
public void testDelete(){
solrTemplate.deleteById("1"); //因为插入solr中的数据,id就变成string,这里也可以传入一个list,批量删除
solrTemplate.commit(); //必须要提交,否则不起作用
}
6、批量插入和分页查询
/**
* 批量插入
*/
@Test
public void testAddList(){
List<TbItem>list=new ArrayList();
for(int i=0; i<100; i++){
TbItem item=new TbItem();
item.setId(i+1L);
item.setBrand("魅族");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("魅族旗舰店");
item.setTitle("魅族Pro"+i);
item.setPrice(new BigDecimal(2000+i));
list.add(item);
}
solrTemplate.saveBeans(list); //saveBeans这个方法,这样就可以实现批量插入
solrTemplate.commit();
}
/**
* 分页查询
*/
@Test
public void testQueryPage(){
//1.构造查询对象,Query是一个接口,new一个它的实现类SimpleQuery
Query query = new SimpleQuery("*:*"); //表示查询全部数据,如果要根据域查询,就在这里传入域名
query.setOffset(20); //从第几条数据开始查询,默认是0
query.setRows(20); //查询多少条数据,默认是10
//2.查询数据,这里得到的是一页的数据
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
for (TbItem item : page) {
System.out.println(item.getTitle());
System.out.println(item.getSeller());
System.out.println(item.getBrand());
}
System.out.println("总记录数:" + page.getTotalElements());
System.out.println("总页数: " + page.getTotalPages()); //如果在上面不设置Offset和Rows的话,就会采用默认值,name总页数就会是1
}
7、条件查询和删除全部记录
/**
* 条件查询
*/
@Test
public void testPageQueryMutil(){
//1.构造查询对象,Query是一个接口,new一个它的实现类SimpleQuery
Query query = new SimpleQuery("*:*"); //表示查询全部数据,如果要根据域查询,就在这里传入域名
//添加查询条件
Criteria criteria = new Criteria("item_title").contains("5"); //查询item_title域中包含 5 这个词的数据
criteria = criteria.and("item_brand").contains("2"); //新增一个查询条件,查询item_brand 域中包含 2 这个词的数据
query.addCriteria(criteria);
//query.setOffset(20); //从第几条数据开始查询,默认是0
//query.setRows(20); //查询多少条数据,默认是10
//2.查询数据,这里得到的是一页的数据
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
for (TbItem item : page) {
System.out.println(item.getTitle());
System.out.println(item.getSeller());
System.out.println(item.getBrand());
}
System.out.println("总记录数:" + page.getTotalElements());
System.out.println("总页数: " + page.getTotalPages()); //如果在上面不设置Offset和Rows的话,就会采用默认值,name总页数就会是1
}
/**
* 删除全部记录
*/
@Test
public void testDeleteAll(){
Query query=new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}