Solr学习笔记(三)-----SpringDataSolr操作

版权声明:转载请标明出处~~ 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();
}

猜你喜欢

转载自blog.csdn.net/weixin_43231076/article/details/83147245
今日推荐