在solr中遇到的坑 记录一下
solr下载地址 https://lucene.apache.org/solr/mirrors-solr-latest-redir.html
首先我是在阿里云部署的solr
这个位置随便放 我是放在了user/路径下
安装方法
传送门
https://blog.csdn.net/rzhzhz/article/details/11966763
之后就是配置域 这里面域分很多种大家可以看下面的文章
https://blog.csdn.net/weixin_41113108/article/details/79911736
现在开始言归正传
先来测试代码在这里插入代码片
//首先注入依赖
@Autowired
private SolrTemplate solrTemplate;
/**
* 添加 添加的时候要提交事务
*/
@Test
public void addOne(){
TbItem item = new TbItem();
item.setId(1L);
item.setBrand("华为");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("华为2号专卖店");
item.setTitle("华为Mate9");
item.setPrice(new BigDecimal(2000));
solrTemplate.saveBean(item);
solrTemplate.commit();
}
实体类
这里一定要注意id 忘记了id就会出很多问题 其他的只要和配置域差不多就好了
@Field
private Long id;
@Field(“item_title”)
private String title;
private String sellPoint;
@Field("item_price")
private BigDecimal price;
private Integer stockCount;
private Integer num;
private String barcode;
@Field("item_image")
private String image;
private Long categoryid;
private String status;
private Date createTime;
private Date updateTime;
private String itemSn;
private BigDecimal costPirce;
private BigDecimal marketPrice;
private String isDefault;
private Long goodsId;
private String sellerId;
private String cartThumbnail;
@Field("item_category")
private String category;
@Field("item_brand")
private String brand;
private String spec;
@Field("item_seller")
private String seller;
接下来配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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-server id="solrServer" url="http://39.97.106.252:8080/solr" />
<!-- solr模板,使用solr模板可对索引库进行CRUD的操作 -->
<bean id="solrTemplate" class="org.springframework.data.solr.core.SolrTemplate">
<constructor-arg ref="solrServer" />
</bean>
</beans>
里面的solr地址写自己的地址就好
id和后面测试的要保持一致哦
还要一定要记住大小写
别因为这些小问题导致报错
下面是测试的所有代码 crud 模糊查询 分页都有
package com.itcast.controller;
import com.itcast.pojo.Shop;
import com.itcast.pojo.TbItem;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext-solr.xml")
public class SolrControllerTest {
@Autowired
private SolrTemplate solrTemplate;
/**
* 添加 添加的时候要提交事务
*/
@Test
public void addOne(){
TbItem item = new TbItem();
item.setId(1L);
item.setBrand("华为");
item.setCategory("手机");
item.setGoodsId(1L);
item.setSeller("华为2号专卖店");
item.setTitle("华为Mate9");
item.setPrice(new BigDecimal(2000));
solrTemplate.saveBean(item);
solrTemplate.commit();
}
@Test
public void add(){
Shop shop = new Shop();
shop.setSid(99l);
shop.setSname("444");
shop.setPrice("华为");
shop.setSnum("手机");
solrTemplate.saveBean(shop);
solrTemplate.commit();
}
/**
* 根据id查询
*/
@Test
public void searchOne(){
TbItem tbItem = solrTemplate.getById(1L,TbItem.class);
System.out.println("从solr中获取到的id为1的品牌为:"+tbItem.getBrand());
}
/**
* 删除
*/
@Test
public void deleteOne(){
solrTemplate.deleteById("1");
solrTemplate.commit();
}
/**
* 循环插入100条数据
*/
@Test
public void testList(){
ArrayList<TbItem> list = new ArrayList<TbItem>();
for (int i=0;i<=100;i++){
TbItem tbItem = new TbItem();
tbItem.setId(i+1L);
tbItem.setBrand("华为");
tbItem.setCategory("手机");
tbItem.setGoodsId(1L);
tbItem.setSeller("华为2号专卖店");
tbItem.setTitle("华为Mate"+i);
tbItem.setPrice(new BigDecimal(2000+i));
list.add(tbItem);
}
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
/**
* 分页
*/
@Test
public void testPageList(){
SimpleQuery query = new SimpleQuery("*:*");
query.setOffset(20);
query.setRows(20);
ScoredPage<TbItem> tbItems = solrTemplate.queryForPage(query, TbItem.class);
System.out.printf("总记录数"+tbItems.getTotalElements());
List<TbItem> content = tbItems.getContent();
showList(content);
}
private void showList(List<TbItem> list){
for(TbItem item:list){
System.out.println(item.getTitle() +item.getPrice());
}
}
/**
* 条件查询
*/
@Test
public void testPageQueryMutil(){
Query query=new SimpleQuery("*:*");
Criteria criteria=new Criteria("item_title").contains("2");
criteria=criteria.and("item_title").contains("5");
query.addCriteria(criteria);
//query.setOffset(20);//开始索引(默认0)
//query.setRows(20);//每页记录数(默认10)
ScoredPage<TbItem> page = solrTemplate.queryForPage(query, TbItem.class);
System.out.println("总记录数:"+page.getTotalElements());
List<TbItem> list = page.getContent();
showList(list);
}
/**
* 删除全部元素
*/
@Test
public void testDeleteAll(){
Query query=new SimpleQuery("*:*");
solrTemplate.delete(query);
solrTemplate.commit();
}
}
当然了 最主要的pom文件也少不了
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.1717a.demo</groupId>
<artifactId>springdatasolrdemo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
<version>1.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
</dependencies>
</project>
好了 基本上这个测试代码就完事了
接下来简单的看一下效果
这里面 q是查询 其他的有一些什么显示多少数据啦什么的 这里不啰嗦了
好了 到了最关键的时候了
下面是重点大家要仔细看
- 配置solr的时候在solrhom的时候路径一定要看好 不要写错
- 在配置域的时候类型一定要一致
- id是唯一的 当然也可以改 一般都是在solrhoem的配置文件250多行左右
- 在存数据的时候 一定要记好 如果是数据库的话 最好用对象的方式存取 不要直接吧集合放进去
- 如果是springboot项目 一定要看好版本问题
- 有两种api 大家要看好
- 一般的错误都是id没有唯一 或者是域和字段有差异
还有一点 tomcat版本和solr版本也要注意要不然指不定会出一些什么样的问题 差不多目前就能想到这些了 有什么问题 欢迎大家在下面留言交流哈
|