solr入门实战2 通过solrj操作 solr客户端接口的方式查询

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容器中。

项目代码:https://github.com/zhuhaitao666/solrtest.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值