1.solrj技术
操作solr的java客户端,他提供了增加,修改,删除,查询solr索引的java接口,solrj提供了Rest的http接口进行了封装,solrj底层是通过使用HTTPClient中的方法来完成solr的各种操作。
为了数据的同步,我们在对数据库进行对应的增删改查操作的同时,还需要对通过solrj对solr服务器上的索引库进行相同的操作。
2.搭建一个简单的springboot项目
1.java对象绑定
solrj提供了两个有用的接口,UpdateResponse接口和QueryResponse接口 。他们可以很方便的处理特定
域的对象,可以使您的应用程序更加容易被理解。solrj支持通过@Field注解隐式转换文档和任何类。
每一个实例变量都可以映射成solr对应的域
3.使用前需要引入solrj的依赖
boot 项目:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-solr</artifactId> </dependency>
SSM:
<dependency> <groupId>org.apache.solr</groupId> <artifactId>solr-solrj</artifactId> <version>8.1.1</version> </dependency>
4.修改javabean来对其进行域的绑定
对比 data-config.xml对文件进行修改
<?xml version="1.0" encoding="UTF-8" ?>
<dataConfig>
<dataSource
type="JdbcDataSource"
driver="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/solr"
user="root"
password="123456" />
<document>
<entity name="haLock" query="select * from joke" deltaQuery="select * from joke">
<field column="id" name="id" />
<field column="title" name="title1" />
<field column="info" name="info" />
</entity>
</document>
</dataConfig>
@Field("id")//该属性对应solr索引库中的id域 private Integer id;
@Field("title1") private String title;
@Field("info") private String info;
5.添加/修改索引
在solr中,索引库中都会存在一个唯一键,如果一个Document的id存在,则执行修改操作 。
如果不存在,则执行添加操作。
@RequestMapping("/add") public String addOrUpdate()//把数据添加到solr索引库 { //1.获取solr服务器核心接口 String url="http://localhost:8080/solr/core_demo"; //2.创建solr请求客户端 HttpSolrClient solrClient=new HttpSolrClient.Builder(url).build(); //创建对象 Joke joke=new Joke(); joke.setId(4021); joke.setInfo("最近,分手的情侣很多,宋仲基和宋乔慧离婚,李晨和范冰冰分手,这难道就是传说中的基李太美效应?"); joke.setAuthor("朱海涛"); joke.setTitle("鸡你太美"); //3.通过UpdateResponse接口添加 try { UpdateResponse response=solrClient.addBean(joke); //4.事务提交 solrClient.commit(); solrClient.close(); } catch (Exception e) { e.printStackTrace(); } return "添加成功"; }
6.删除索引
1.通过id删除
@RequestMapping("/deleteById")
public String delete(){
String info="删除成功";
//1.获取solr核心接口
String url="http://localhost:8080/solr/core_demo";
//2.获取httpSolrClient客户端
HttpSolrClient client=new HttpSolrClient.Builder(url).build();
Integer id=4021;
try {
//3.通过接口执行方法 方法重载有很多
UpdateResponse updateResponse= client.deleteById(String.valueOf(id));
//4.执行事务
client.commit();
client.close();
} catch (SolrServerException e) {
info="删除失败";
e.printStackTrace();
} catch (IOException e) {
info="删除失败";
e.printStackTrace();
}
return info;
}
2.通过条件批量删除UpdateResponse updateResponse=client.deleteByQuery(" ");
其中参数对应字符串对应着solr客户端查询窗口中的q字段,可以包含多个,用空格分开
UpdateResponse updateResponse1=client.deleteByQuery("price:[20 TO *]");//删除价格20以上的商品
UpdateResponse updateResponse1=client.deleteByQuery("*:*"); //清空给索引库
7.查询索引
1.一个简单的查询:查询solr索引库中的所有请求
@RequestMapping("/findAll") public List<Joke> simpleQuery() throws IOException, SolrServerException { //1.获取solr核心接口 String url="http://localhost:8080/solr/core_demo"; //2.获取httpSolrClient客户端 HttpSolrClient client=new HttpSolrClient.Builder(url).build(); //3.获取参数实例对象 注意SolrParams是抽象类,需要找它实现类 SolrParams solrParams = new SolrQuery("*:*"); QueryResponse queryResponse= client.query(solrParams); List <Joke> jokes=queryResponse.getBeans(Joke.class); try { client.commit(); client.close(); } catch (SolrServerException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return jokes; }
这时候测试这个接口,可能会出现错误 ,因为soli中域id默认类型是String类型的,你设置的实体类是id的类型如果是Integer类型时,这时和solr中域对应的类型不一致。
解决的方法,1.更改索引库中的id域的类型。2.更改实体类的类型 3. 在实体类中增加一个字段顶替其中的 id字段 进行域的绑定
2.商品的复杂查询,因为我索引库和数据库中对应的不是商品信息,这里贴图参考
如果我们设置了默认域的时候 ,需要修改q的属性
高亮查询
8.代码简化
对于
//1.获取solr核心接口 String url="http://localhost:8080/solr/core_demo"; //2.获取httpSolrClient客户端 HttpSolrClient client=new HttpSolrClient.Builder(url).build();
可以@Component 将这个类注入SpringIOC容器中。